![]() |
FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Moin, ich habe mal wieder ein Problem, dessen Antwort vermutlich auf der Hand liegt, aber ich komme nicht drauf:
Ich habe zur Laufzeit einen Frame erstellt, möchte nun aber zur Laufzeit einen Button darauf drücken, finde aber keinen (zumindest nicht so wie ich es bisher versucht habe - was basierend auf dieser Erkenntnis wohl auch die falsche Vorgehensweise zu sein scheint). Was ich bisher habe ist das hier:
Code:
Damit wird zwar mein Frame angezeigt, aber ich kann keinen Button klicken.
var
MyFrame: TFrame; begin MyFrame := TBeliebigerFrame.Create(Self); MyFrame.Parent := Self; MyFrame.Align := TAlignLayout.Client; // MyFrame.HIERSOLLTEMEINBUTTONSEIN_ISTERABERNICHT.Onlick(self); Dann kam ich auf die Idee, eine Instanz des Frames direkt als Variable zu erstellen.. (wie folgt:)
Code:
wenn ich das so ausführe bekomme ich allerdings eine Zugriffsverletzung.
var
// MyFrame: TFrame; myDings: TBeliebigerFrame; begin { MyFrame := TBeliebigerFrame.Create(Self); MyFrame.Parent := Self; MyFrame.Align := TAlignLayout.Client; } myDings.Create(self); myDings.Parent := self; myDings.Align := TAlignLayout.Client; myDings.Button1.OnClick(self); Nun ist meine Frage, wie ich zur Laufzeit einen Frame erstellen und dann einen Button darauf klicken kann. Vielen lieben Dank schonmal im voraus :) |
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Hallo,
schreibe als einzigen Befehl in Deine ButtonOnClick den Aufruf einer eigenen Methode. Und diese Methode rufst Du in Deinem Oberen Beispiel auf. Wobei mir die Vorgehensweise merkwürdig vorkommt. Ich würde Oberfläche und Code besser trennen. Dann bräuchtest Du vielleicht gar keinen Frame. |
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Zitat:
Zitat:
Ja auch da ginge eine ausgelagerte Funktion, die einfach das edit.text per Parameter ändern kann, aber ich wollte halt wissen, ob es auch geht, dass man direkt auf die Komponenten des Frames zugreifen kann (oder warum man das vielleicht auch lassen sollte) |
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Moin...:P
Zitat:
Delphi-Quellcode:
...ich verstehe das so:
MyFrame := TBeliebigerFrame.Create(Self);
Du mußt dir deine Form "Variable" (MyFrame) hinterlegen. Muster:
Delphi-Quellcode:
...und so weiter. :wink:
// als privates Feld
private FMyFrame: TBeliebigerFrame; // in Liste über den Index abrufbar FFrameList: TObjectList<MyFrame>; // mit Freigabe, ohne Freigabe TList<MyFrame> mit Create(Self); ... FFrameList.Add(MyFrame); // oder über den Namen FFrameDict: TObjectDictionary<MyFrame>; // mit Freigabe, ohne Freigabe TDictionary<MyFrame> mit Create(Self); ... FFrameDict.Add('MyFrame', MyFrame); |
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Zitat:
Du kannst hart casten oder in eine eigene Variable schreiben.
Delphi-Quellcode:
Warum ist das so?
var
MyFrame: TFrame; begin MyFrame := TBeliebigerFrame.Create(Self); MyFrame.Parent := Self; MyFrame.Align := TAlignLayout.Client; if MyFrame is TBeliebigerFrame then // optionale Prüfung, wenn Erzeugung und folgender Code an getrennten Stellen liegen: begin // Beispiel mit Hard Cast TBeliebigerFrame(MyFrame).DeinButtonIstErreichbar.Onlick(self); end; Wenn du eine TSäugetier-Klasse hast und eine davon abgeleitete THund-Klasse, dann weiß die TSäugetier-Klasse noch nichts von den Methoden HebeBein() oder MachWauWau(). |
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Vielen Dank für die schnellen und guten Antworten. Ich setze mich heute Abend/Nacht Mal dran und werde sie ausprobieren :)
|
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Ja, man kann den Construktor wie eine Funktion aufrufen, aber wenn, dann muß man es auch richtig machen und die Instanz vorher natürlich erst erstellen.
Delphi-Quellcode:
Die VCL/FMX machen es z.B. so, damit Selbstreferenzen und verschachtelte Forms/Datenmoduile/Frames sich bereits während des Erstellens in den kranken globalen Variablen finden können.
Variable := TComponent(TKlasse.NewInstance);
Variable.Create(Besitzer); Richtig und Einfacher ist immer
Delphi-Quellcode:
Variable := TKlasse.Create(Besitzer);
Gut, es ist zwar blöd unpraktisch, dass bei
Delphi-Quellcode:
keine Compilerwarnung kommt, dass man es nicht so machen "sollte",
ObjektVariable.Create();
aber das ist egal, da niemals jemand die Compilerwarnungen ließt, denn sonst wäre dir Zitat:
|
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Bist du dir immer sicher, dass OnClick auch etwas zugewiesen ist?
Wenn nicht, dann sollte man vorher auch ein
Delphi-Quellcode:
machen.
if Assigned(DerButton.OnClick) then
Und falls in dem OnClick auch noch der Sender geprüft/verwendet wird, dann muß sollte man auch das Richtige übergeben.
Delphi-Quellcode:
DerButton.OnClick(DerButton);
Es gibt ja Buttons, wo nur der ModalResult gesetzt wird, um z.B. das Fenster zu schließen. Lösung: Ich will klicken, also "klicke" ich. (und rufe nicht "irgendeine" Ereignismethode auf)
Delphi-Quellcode:
DerButton.Click;
|
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Zitat:
|
AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken
Zitat:
Aber danke für den Hinweis. Falls es mal nicht ganz sicher ist werde ich auf jeden Fall eine
Code:
Prüfung machen.
Assigned
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz