Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите отчаявшемуся, ДОЛБАНЫЙ КОМПОНЕНТ ! 
:(
    Опции темы
decoder
  Дата 5.7.2004, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: нет
Всего: -1



Написал етот код ещё неделю назад и всю ету неделю пытаюсь заставить его работать: при компиляции он послушно суётся в Сэмплс, но после перетаскивания его на форму появляются подряд три ошибки EAccessViolation, и не обрабатывается событие прорисовки. Пытался действовать строго по плану примера, который работал как должно.
Кому нечего делать и хочеться поразмять мозги - пожалуйста, подскажите, что здесь не так adv/help.gif?

Код

unit OrgPole;

interface

uses
 SysUtils, Windows, Messages, Classes, Graphics, Controls,
 ExtCtrls;

type
 TKletka = record
   Place: Smallint;
   Color: TColor;
 end;

 TOrgPole = class(TGraphicControl)
 private
   Timer: TTimer;
   {количество клеток по горизонтали-вертикали}
   nkl: Byte;
   {количество цветов}
   ncol: Byte;
   {ширина-высота одной клетки}
   wkl: Smallint;
   {одномерный массив всех клеток, содержащий цвета}
   kl: array of Byte;
   {массив, содержащий индексы клеток, чьи цвета не равны FBGColor}
   ukl: array of Smallint;
   {количество клеток, чьи цвета не равны FBGColor}
   kkl: Smallint;
   {цвет сетки}
   FCOG: TColor;
   FShowGrid: Boolean;
   FBGColor: TColor;
   FOnStepping: TNotifyEvent;
   function gettime: smallint;
   procedure setenable(const Value: Boolean);
   function getenable: Boolean;
   procedure drawgrid;
   procedure drawkl;
   function getcok(x: smallint): TKletka;
   procedure start;
   procedure setFBGColor(value: tcolor);
   procedure SetShowGrid(value: boolean);
   function ToColor(int: byte): TColor;
   procedure setnkl(value: byte);
   procedure setfcog(value: TColor);
   procedure setncol(value: byte);
   procedure clear;
   procedure settime(const Value: smallint);
 protected
   procedure paint; override;
   procedure Ticking(Sender: TObject);
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   procedure NextStep;
   property NumOfUKl: smallint read kkl;
   property Kletka[x: Smallint]: TKletka read getcok;
 published
   property Align;
   property Enabled;
   property ParentShowHint;
   property ShowHint;
   property Visible;
   property parent;
   property StepEnabled: Boolean read getenable write setenable;
   property TimeOfStep: smallint read gettime write settime;
   property OnStepping: TNotifyEvent read FOnStepping write FOnStepping;
   property NumOfKl: Byte read nkl write Setnkl;
   property NumOfCol: Byte read ncol write Setncol;
   property ColOfGrid: TColor read FCOG write SetFCOG default clwhite;
   property ShowGrid: Boolean read FShowGrid write SetShowGrid default true;
   property BGColor: TColor read FBGColor write SetFBGColor default clbtnshadow;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents('Samples', [TOrgPole]);
end;

constructor TOrgPole.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 randomize;
 nkl := 10;
 ncol := 10;
 kkl := ncol;
 fcog := clwhite;
 fshowgrid := true;
 FBGColor := clbtnshadow;
 width := 200;
 height := width;
 timer := ttimer.create(self);
 timer.Interval := 1000;
 timer.OnTimer := ticking;
 timer.Enabled := false;
end;

destructor TOrgPole.Destroy;
begin
 timer.Free;
 inherited;
end;

procedure TOrgPole.NextStep;
var
 i, j, k, a, b: smallint;
 bool: boolean;
 fkl: array of smallint;
 rkl: array of byte;
 ukl2: array of smallint;
 kkl2 :smallint;
 f: array of smallint;
begin
 Randomize;
 setlength(rkl, sqr(nkl));
 kkl2 := 0;
 for i := 0 to nkl * nkl - 1 do rkl[i] := kl[i];
 for i := 0 to kkl - 1 do
   begin
     {----------------------}
     repeat
       j := random(kkl);
       bool := true;
       for k := 0 to i - 1 do
         begin
           if f[k] = j then bool := false;
         end;
     until bool;
     setlength(f, i + 1);
     f[i] := j;
     {----------------------}
     k := 0;
     {--------северо-запад--------}
     if (ukl[j] mod nkl <> 0) and (ukl[j] > nkl - 1) then
       if (kl[ukl[j] - (nkl + 1)] <> kl[ukl[j]]) and (kl[ukl[j]- 1 - nkl] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] - (nkl + 1);
         end;
     {--------север--------}
     if (ukl[j] > nkl - 1) then
       if (kl[ukl[j] - nkl] <> kl[ukl[j]]) and (kl[ukl[j] - nkl] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] - nkl;
         end;
     {--------северо-восток--------}
     if (ukl[j] > nkl - 1) and ((ukl[j] + 1) mod nkl <> 0) then
       if (kl[ukl[j] - nkl + 1] <> kl[ukl[j]]) and (kl[ukl[j] + 1 - nkl] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] + 1 - nkl;
         end;
     {--------запад--------}
     if (ukl[j] mod nkl <> 0) then
       if (kl[ukl[j] - 1] <> kl[ukl[j]]) and (kl[ukl[j] - 1] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] - 1;
         end;
     {--------восток--------}
     if ((ukl[j] + 1) mod nkl <> 0) then
       if (kl[ukl[j] + 1] <> kl[ukl[j]]) and (kl[ukl[j] + 1] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] + 1;
         end;
     {--------юго-запад--------}
     if (ukl[j] < nkl * (nkl - 1)) and (ukl[j] mod nkl <> 0) then
       if (kl[ukl[j] - 1 + nkl] <> kl[ukl[j]]) and (kl[ukl[j] - 1 + nkl] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] - 1 + nkl;
         end;
     {--------юг--------}
     if (ukl[j] < nkl * (nkl - 1)) then
       if (kl[ukl[j] + nkl] <> kl[ukl[j]]) and (kl[ukl[j] + nkl] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] + nkl;
         end;
     {--------юго-восток--------}
     if ((ukl[j] + 1) mod nkl <> 0) and (ukl[j] < nkl * (nkl - 1)) then
       if (kl[ukl[j] + nkl + 1] <> kl[ukl[j]]) and (kl[ukl[j] + 1 + nkl] < 11) then
         begin
           k := k + 1;
           setlength(fkl, k);
           fkl[k - 1] := ukl[j] + nkl + 1;
         end;
     if k < 2 then
       begin
         rkl[ukl[j]] := 11;
         kl[ukl[j]] := 11;
       end
     else
       begin
         a := random(k);
         rkl[fkl[a]] := kl[ukl[j]];
         repeat
           b := random(k);
         until (b <> a);
         rkl[fkl[b]] := kl[ukl[j]];
         kl[ukl[j]] := 11;
         rkl[ukl[j]] := 11;
         bool := true;
         for j := 0 to kkl2 - 1 do if (ukl2[j] = fkl[a]) then bool := false;
         if bool = true then
           begin
             kkl2 := kkl2 + 1;
             setlength(ukl2, kkl2);
             ukl2[kkl2 - 1] := fkl[a];
           end;
         bool := true;
         for j := 0 to kkl2 - 1 do if (ukl2[j] = fkl[b]) then bool := false;
         if bool = true then
           begin
             kkl2 := kkl2 + 1;
             setlength(ukl2, kkl2);
             ukl2[kkl2 - 1] := fkl[b];
           end;
       end;
   end;
 for i := 0 to nkl * nkl - 1 do if rkl[i] = 11 then kl[i] := 0 else kl[i] := rkl[i];
 for i := 0 to kkl2 - 1 do ukl[i] := ukl2[i];
 kkl := kkl2;
 self.Invalidate;
end;

procedure TOrgPole.paint;
begin
 inherited paint;
 wkl := round(width / nkl);
 width := wkl * nkl + 1;
 height := width;
 clear;
 drawkl;
 drawgrid;
end;

procedure TOrgPole.setFBGColor(value: tcolor);
begin
 FBGColor := value;
 Invalidate;
end;

procedure TOrgPole.setfcog(value: TColor);
begin
 fcog := value;
 Invalidate;
end;

procedure TOrgPole.setncol(value: byte);
begin
 if not((value > 1) and (value < 11) and (value <= sqr(nkl))) then exit;
 ncol := value;
 start;
end;

procedure TOrgPole.setnkl(value: byte);
begin
 if not((value > 1) and (value < 101) and (sqr(value) >= ncol)) then exit;
 nkl := value;
 start;
end;

procedure TOrgPole.SetShowGrid(value: boolean);
begin
 fshowgrid := value;
 Invalidate;
end;

procedure TOrgPole.start;
var
 f: array of smallint;
 i, j, k: Smallint;
 bool: boolean;
begin
 if (length(kl) = sqr(nkl)) and (length(ukl) = ncol) then exit;
 setlength(kl,0);
 setlength(kl, sqr(nkl));
 setlength(ukl,0);
 setlength(ukl, ncol);
 for i := 0 to ncol - 1 do
   begin
     repeat
       j := random(sqr(nkl));
       bool := true;
       for k := 0 to i - 1 do if j = f[k] then bool := not bool;
     until bool;
     setlength(f, i + 1);
     f[i] := j;
     ukl[i] := j;
     kl[j] := i + 1;
   end;
 Invalidate;
end;

function TOrgPole.ToColor(int: byte): TColor;
begin
 case int of
   1: result := clblack;
   2: result := clgreen;
   3: result := clmaroon;
   4: result := clred;
   5: result := clwhite;
   6: result := clnavy;
   7: result := clfuchsia;
   8: result := claqua;
   9: result := clteal;
   10: result := cllime;
   else result := FBGColor;
 end;
end;

function TOrgPole.getcok(x: Smallint): TKletka;
begin
 if x <= kkl then
   begin
     result.color := tocolor(kl[ukl[x]]);
     result.place := ukl[x];
   end;
end;

procedure TOrgPole.drawgrid;
var i: smallint;
begin
 with canvas do
   begin
     if FShowGrid then Pen.Color := FCOG else Pen.Color := FBGColor;
     for i := 0 to nkl do
       begin
         moveto(i * wkl, 0);
         lineto(i * wkl, wkl * nkl + 1);
         moveto(0, i * wkl);
         lineto(wkl * nkl + 1, i * wkl);
       end;
   end;
end;

procedure TOrgPole.drawkl;
var i: smallint;
begin
 with canvas do
   begin
     for i := 0 to kkl - 1 do
       begin
         Brush.Color := tocolor(kl[ukl[i]]);
         Rectangle(ukl[i] mod nkl * wkl, ukl[i] div nkl * wkl, ukl[i] mod nkl * wkl + wkl + 1, ukl[i] div nkl * wkl + wkl + 1);
       end;
   end;
end;

procedure TOrgPole.clear;
begin
 Canvas.Pen.Color := FBGColor;
 Canvas.Brush.Color := FBGColor;
 Canvas.rectangle(0, 0, width, height);
end;

procedure TOrgPole.Ticking(Sender: TObject);
begin
 if csDesigning in ComponentState then exit;
 NextStep;
 if assigned(FOnStepping) then FOnStepping(self);
end;

function TOrgPole.getenable: Boolean;
begin
 result := timer.Enabled;
end;

function TOrgPole.gettime: smallint;
begin
 result := timer.Interval;
end;

procedure TOrgPole.setenable(const Value: Boolean);
begin
 timer.enabled := value;
end;

procedure TOrgPole.settime(const Value: smallint);
begin
 if value >= 1000 then timer.Interval := value;
end;

end.


P.S. Коментарии не писал поскольку не писал вообще, так что задачка не из лёгких, поскольку об оптимизации времени подумать у меня не было.

P.P.S. Алгоритм дурацкий и никому не нужный, используемый исключительно для утоления моей жажды делать что-нибудь бесполезное, поэтому об авторских правах упоминать не стоит.
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
dm9
Дата 5.7.2004, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



У тебя там Start нигде не вызывается фактичекски.
Динамические массивы остаются с нулевой длиной.
От каких-то начальных ошибок можно избавиться, если вместо
nkl := 10;
ncol := 10;
в constructor TOrgPole.Create(AOwner: TComponent);
написать
NumOfKl := 10;
NumOfCol := 10;

Но потом ещё что-то... В общем, я не могу за тебя отладить твой компонент, потому что даже не знаю, что он делает. Так что F8, F7, F5, F4 - и вперёд smile.gif Вообще, отладка по шагам - великое дело smile.gif
PM MAIL ICQ   Вверх
dm9
Дата 6.7.2004, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



И ещё. Ты же не сразу эти 400 строк написал, надеюсь? smile.gif Очень полезно проверять работоспособность кода после каждых 20-40-50 строк кода. В этом случае отлавдивать ошибки гораздо проще, чем в листинге на несколько килобайт.
PM MAIL ICQ   Вверх
Calypso
Дата 6.7.2004, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 30.6.2004

Репутация: нет
Всего: нет



А ты сожми весь проект rar-ом да дай на него ссылку на наше растерзание.
Вдруг, нам делать нечего smile.gif
Удачи!
PM MAIL   Вверх
decoder
Дата 6.7.2004, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: нет
Всего: -1



dm9
1. Вначале обрабатывается OnCreate, а потом идёт заполнение свойств (это делается автоматически, независимо от того есть в коде операторы присвоения свойствам значений или нет, т.е. делфи сам вызывает процедуры Setnkl, Setncol и т.д. - или меня дезинформировали hmmm.gif ) Ну а Start вызвается в Setnkl и Setncol - так что тут всё нанмально.
2. Всё делал строго по примеру(тоже где-то 400 строк), где в криэйте заполнялись не свойства, а локальные переменные, так что здесь тоже всё в порядке.
3. В том то и дело, что компонент пошагово отлаживать не возможно (по крайней мере у меня не получалось).
Calypso
Что тебе мешает скопировать текст выше в клипбоард и засунуть его себе куда-нибудь в ... модуль tounge.gif , ну а потом в dclusr.dpk, или ещё куда smile.gif .

--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
dm9
Дата 7.7.2004, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



decoder,

1. "Автоматически" - это смотря где и как. У тебя там проперть, на чтение/запись которой повешена процедура. Если ты этой проперти ничего не присваиваешь, ничего выполняться и не будет. Почитай хелп про property ... read ... write.

2. Отлаживать можно ну, например, так. Кидаешь компонент в юнит и создаёшь его динамически.
Код
var G : TMyComponent;
G := TMyComponent.Create (Self);
G.Parent := Self;
G.Top := 10;
G.Left := 10;
G.Width := 200;
G.Height := 200;

Не обязательно это самый лучший способ, но отладить так что-то можно. Я компоненты практически не делал, особо в этом не шарю...

Потом ставишь breakpoint в начало процедуры Start (F5) и видишь, что она не выполняется...
PM MAIL ICQ   Вверх
Georg4
Дата 7.7.2004, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 961
Регистрация: 2.11.2002

Репутация: 0
Всего: 10



А чего это вообще такое?
Я честно попытался понять и не понялsmile.gif



--------------------
Никто и никогда не должен решать одну проблему дважды
PM MAIL ICQ   Вверх
Girder
Дата 7.7.2004, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата
делфи сам вызывает процедуры Setnkl, Setncol
Угу... только не на этапе врезки в форму

Цитата
У тебя там Start нигде не вызывается фактичекски
Согласен.

К примеру:
Код
constructor TOrgPole.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// randomize;
nkl := 10;
ncol := 10;
kkl := ncol;
fcog := clwhite;
fshowgrid := true;
FBGColor := clbtnshadow;
width := 200;
height := width;
start;
timer := ttimer.create(self);
timer.Interval := 1000;
timer.OnTimer := ticking;
timer.Enabled := false;
end;
И... все работает, только у тебя там есть ошибка. Возникающая при StepEnabled:=true и запущенном приложении.

Удачи.

Это сообщение отредактировал(а) Girder - 7.7.2004, 11:56


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
decoder
Дата 7.7.2004, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: нет
Всего: -1



Цитата

Цитата
делфи сам вызывает процедуры Setnkl, Setncol 

Угу... только не на этапе врезки в форму
- значит меня всё-таки дезинформировали sad.gif ... тока теперь мой таймер вдруг начал сам включаться матерясь EAccessError'ами(когда прогу запускаю) butbut.gif ...
ппробуйте пжалуста у себя етот компонент "включить" - можт у меня делфи глючный... hmmm.gif
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
Girder
Дата 7.7.2004, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Ну а что ты хотел. Так делать не есть хорошо.

Посмотри на свою процедуру: NextStep
в ней ты обрашаешся к ячейки ukl[j], при этом размерность ukl=10, а j>10.

При этом если ты ограничеш изменение kkl от которой зависит j, вот так:
Код
if kkl2<11 then kkl := kkl2;
Invalidate;
end;
То работать будет не вылетая.
А если вот так:
Код
if kkl2<21 then kkl := kkl2;
Invalidate;
end;
То ошибка возникнет только при закрытии приложения.

А у тебя даже j>20.

Так что копай в этом направлении.

Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Girder
Дата 8.7.2004, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Лови
Код
procedure TOrgPole.NextStep;
var
i, j, k, a, b, j_ukl: smallint;
bool: boolean;
fkl: array of smallint;
rkl: array of byte;
ukl2: array of smallint;
kkl2 :smallint;
f: array of smallint;
begin
Randomize;
setlength(rkl, sqr(nkl));
kkl2 := 0;
for i := 0 to nkl * nkl - 1 do rkl[i] := kl[i];
for i := 0 to kkl - 1 do
  begin
    {----------------------}
    repeat
      j := random(kkl);
      bool := true;
      for k := 0 to i-1 do
        begin
          if f[k] = j then bool := false;
        end;
    until bool;
    setlength(f, i + 1);
    f[i] := j;
    {----------------------}
    k := 0;
    j_ukl:=j mod Length(ukl);
    {--------северо-запад--------}
    if (ukl[j_ukl] mod nkl <> 0) and (ukl[j_ukl] > nkl - 1) then
      if (kl[ukl[j_ukl] - (nkl + 1)] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl]- 1 - nkl] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] - (nkl + 1);
        end;
    {--------север--------}
    if (ukl[j_ukl] > nkl - 1) then
      if (kl[ukl[j_ukl] - nkl] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl] - nkl] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] - nkl;
        end;
    {--------северо-восток--------}
    if (ukl[j_ukl] > nkl - 1) and ((ukl[j_ukl] + 1) mod nkl <> 0) then
      if (kl[ukl[j_ukl] - nkl + 1] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl] + 1 - nkl] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] + 1 - nkl;
        end;
    {--------запад--------}
    if (ukl[j_ukl] mod nkl <> 0) then
      if (kl[ukl[j_ukl] - 1] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl] - 1] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] - 1;
        end;
    {--------восток--------}
    if ((ukl[j_ukl] + 1) mod nkl <> 0) then
      if (kl[ukl[j_ukl] + 1] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl] + 1] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] + 1;
        end;
    {--------юго-запад--------}
    if (ukl[j_ukl] < nkl * (nkl - 1)) and (ukl[j_ukl] mod nkl <> 0) then
      if (kl[ukl[j_ukl] - 1 + nkl] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl] - 1 + nkl] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] - 1 + nkl;
        end;
    {--------юг--------}
    if (ukl[j_ukl] < nkl * (nkl - 1)) then
      if (kl[ukl[j_ukl] + nkl] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl] + nkl] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] + nkl;
        end;
    {--------юго-восток--------}
    if ((ukl[j_ukl] + 1) mod nkl <> 0) and (ukl[j_ukl] < nkl * (nkl - 1)) then
      if (kl[ukl[j_ukl] + nkl + 1] <> kl[ukl[j_ukl]]) and (kl[ukl[j_ukl] + 1 + nkl] < 11) then
        begin
          k := k + 1;
          setlength(fkl, k);
          fkl[k - 1] := ukl[j_ukl] + nkl + 1;
        end;
    if k < 2 then
      begin
        rkl[ukl[j_ukl]] := 11;
        kl[ukl[j_ukl]] := 11;
      end
    else
      begin
        a := random(k);
        rkl[fkl[a]] := kl[ukl[j_ukl]];
        repeat
          b := random(k);
        until (b <> a);
        rkl[fkl[b]] := kl[ukl[j_ukl]];
        kl[ukl[j_ukl]] := 11;
        rkl[ukl[j_ukl]] := 11;
        bool := true;
        for j := 0 to kkl2 - 1 do if (ukl2[j] = fkl[a]) then bool := false;
        if bool = true then
          begin
            kkl2 := kkl2 + 1;
            setlength(ukl2, kkl2);
            ukl2[kkl2 - 1] := fkl[a];
          end;
        bool := true;
        for j := 0 to kkl2 - 1 do if (ukl2[j] = fkl[b]) then bool := false;
        if bool = true then
          begin
            kkl2 := kkl2 + 1;
            setlength(ukl2, kkl2);
            ukl2[kkl2 - 1] := fkl[b];
          end;
      end;
  end;
for i := 0 to nkl * nkl - 1 do if rkl[i] = 11 then kl[i] := 0 else kl[i] := rkl[i];
Setlength(ukl,Length(ukl2));
for i := 0 to kkl2 - 1 do ukl[i] := ukl2[i];
kkl := kkl2;
Invalidate;
end;

Удачи.


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
decoder
Дата 8.7.2004, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 18.5.2004
Где: Харьков(хохол, к сожалению)

Репутация: нет
Всего: -1



Girder, ты гений!.. А я дурак butbut.gif (это слёзы радости biggrin.gif ) . Дело даже не в том, что random(length(ukl)) от Random(length(ukl)) mod length(ukl) ничем не отличаеться, но в том, что я почему-то думал, что напиcал строчку setlength(ukl,length(ukl2)), чего в действительности не сделал sad.gif . Вот что значит юзер sad.gif sad.gif sad.gif .
P.S. Огромное спасибо всем за то, что не пожалели времени на разрешение этой проблемы - последствия ошибки, которая может быть допущенна лишь истинным чайником. Аминь smile.gif sad.gif .
--------------------
Молчать, я вас спрашиваю!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.