Viele Programmierer versuchen Objekte, Komponenten und Controls in Arrays zu speichern,
obwohl es viel geeignetere Datenstrukturen gibt.
Zitat:
Die Lösung über eine List ist aufgrund des restlichen Programmes leider nicht möglich
Dann solltest du das ändern!
Arrays sind low-Level Datenstrukturen.
Je anspruchsvoller die gewünschte Funktionalität eines Programms wird umso höherwertiger müssen auch die Datenstrukturen werden.
Z.B. bringt die Klasse
TComponent schon alles mit was du brauchst.
Delphi-Quellcode:
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
ShapeList : TComponent; // Liste von Shapes
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ShapeList := TComponent.Create(Self);
end;
Wichtig zu wissen: ShapeList wird automatisch freigegeben, wenn das Formular freigegeben wird.
Und ausserdem werden alle Shapes in der Liste ebenfalls automatisch freigegeben.
So kann man z.B. ein neues Shape hinzufügen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
newshape : TShape;
begin
newshape := TShape.Create(ShapeList);
newshape.Left := random(300);
newshape.Top := random(300);
newshape.Parent := Self;
end;
Um ein bestimmes Shape anhand des Tag zu finden und zu löschen:
Delphi-Quellcode:
procedure TForm1.DeleteShapeByTag(ATag:integer);
var
c : TControl;
i : integer;
begin
for i := ShapeList.ComponentCount-1 downto 0 do
begin
c := ShapeList.Components[i];
if c.Tag=ATag then
begin
// Shape löschen
c.Free;
// die ShapeList wird im Hintergrund automatisch korrigiert
// d.h. ComponentCount verringert sich um eins
end;
end;
Anstatt in dem Tag des PopupMenue die Position in der Liste zu speichern, kann man auch gleich das Shape selbst speichern.