procedure TForm1.DelButtonClick(Sender: TObject);
var i,n,nn:integer;
TempBox:TListBox;
TempName:TEdit;
TempNLab:TLabel;
TempPB:TBitBtn;
TempMB:TBitBtn;
TempCB:TBitBtn;
TempDB:TBitBtn;
begin
n:=TBitBtn(Sender).Tag;
TempBox:=Fboxes[n];
TempName:=Names[n];
TempNLab:=NLabs[n];
TempPB:=PlusButtons[n];
TempMB:=MinusButtons[n];
TempCB:=CleanButtons[n];
TempDB:=DelButtons[n];
nn:=Length(FBoxes);
for i:=n+1 to nn-1 do
begin
FBoxes.Left:=FBoxes[i-1].Left;
FBoxes[i-1]:=FBoxes;
FBoxes[i-1].Tag:=i-1;
Names.Left:=Names[i-1].Left;
Names[i-1]:=Names;
Names[i-1].Tag:=i-1;
NLabs.Left:=NLabs[i-1].Left;
NLabs[i-1]:=NLabs;
NLabs[i-1].Tag:=i-1;
PlusButtons.Left:=PlusButtons[i-1].Left;
PlusButtons[i-1]:=PlusButtons;
PlusButtons[i-1].Tag:=i-1;
MinusButtons.Left:=MinusButtons[i-1].Left;
MinusButtons[i-1]:=MinusButtons;
MinusButtons[i-1].Tag:=i-1;
CleanButtons.Left:=CleanButtons[i-1].Left;
CleanButtons[i-1]:=CleanButtons;
CleanButtons[i-1].Tag:=i-1;
DelButtons.Left:=DelButtons[i-1].Left;
DelButtons[i-1]:=DelButtons;
DelButtons[i-1].Tag:=i-1;
end;
TempBox.Free;
TempName.Free;
TempNLab.Free;
TempPB.Free;
TempMB.Free;
TempCB.Free;
TempDB.Free;
SetLength(FBoxes,nn-1);
SetLength(Names,nn-1);
SetLength(NLabs,nn-1);
SetLength(PlusButtons,nn-1);
SetLength(MinusButtons,nn-1);
SetLength(CleanButtons,nn-1);
SetLength(DelButtons,nn-1);
end;
Access Violation в конце процедуры.
В конце этой процедуры происходит Access Violation. Может, потому что в ней удаляется вызывающий ее объект? И как с этим бороться?
И можно в общих чертах как это выглядит все хоть...
Создаются динамические объекты, в том числе кнопки удаления, добавляются в массивы.
1. PostMessage для удаления компонента. Можно сделать несколько аналогично TFrom.Release (если не путаю в названии метода)
2. Пересмотреть архитектуру. Пусть будет, положим, менеджер наборов, который их и удаляет. (я голосую за это).
PostMessage помогло!
конечно помогло. ибо очередь сила. но и тормоз прогресса. :)