Die IDE erstellt Komponenten hierarchieen nicht korrekt, oder ich verstehe es nicht?

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1606
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Die IDE erstellt Komponenten hierarchieen nicht korrekt, oder ich verstehe es nicht?

Beitrag von corpsman »

Hallo Zusammen,

Sorry für den Blöden Titel aber mir viel nichts besseres ein.

Ich hab euch eine Demo gebaut in der 2 Groupboxes sind
Vorschau.PNG
Vorschau.PNG (18.28 KiB) 771 mal betrachtet
Links wurde die Groupbox "normal" via IDE angelegt, rechts via Code:

Code: Alles auswählen

Procedure TForm1.FormCreate(Sender: TObject);
Var
  e: TEdit;
  l: TLabel;
Begin
  (*
   * Via Code eine Groupbox erstellen
   *)
  GroupBox2 := TGroupBox.Create(self);
  GroupBox2.Name := 'GroupBox2';
  GroupBox2.Parent := self;
  GroupBox2.Top := GroupBox1.Top;
  GroupBox2.Left := label2.Left;
  GroupBox2.Width := GroupBox1.Width;
  GroupBox2.Height := GroupBox1.Height;
  e := TEdit.Create(GroupBox2);
  e.name := 'Edit2';
  e.Parent := GroupBox2;
  e.text := 'Edit2';
  e.Left := Edit1.Left;
  e.Top := Edit1.Top;
  l := TLabel.Create(GroupBox2);
  l.name := 'Label4';
  l.Parent := GroupBox2;
  l.Caption := 'Label4';
  l.Left := Label3.Left;
  l.Top := Label3.Top;
End;
Das Problem das ich nun habe, ist wenn ich via Code das Edit innerhalb der Groupbox "leeren" möchte. Dazu habe ich folgende Methode geschrieben:

Code: Alles auswählen

Procedure TForm1.ClearEdit(Const aOwner: TGroupBox);
Var
  i: Integer;
Begin
  For i := 0 To aOwner.ComponentCount - 1 Do Begin
    If aOwner.Components[i] Is TEdit Then Begin
      (aOwner.Components[i] As TEdit).Text := '';
    End;
  End;
End;
Rufe ich diesen Code mit der Via IDE erstellten Groupbox auf passiert nichts, mit der "Händisch" erstellten variante wird wie erwartet das Edit geleert.

Die Frage ist nun, ist das ein Bug oder ein Feature, und wie kriege ich es hin, das meine "ClearEdit" Methode bei beiden funktioniert ?
Dateianhänge
Components_Demo.zip
(2.37 KiB) 50-mal heruntergeladen
--
Just try it

Benutzeravatar
theo
Beiträge: 10809
Registriert: Mo 11. Sep 2006, 19:01

Re: Die IDE erstellt Komponenten hierarchieen nicht korrekt, oder ich verstehe es nicht?

Beitrag von theo »

Der "Owner" ist bei der IDE erstellten Variante das Formular (Owner <> Parent).
Mach deine "händischen" Komponenten einfach auch mit dem Formular als Owner.
Man kann dann über "Parent" ggf. noch etwas abfangen. Z.B.

Code: Alles auswählen

Procedure TForm1.ClearEdit(Const aOwner: TComponent);
Var
  i: Integer;
Begin
  For i := 0 To aOwner.ComponentCount - 1 Do Begin
    If ((aOwner.Components[i] Is TEdit) and (TControl(aOwner.Components[i]).Parent Is TGroupBox))  Then Begin
      (aOwner.Components[i] As TEdit).Text := '';
    End;
  End;
End;    

Procedure TForm1.Button1Click(Sender: TObject);
Begin
  ClearEdit(Self);
End;


wp_xyz
Beiträge: 5095
Registriert: Fr 8. Apr 2011, 09:01

Re: Die IDE erstellt Komponenten hierarchieen nicht korrekt, oder ich verstehe es nicht?

Beitrag von wp_xyz »

Oder du durchläufst die Liste der Controls des Containers:

Code: Alles auswählen

Procedure TForm1.ClearEdit(Const AParent: TGroupBox);
Var
  i: Integer;
Begin
  For i := 0 To AParent.ControlCount - 1 Do Begin
    If AParent.Controls[i] Is TEdit Then Begin
      (AParent.Controls[i] As TEdit).Text := '';
    End;
  End;
End;
Hat allerdings den Nachteil, dass das nur für die Controls gilt die die GroupBox direkt als Parent haben. Würde das Edit in einem Panel in der Groupbox liegen, würde es so nicht gefunden, und die müsstest ClearEdit rekursiv aufrufen (mit TWinControl als Typ des Parameters):

Code: Alles auswählen

Procedure TForm1.ClearEdit(Const AParent: TWinControl);
var
  i: Integer;
begin
  for i := 0 to AParent.ControlCount-1 do begin
    if AParent.Controls[i] is TEdit then
      TEdit(AParent.Controls[i]).Text := ''
    else
    if AParent.Controls[i] is TWinControl then
      ClearEdit(TWinControl(AParent.Controls[i]));
  end;
end;

Antworten