Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   FMX "Unterkomponente" (https://www.delphipraxis.net/195424-fmx-unterkomponente.html)

sko1 27. Feb 2018 14:16

FMX "Unterkomponente"
 
Hallo,

ich erzeuge einen Button mit darauf liegendem Label, welches oben links in der Ecke anzeigen soll:
Delphi-Quellcode:
 
  Result := TButton.Create(GridPanelLayout1);
  Result.Align := TAlignLayout.Client;
  Result.StyledSettings := [];
  lbl:=TLabel.Create(Result);
  lbl.Parent:=Result;
  lbl.Align := TAlignLayout.Client;
  lbl.TextSettings.VertAlign:=TTextalign.Leading;
  lbl.StyledSettings := [];
  lbl.TextSettings.Font.Size:=9;
  lbl.Margins.Left:=3;
  lbl.Margins.top:=3;
das funktioniert auch, aber wenn ich dann auf das Label zugreifen möchte:

Delphi-Quellcode:
   
  lbl := TLabel(btn.Children[0]);
  lbl.Text:='x';
knallt es, bei btn.Children[1] funktioniert es wie erwartet.
btn.Childrencount ist im Debugger = 2!
Wieso, ich möchte verstehen warum das eine eingebettete Control nicht über Index = 0 zu erreichen ist!

Ciao
Stefan

himitsu 27. Feb 2018 14:19

AW: FMX "Unterkomponente"
 
Wenn du dir nicht sicher bist oder du merkst, dass da was nicht stimmt, dann
Delphi-Quellcode:
lbl := (btn.Children[0] as TLabel);


oder
Delphi-Quellcode:
ShowMessage(Children[0].ClassName); // bzw. Children[0].ClassName im Debugger ansehn
:stupid:



PS: https://community.embarcadero.com/bl...remonkey-39366
Components = Owner
Controls = Parent
Children = sonstwas

sko1 27. Feb 2018 14:30

AW: FMX "Unterkomponente"
 
Zitat:

ShowMessage(Children[0].ClassName)
danke für den Denkanstoss!

da kommt als Children[0] ein TLayout und dann als Children[1] das TLabel!

Muss ich nun in einer Schleife alle Children auf TLabel prüfen oder darf ich mit Sicherheit davon ausgehen, dass immer Children[1] hier das Label ist?

Ciao
Stefan

Der schöne Günther 27. Feb 2018 14:33

AW: FMX "Unterkomponente"
 
Zitat:

Zitat von sko1 (Beitrag 1394751)
Muss ich nun in einer Schleife alle Children auf TLabel prüfen oder darf ich mit Sicherheit davon ausgehen, dass immer Children[1] hier das Label ist?

Ich kenne mich mit FMX nicht aus, aber ich persönlich würde das nicht tun. Niemand gibt dir eine Garantie dass es auf anderen Plattformen oder zukünftigen Versionen ebenso ist. Das kann man wahrscheinlich noch nicht einmal richtig mit Unit-Tests erschlagen.

Behalte die Referenz auf das Label das zu selbst hinzugefügt hast. So kannst du immer sicher sein. Ich persönlich würde mich nicht darauf verlassen dass es immer an Stelle [1] sein wird!

himitsu 27. Feb 2018 14:43

AW: FMX "Unterkomponente"
 
Tipp: Ich hatte oben noch was hinzugefügt. :zwinker:

Zitat:

Ich persönlich würde mich nicht darauf verlassen
Darum auch der softe Cast, denn dann knallt es wenigstens an der richtigen Stelle.

jziersch 28. Feb 2018 04:56

AW: FMX "Unterkomponente"
 
Hallo,

FMX Komponenten werden oft über die Stile mit allen möglichen Zutaten gefüllt, daher muss man davon ausgehen, dass in einem Control eine Menge andere Sachen sind, je nach gewähltem Stil.

Nebenbei: Das Einfügen einer Unterkomponente klappt ganz gut auch im Designer, hier einfach das Label in der Baumansicht auf den Button ziehen. Das ist besonders praktisch bei Verwendung einer THeaders Komponente.

Grüsse,
Julian

sko1 28. Feb 2018 05:59

AW: FMX "Unterkomponente"
 
Zitat:

Behalte die Referenz auf das Label das zu selbst hinzugefügt hast
Das ist der vernünftigste Ansatz, danke!

Ciao
Stefan

Nachtrag:
Habe noch einen besseren Weg gefunden : eine eigene Ableitung von TButton welche dann um das Label erweitert wird, damit ist dann der Zugriff darauf auch abgesichert...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 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