Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi 'Komponente existiert bereits' (https://www.delphipraxis.net/163698-komponente-existiert-bereits.html)

Mazen 12. Okt 2011 07:11

'Komponente existiert bereits'
 
Guten morgen :)

Ich habe ein kleines Problem mit meinen dynamisch zur Laufzeit erstellten Checkboxen. (chk_2 bis chk_15)...
Beim ersten öffnen der Form läuft es wie es soll, die checkboxen werden angezeigt, keine Fehlermeldung. Hier mein Sourcecode zum Erzeugen der Komponenten.

Schließe ich die Form dann wieder, und rufe sie ein zweites mal auf (es handelt sich hierbei nicht um die "Hauptform" sondern um eine die sich über frmMain aufrufen lässt) bekomm ich die Meldung "Komponente mit der Bezeichnung 'chk_2' existiert bereits". Die Form öffnet dann allerdings trotzdem und es sind auch alle Checkboxen da... Aber das kann ja auch irgendwie so nicht richtig sein^^

Hatt erst das Free vergessen, aber auch mit
Code:
procedure TfrmRechte.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  cbRechte.Free;
end;
funktioniert es nicht :/
cbRechte ist vom Typ TCheckBox...

Hier auch nochmal der Sourcecode wo ich die Komponenten erzeuge:

Code:
for i := 0 to dm.smtZiele.RecordCount-2 do begin
    cbRechte := TCheckBox.Create(self);
    cbRechte.Caption := dm.smtZiele.FieldByName('user').AsString;
    cbRechte.Name := 'chk_'+dm.smtZiele.FieldByName('user_id').AsString;
    cbRechte.Left := 35;
    cbRechte.Top := top;
    cbRechte.Parent := frmRechte;
    cbRechte.Show;

    top := top + 17;
    dm.smtZiele.Next;
 end;

DeddyH 12. Okt 2011 07:21

AW: 'Komponente existiert bereits'
 
cbRechte enthält ja nur die letzte erzeugte Checkbox, da die Variable ja bei jedem Schleifendurchlauf neu überschrieben wird. Da Du den Owner setzt könnte es helfen, diesen freizugeben. Alternativ kannst Du die Checkboxen aber auch in einer TObjectList bzw. TComponentList verwalten. Übrigens ist eine Namensangabe für Komponenten nicht erforderlich.

Mazen 12. Okt 2011 08:09

AW: 'Komponente existiert bereits'
 
mhh... das mit dem Owner ist mir noch nicht so ganz klar, und das mit der ObjectList auch nicht...
Bin noch relativ neu in Delphi.... ;)

Habs jetzt aber trotzdem gelöst, und zwar so:

Code:
for i := 2 to dm.smtZiele.RecordCount do
begin
  TCheckBox(FindComponent('chk_'+IntToStr(i))).Free;
end;
Mit Sicherheit nicht die schnellste/beste methode, aber es funktioniert^^

Und wieso sollte ich meinen Komponenten keine Namen geben? Dann werden sie doch einfach "CheckBox1" bis "CheckBox14" benannt oder? Mein Problem dabei ist das die Nummer am Ende nicht zwangsläufig fortlaufend ist, sondern der ID des Datensatzen in der Datenbank entspricht, und wenn da mal was rausgelöscht wird ist es eben nicht mehr praktisch die CheckBoxen dann "autoamtisch" benennen zu lassen...
Oder meintest du das gar nicht?^^

Wo ich das grade schreibe merke ich das meine Lösung da oben dann gar nicht unbedingt funktionieren kann, da ich da ja auch mit der Variable i arbeite die einfach nur hochzählt...
Das werde ich noch ändern müssen...^^

DeddyH 12. Okt 2011 08:19

AW: 'Komponente existiert bereits'
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich meinte ja nicht, dass Du dynamisch erzeugte Komponenten nicht benennen darfst, sondern nur, dass Du es nicht zwingend musst ;). Wenn Du Namen zur Identifikation benötigst ist es natürlich vollkommen in Ordnung, diese auch zuzuweisen. Bzgl. der ObjectList kann ich ja mal schnell ein Demo-Progrämmchen schreiben, dauert ein paar Minuten.

[edit] Here we go [/edit]

Mazen 12. Okt 2011 08:40

AW: 'Komponente existiert bereits'
 
Danke für deine Hilfe :)
Dann hab ich jetzt auch die ObjectList verstanden...^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz