Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Komponente freigeben
Weide - Di 04.05.04 18:36
Titel: Komponente freigeben
Hallo,
ich erzeuge zur Laufzeit einige Komponenten (z.B. Comboboxen und Edits). Nun habe ich Probleme mit der Freigabe, da die Anzahl der erzeugten Komponenten je nach Programmablauf schwankt. Wie löse ich in dem Fall die Freigabe am besten?
Vielen Dank im Voraus
Gruß Weide
Delete - Di 04.05.04 18:54
Wenn du als Owner deine Form angegeben hast, musst du dich um nichts kümmern.
Weide - Di 04.05.04 19:51
Hallo Luckie,
ich hab's folgendermaßen gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| var FormDialog: TFormDialog; MyEdit: TEdit; MyLabel: TLabel; MyCombo: TComboBox;
implementation
. . .
procedure ErstelleEdits(Name: String;Editor: String; Hoehe: Integer; Breite: Integer;Links: Integer; Oben: Integer); begin
if Editor = 'Label' then with MyLabel do begin MyLabel := TLabel.Create(FormDialog); Parent := FormDialog; Name := 'Label'+Name; Height := Hoehe; Width := Breite; Left := Links; Top := Oben; end;
. . . . |
der Aufruf erfolgt so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| ErstelleEdits('Typ1','Label',21,100,30,20); FindComponent('LabelTyp1'); Caption := 'blabla'; . . . |
Wenn ich das formular schließe und erneut öffne, meckert er ("Komponente existiert bereits")
Gruß Weide
Moderiert von
Motzi: Code- durch Delphi-Tags ersetzt.
Weide - Di 04.05.04 20:42
Hallo,
ich habe den Fehler bereits entdeckt. Er meckerte nur beim Komponententyp "Label". Geht beim Label folgender Code nicht?
Quelltext
1:
| Label2.Name := 'BlaBla'+Stringvariable |
Gruß Weide
KidPaddle - Di 04.05.04 20:56
Wann wird dein Formular freigegeben? Ich vermute garnicht, sondern es wird nur versteckt und somit belieben die Komponenten von FormDialog erhalten und Du versuchst beim zweiten Aufruf die selben Komponenten mit dem gleichen Name in das immer noch bestehende Formular einzubauen.
Delphi-Quelltext
1: 2: 3:
| with MyLabel do begin MyLabel := TLabel.Create(FormDialog); |
Das ist höchst bedenklich. Da machst ein with auf einer eventuell bestehenden Variabel und weist sie um with-Abschnitt erneut zu?
Ändere die Erstellung wie folgt ab:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure ErstelleEdits(CtrlClass : TWinControlClass; const Name: String; Links, Oben, Breite, Hoehe : Integer); begin with CtrlClass.Create(FormDialog) do begin Parent := FormDialog; Name := Classname + '_' + Name; Height := Hoehe; Width := Breite; Left := Links; Top := Oben; end; end; |
Mit dieser Funktion kannst Du alle deine Controls erstellen, ohne eine Fallunterscheidung machen zu müßen. Aufgerufen wird das mit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| FormDialog.Components.Clear;
ErstelleEdits(TLabel, '1', 10, 10 100, 20); ErstelleEdits(TEdit, '1', 10, 30 100, 20); ErstelleEdits(TCombobox, '1', 60, 30 100, 20); |
Wenn Du ein Formular schliesst, z. B. mit Close oder über die im Formular angezeigten Buttons, dann werden diese nicht freigegeben, sondern erst dann wenn Du das Formular mit FormDialog.Free entsorgst. Bitte schau in der Delphi Hilfe über OnClose - nach. Dort ist beschrieben, wie sich ein Formular verhalten soll.
Gruß
KidPaddle
Weide - Di 04.05.04 23:05
Hallo KidPaddle,
vielen Dank für dir ausführliche Antwort - ich werd's gleich soweit umsetzen. Ich find's immer wieder Klasse, was für Mühe ihr euch macht.
Allerdings taucht schon das nächste Problem auf. Ich muß natürlich die erstellten Comboboxen und Edits abfragen und würde dies am liebsten mit einem Mal beim Schließen des Formulars durchführen. Wie gesagt weiß ich aber im Prinzip gar nicht so recht, wie viele Komponenten überhaupt erzeugt wurden. Muß ich beim Erzeugen quasi einen Zähler mitlaufen lassen oder kann man das Herausfinden erzeugter Komponenten auch eleganter lösen?
Viele Grüße
Weide
KidPaddle - Mi 05.05.04 08:05
Alle Komponenten, und das ist auch sind Formulare, Labels oder Edits, haben 2 Properties, die für so was gedacht sind:
- Components - enthält alle Unterkomponente einer Komponente, als der im Create als Owner angegeben wird
- ComponentCount - die Anzahl der Unterkomponenten
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var iLoop : Integer; Ctrl : TComponent; begin for iLoop := 0 to (FormDialog.ComponentCount - 1) do begin Ctrl := FormDialog.Component[iLoop]; if (Ctrl is TEdit) then begin ........ end; end; |
Die Angabe des Owners bei der Erstellung eines Steuerelementes ist dafür da, damit man den Schuldigen für die Verwaltung angeben kann. Da der Owner sich darum kümmert, das jeder seiner untergeordneten Komponente freigegeben wird, brauchst Du die Freigabe nicht machen. Mit FormDialog.Components.Clear werden alle von dem Formular verwalteten Steuerelemente wieder freigegeben werden.
Gruß
KidPaddle
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!