ich suche eine Möglichkeit dynamisch erzeugte Komponenten wieder freizugeben.
Aber dabei stoße ich auf einen Fehler.
Auf meinem Formular habe ich eine ScrollBox1.
Ich habe eine Stringliste, in der die Texte für meine Komponenten stehen (ca. 10 bis 20 Einträge, Stringliste wird beim Erzeugen des Formulars gefüllt).
In diese Stringliste lese ich die Unterverzeichnisse eines bestimmten Verzeichnisses ein.
Auf der Scrollbox wird für jeden Eintrag in der Stringlsite ein Label und zwei Buttons erzeugt:
Code: Alles auswählen
procedure TfrmMainForm.CreateVisualComponents;
var
counter: integer;
aButtonLaunch: TBitBtn;
aButtonDelete: TBitBtn;
aLabel: TLabel;
begin
// Gehe alle Elemente in derStringListe durch
for counter := 0 to ( MeineStringListe.Count - 1 ) do
begin
// Label für die Bezeichnung
aLabel := TLabel.Create ( ScrollBox1 );
with aLabel do
begin
Parent := ScrollBox1;
left := 10;
Top := 13 + ( counter * 35 );
Caption := MeineStringListe.Strings[counter];
end;
// Button für das Starten der Anwendung
aButtonLaunch := TBitBtn.Create ( ScrollBox1 );
with aButtonLaunch do
begin
Parent := ScrollBox1;
Left := 300;
Top := 5 + ( counter * 35 );
Tag := Counter;
Caption := 'Starte Anwendung';
OnClick := @btnStartApplicationClick;
end;
// Button für das Löschen des Verzeichnisses
aButtonDelete := TBitBtn.Create ( ScrollBox1 );
with aButtonDelete do
begin
Parent := ScrollBox1;
Left := 400;
Top := 5 + ( counter * 35 );
Tag := Counter;
Caption := 'Lösche Verzeichnis';
OnClick := @btnDeleteDirectory_Click;
end;
end;
end;
Das ist nicht mein Problem.
Wenn ich den Button zum Löschen klicke, wird das entsprechende Verzeichnis auf der Festplatte gelöscht (auch das funktioniert).
Ebenso wird der entsprechende Eintrag aus der Stringliste entfernt.
Nun muss ich aber die dynamisch erzeugten Komponenten neu generieren.
Ich dachte, es ist einfacher alle Komponenten zu löschen und die Liste neu aufzubauen (zumal ich die Funktion zum Aufbau der Liste bereits habe).
Methode zum Löschen aller Elemente, in der zu Testzwecken anstelle dem Löschen erst mal die Caption verändert wird:
Code: Alles auswählen
procedure TfrmMainForm.DeleteVisualComponents;
var
counter: integer;
Komponente: Tcontrol; // TComponent;
begin
for counter := 0 to ( ScrollBox1.ControlCount - 1 ) do // ComponentCount - 1 ) do
begin
Komponente := ScrollBox1.Controls[counter]; // Components[counter];
if Komponente is TLabel then
( Komponente as TLabel ).Caption := '--DELETE--';
if Komponente is TBitBtn then
( Komponente as TBitBtn ).Caption := '--DEL--';
end;
end;
Damit erreiche ich alle Kompoenten auf der Scrollbox.
Wenn ich anstelle der Caption zu ändern die Komponente lösche:
Code: Alles auswählen
if Komponente is TLabel then
( Komponente as TLabel ).Destroy;
if Komponente is TBitBtn then
( Komponente as TBitBtn ).Destroy;
Wenn ich anstelle "Destroy" ein "Free" verwende, erhalte ich die gleiche Exception.
Ich habe auch anstelle von TControl mal TComponent verwendet, das hat auch nicht funktioniert (daher die Kommentare oben).
Meine Fragen:
Was ist der Unterscheid zwischen Destroy und Free?
Was muss ich nehmen: TComponent oder TControl?
Was mache ich an meinem Code falsch?
Leider habe ich in Lazarus keine F1 Hilfe, sonst hätte ich schon nachgeschaut.
Danke für Eure Antworten!
Gruß
OLLI