Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.24;
Скачать: CL | DM;

Вниз

Проблема с динамическим созданием набора Shape-ов.   Найти похожие ветки 

 
Random bystander ©   (2003-03-11 12:41) [0]

Приветствую вас, господа.

Стоит следующая задача:
Имеется таблица, в которой хранится информация о компьютерах фирмы по этажам с привязкой к координатам на плане этажа.
Необходимо реализовать отображение позиций компьютеров на плане этажа с возможностью добавления/удаления компьютеров и перетаскивания их значков.

Идея такова:
Компьютеры отображаются динамически генерируемыми TShape.
При переключении этажа (они расположены на разных страницах PageControl) делается выборка необходимых строк из таблицы и на странице создается некоторое количество TShape, обозначающих все компьютеры.

Реализовано:
Добавление и удаление строк таблицы. Перетаскивание TShape. Запись данных в таблицу.

Симптомы:
Само по себе все работает.
При добавлении или удалении строки появляются странные симптомы - от выделения всех TShape до критической ошибки. Подозреваю, что проблема - в процедуре пересоздания набора TShape.


var Comps: array [1..20] of TShape;

procedure TCatalog.Freshen;
var i: integer;
var j: integer;
begin
for i := 1 to 20 do if Comps[i] <> nil then Comps[i].Free;
i := 1;
tbCompark.First;
//if not tbCompark.Eof then
repeat
Comps[i] := TShape.Create (Catalog);
Comps[i].Brush.Style := bsSolid;
Comps[i].Brush.Color := clSilver;
Comps[i].Pen.Style := psSolid;
Comps[i].Pen.Color := clBlack;
Comps[i].Shape := stCircle;
Comps[i].Width := 26;
Comps[i].Height := 26;
Comps[i].Left := tbComparkCoord_x.AsInteger;
Comps[i].Top := tbComparkCoord_y.AsInteger;
Comps[i].Tag := tbComparkID_Comp.AsInteger;
if SpeedButton1.Down then Comps[i].DragMode := dmManual else Comps[i].DragMode := dmAutomatic;
Comps[i].DragKind := dkDock;
Comps[i].OnEndDock := BaseShapeEndDock;
Comps[i].OnStartDock := BaseShapeStartDock;
Comps[i].OnContextPopup := BaseShapeContextPopup;
Comps[i].Parent := PageControl1.ActivePage;
Inc (i);
tbCompark.Next;
until tbCompark.Eof;
for j := i+1 to 20 do if Comps[j] <> nil then Comps[j].Free;
end;

procedure TCatalog.AddButtonClick(Sender: TObject);
var i: integer;
begin
for i := 1 to 32767 do
if not tbCompark.FindKey ([i]) then begin
tbCompark.Insert;
tbComparkID_Comp.AsInteger := i;
tbComparkCoord_X.AsInteger := 5;
tbComparkCoord_Y.AsInteger := 5;
tbComparkNetName.AsString := "User Anonymous #" + IntToStr (i);
tbComparkOfis.AsInteger := PageControl1.ActivePageIndex;
Freshen;
Exit;
end;
end;

procedure TCatalog.DeleteButtonClick(Sender: TObject);
var i:integer;
begin
tbCompark.Edit;
tbCompark.Delete;
Freshen;
end;


Хотелось сначала их все уничтожать, затем создавать заново, но не действует.

Помогите исправить положение.


 
Random bystander ©   (2003-03-12 15:13) [1]

Не дайте прозябнуть в неведении - покажите, где глюк.


 
Clickmaker ©   (2003-03-12 15:52) [2]

я бы сделал так
var Comps: TObjectList;


TCatalog.FormCreate
begin
Comps := TObjectList.Create(true);
end;

TCatalog.FormDestroy
begin
Comps.Free;
end;

procedure TCatalog.Freshen;
Comp: TShape;
begin
Comps.Clear;
tbCompark.First;
while not tbCompark.Eof do begin
Comp := TShape.Create(nil);
...
Comps.Add(Comp);
end;
end;


 
Random bystander ©   (2003-03-12 17:28) [3]

О!
Спасибо, мне полегчало...

Обидно, конечно, что сам не догадался не усложнять себе жизнь :-)


 
icWasya ©   (2003-03-12 17:32) [4]

а глюк в такой строке
написано
for i := 1 to 20 do if Comps[i] <> nil then Comps[i].Free;

надо
for i := 1 to 20 do FreeAndNil(Comps[i]);



Страницы: 1 вся ветка

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
9-76253
Dark[UA]
2002-09-30 09:25
2003.03.24
GLScene


7-76695
RimD
2003-01-30 21:34
2003.03.24
Bios адреса


1-76507
Radion
2003-03-12 14:41
2003.03.24
Как в Delphi сделать разделитель?


14-76572
Sergei
2003-03-09 10:44
2003.03.24
Сохранение настроек проекта


14-76599
MVova
2003-03-06 11:12
2003.03.24
Хочу купить модуль архивации