Autor Beitrag
Weide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Di 04.05.04 18:36 
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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 04.05.04 18:54 
Wenn du als Owner deine Form angegeben hast, musst du dich um nichts kümmern.
Weide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Di 04.05.04 19:51 
Hallo Luckie,

ich hab's folgendermaßen gemacht:

ausblenden volle Höhe 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:

ausblenden 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 user profile iconMotzi: Code- durch Delphi-Tags ersetzt.
Weide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: 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?

ausblenden Quelltext
1:
Label2.Name := 'BlaBla'+Stringvariable					


Gruß Weide
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: 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.

ausblenden 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  // Gebe alle vorherigen erstellten Steuerelemente wieder frei
  FormDialog.Components.Clear;

  // Erstelle neue Steuerelemente
  ErstelleEdits(TLabel, '1'1010 10020);
  ErstelleEdits(TEdit, '1'1030 10020);
  ErstelleEdits(TCombobox, '1'6030 10020);


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  iLoop : Integer;
  Ctrl  : TComponent;
begin
  for iLoop := 0 to (FormDialog.ComponentCount - 1do 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