Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Label zur Laufzeit - Parent (https://www.delphipraxis.net/157453-label-zur-laufzeit-parent.html)

delphinia 12. Jan 2011 13:41

Delphi-Version: 5

Label zur Laufzeit - Parent
 
Hallo,

ich erstelle zur Laufzeit eine GroupBox in der soll ein label

Doch wie sag ich dem Label das es in die zur Laufzeit generierten GroupBox soll?

mkinzler 12. Jan 2011 13:44

AW: Label zur Laufzeit - Parent
 
In dem du diese als Parent setzt

Deep-Sea 12. Jan 2011 13:44

AW: Label zur Laufzeit - Parent
 
Ähm, sagt deine Überschrift das nicht schon?!
Delphi-Quellcode:
MeinLabel.Parent := MeineGroupBox;

mleyen 12. Jan 2011 13:46

AW: Label zur Laufzeit - Parent
 
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var
  AGrpBx: TGroupBox;
  ALbl: TLabel;
begin

  AGrpBx := TGroupBox.Create(Self);
  with AGrpBx do
  begin
    Name := 'AGrpBx1';
    Parent := Self;
    Left := 20;
    Top := 20;
    Width := 200;
    Height := 100;
    Caption := 'GrpBx1';
    TabOrder := 0;
  end;

  ALbl := TLabel.Create(Self);
  with ALbl do
  begin
    Name := 'ALbl1';
    Parent := AGrpBx;
    Left := 10;
    Top := 20;
    Width := 15;
    Height := 10;
    Caption := 'label1';
  end;

end;

delphinia 12. Jan 2011 13:48

AW: Label zur Laufzeit - Parent
 
Ha ja das weiss ich auch aber - wie gebe ich den Namen der GroupBox an die Label? kenne den namen ja nicht da ich mehrer GroupBox erstelle!

rollstuhlfahrer 12. Jan 2011 13:49

AW: Label zur Laufzeit - Parent
 
Entweder du hast noch die Variable zur Groupbox oder du solltest der GroupBox einen Namen geben, dass du sie mit Delphi-Referenz durchsuchenFindComponent() wieder finden kannst.

Bernhard

delphinia 12. Jan 2011 13:51

AW: Label zur Laufzeit - Parent
 
Danke - ABER


Delphi-Quellcode:
Parent := (FindComponent('gb_' + IntToStr(tab.FieldAsInteger(tab.FieldIndex['pid']))) as TGroupBox);
Wäre das dann doch die Label Wird nicht angezeigt (sehe ich nicht)
Delphi-Quellcode:
          Caption := 'Nachname:';
          Top := 25;
          Left := 25;
          Parent := (FindComponent('gb_' + IntToStr(tab.FieldAsInteger(tab.FieldIndex['pid']))) as TGroupBox);

          AutoSize := True;
          Height := 13;

rollstuhlfahrer 12. Jan 2011 13:55

AW: Label zur Laufzeit - Parent
 
dann prüfe mal nach, ob du nicht zufällig das Parent auf nil setzt, heißt, dass FindComponent die gesuchte Komponente auch findet.

Bernhard

ADD: Warum setzt du AutoSize auf True, wenn du danach eh die Höhe änderst?

himitsu 12. Jan 2011 13:56

AW: Label zur Laufzeit - Parent
 
Wie/wo hast du denn die GroupBox erstellt?

FindComponent steht hier für Self.FindComponent und es wird demnach nur das gefunden, wovon Self der Owner ist.

rollstuhlfahrer 12. Jan 2011 13:59

AW: Label zur Laufzeit - Parent
 
Klar, woher soll FindComponent denn auch wissen, von welchem Objekt es die Unterobjekte durchsuchen soll. (Wenn man ihm es nicht sagen kann.)

delphinia 12. Jan 2011 14:01

AW: Label zur Laufzeit - Parent
 
scheint nicht so!

Delphi-Quellcode:
ShowMessage((FindComponent('gb_' + IntToStr(tab.FieldAsInteger(tab.FieldIndex['pid']))) as TGroupBox).Name);
Gibt ne Zugriffsverletzung..

Warum findet FindComponent die Box nicht? Die ist ja da ich sehe sie :)
Liegt das daran das die Box zur Laufzeit in eine zur Laufzeit erstellte Page (TpageControl) erstellt wird?

rollstuhlfahrer 12. Jan 2011 14:09

AW: Label zur Laufzeit - Parent
 
es geht ja nicht ums sehen. Dann prüfe nochmal, wie du auf den Namen kommst.

Eine AV scheint mir hier aber sehr komisch. Steht nicht zufällig dabei, dass das Objekt nicht nach TGroupBox gecastet werden kann? Ansonsten hast du ne Komponente erwischt, die die Eigenschaft Name nicht hat.

Bernhard

DeddyH 12. Jan 2011 14:55

AW: Label zur Laufzeit - Parent
 
Wie ist es, wenn Du DeinTabSheet.FindComponent verwendest?

himitsu 12. Jan 2011 15:10

AW: Label zur Laufzeit - Parent
 
Wenn FindComponent nichts findet, dann gibt es NIL zurück.

Delphi-Quellcode:
 Parent := (FindComponent('gb_' + IntToStr(tab.FieldAsInteger(tab.FieldIndex['pid']))) as TGroupBox);
.
Hier gab es deswegen noch kein Problem, außer daß .Parent auf NIL gesetzt wurde.

Delphi-Quellcode:
ShowMessage((FindComponent('gb_' + IntToStr(tab.FieldAsInteger(tab.FieldIndex['pid']))) as TGroupBox).Name);
.
Wärend man hier auf .Name des "nicht" gefunden Objekts zugreifen wollte, was natürlich knallt.

Ergo: FindComponent findet nichts.
- Stimmt der Name?
- Wird im richtigen Owner gesucht?

Das was man beim Erstellen der GroupBox als Owner angegeben hat, darin muß man auch mit FindComponent suchen, um Diese wiederzufinden.

himitsu 13. Jan 2011 09:35

AW: Label zur Laufzeit - Parent
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1074182)
Klar, woher soll FindComponent denn auch wissen, von welchem Objekt es die Unterobjekte durchsuchen soll. (Wenn man ihm es nicht sagen kann.)

Da ich es grad noch gesehn hab,

Wieso sollte man es diesem nicht mitgeben können?

Delphi-Referenz durchsuchenFindComponent ist eine Methode und Funktion.
Es steckt in TComponent damit auch in TForm.
Wenn man dieses nun aus einer Methode seiner Form aufruft, dann sucht es natürlich in TForm und findet somit alles, von welchem die Form der Owner ist.
Da die VCL die DFMs so läd, daß die Form von allen enthaltenen Komponenten der Owner ist, wird normalerweise auch alles gefunden, welches über die DFM automatisch erstellt wurde,
was aber nicht automatisch auf alles zutrifft, welches man manuell erstellt. :stupid:

Heißt also, wenn man das FindComponent einer anderen Komponente aufruft, dann findet man das in dieser Komponente verwaltete Zeug.

mkinzler 13. Jan 2011 09:39

AW: Label zur Laufzeit - Parent
 
Wenn man diese Kompos aber selber erzeugt, sollte man auch die Referenzen direkt ansprechen können

MacGuyver 29. Mär 2011 08:40

AW: Label zur Laufzeit - Parent
 
Moin Leute, :hi:

ich musste mich gerade mit dem Thema auseinandersetzen.

Also:
Der Owner ist die Form. Ganz wichtig. Jedes Control muss beim Create die Form übergeben bekommen. Die Form "besitzt" alle Controls, ist halt wie der König und sein Folk.

Bei dem neu erzeugten Control muss Parent auf seinen Vorfahr gesetzt werden, damit da die Verbindung für die Gui da ist.

FindComponent: NUR in der Form aufrufen. Die Funktion durchläuft die Components, die nur in der Form gesetzt sind.

FindControl: Die Funktion läuft über die Contols, die Nachfahren.
Will man über FindControls eine Komponente finden, muss man von der Form aus rekursiv alle Controls durchlaufen. Das kann man sich sparen, indem man gleich von der Form aus FindComponent aufruft.

Man kann Controls umhängen und verschieben, wie man will. In Components bleiben sie erhalten. Wird ein Control freigegeben, verschwindet der Eintrag auch aus dem Components.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.

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