AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi FMX Frame zur Laufzeit erstellen und Button darauf anklicken

FMX Frame zur Laufzeit erstellen und Button darauf anklicken

Offene Frage von "xbkbk"
Ein Thema von xbkbk · begonnen am 7. Jan 2022 · letzter Beitrag vom 8. Jan 2022
Antwort Antwort
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#1

FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 04:54
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:
var
  MyFrame: TFrame;
begin
  MyFrame := TBeliebigerFrame.Create(Self);
  MyFrame.Parent := Self;
  MyFrame.Align := TAlignLayout.Client;
  // MyFrame.HIERSOLLTEMEINBUTTONSEIN_ISTERABERNICHT.Onlick(self);
Damit wird zwar mein Frame angezeigt, aber ich kann keinen Button klicken.
Dann kam ich auf die Idee, eine Instanz des Frames direkt als Variable zu erstellen..
(wie folgt:)

Code:
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);
wenn ich das so ausführe bekomme ich allerdings eine Zugriffsverletzung.

Nun ist meine Frage, wie ich zur Laufzeit einen Frame erstellen und dann einen Button darauf klicken kann.

Vielen lieben Dank schonmal im voraus :)
Felix
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 06:07
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.
Heiko
  Mit Zitat antworten Zitat
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 06:18
Hallo,
schreibe als einzigen Befehl in Deine ButtonOnClick den Aufruf einer eigenen Methode.
Und diese Methode rufst Du in Deinem Oberen Beispiel auf.
Okay ja. Für einen Buttonklick gebe ich dir Recht. Da sollte man die Sache in eine externe Methode auslagern und die dann aufrufen, wobei es mir im generellen tatsächlich eher darum geht, wie man die Komponenten auf einem Frame zur Laufzeit anprechen kann, um beispielsweise den Text eines Memos zu ändern oder die Font Propertys eines Labels zu modifizieren etc. Es war also nicht speziell für den Anwendungsfall eines OnClicks für Buttons, sondern eher generell gemeint. Trotzdem danke für die Antwort. Im Falle eines Buttonklicks kann man tatsächlich ausgelagerte Methoden nutzen.

Zitat:
Wobei mir die Vorgehensweise merkwürdig vorkommt.
Ich würde Oberfläche und Code besser trennen.
Dann bräuchtest Du vielleicht gar keinen Frame.
Oberfläche und Code sind an sich getrennt, aber GUI Komponenten wie zum Beispiel den Text eines Edits würde ich gerne zur Laufzeit ändern können, weshalb ich dann auf einzelne Komponenten/Controls/Dinge innerhalb des Frames zugreifen möchte.

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)
Felix
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 06:42
Moin...

Zitat:
dass man direkt auf die Komponenten des Frames zugreifen
MyFrame := TBeliebigerFrame.Create(Self); ...ich verstehe das so:
Du mußt dir deine Form "Variable" (MyFrame) hinterlegen.
Muster:
Delphi-Quellcode:
// 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);
...und so weiter.

Geändert von haentschman ( 7. Jan 2022 um 06:45 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 10:49
Moin, ich habe mal wieder ein Problem, dessen Antwort vermutlich auf der Hand liegt, aber ich komme nicht drauf:

Code:
var
  MyFrame: TFrame;
begin
  MyFrame := TBeliebigerFrame.Create(Self);
  MyFrame.Parent := Self;
  MyFrame.Align := TAlignLayout.Client;
  // MyFrame.HIERSOLLTEMEINBUTTONSEIN_ISTERABERNICHT.Onlick(self);
Nun ist meine Frage, wie ich zur Laufzeit einen Frame erstellen und dann einen Button darauf klicken kann.
Du musst deinen Compiler mitteilen, dass du eine spezielle Frameklasse mit deinen Button meinst.
Du kannst hart casten oder in eine eigene Variable schreiben.
Delphi-Quellcode:
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;
Warum ist das so?
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().
  Mit Zitat antworten Zitat
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 10:53
Vielen Dank für die schnellen und guten Antworten. Ich setze mich heute Abend/Nacht Mal dran und werde sie ausprobieren :)
Felix
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.145 Beiträge
 
Delphi 12 Athens
 
#7

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 11:21
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:
Variable := TComponent(TKlasse.NewInstance);
Variable.Create(Besitzer);
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.

Richtig und Einfacher ist immer
Variable := TKlasse.Create(Besitzer);



Gut, es ist zwar blöd unpraktisch, dass bei ObjektVariable.Create(); keine Compilerwarnung kommt, dass man es nicht so machen "sollte",
aber das ist egal, da niemals jemand die Compilerwarnungen ließt, denn sonst wäre dir
Zitat:
[DCC Warnung] Unit3.pas(30): W1036 Variable 'myDings' ist möglicherweise nicht initialisiert worden
bestimmt aufgefallen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu ( 7. Jan 2022 um 11:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.145 Beiträge
 
Delphi 12 Athens
 
#8

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 7. Jan 2022, 11:27
Bist du dir immer sicher, dass OnClick auch etwas zugewiesen ist?
Wenn nicht, dann sollte man vorher auch ein if Assigned(DerButton.OnClick) then machen.

Und falls in dem OnClick auch noch der Sender geprüft/verwendet wird, dann muß sollte man auch das Richtige übergeben.
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)
DerButton.Click;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 8. Jan 2022, 19:10
Zitat:
Delphi-Quellcode:
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;
Hab das jetzt so umgesetzt und es hat wunderbar funktioniert. Vielen Dank
Felix
  Mit Zitat antworten Zitat
xbkbk

Registriert seit: 9. Jul 2012
Ort: 37083 Göttingen
61 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: FMX Frame zur Laufzeit erstellen und Button darauf anklicken

  Alt 8. Jan 2022, 19:13
Bist du dir immer sicher, dass OnClick auch etwas zugewiesen ist?
Ja, der Button, den ich aufrufen will hat definitiv immer ein OnClick.
Aber danke für den Hinweis. Falls es mal nicht ganz sicher ist werde ich auf jeden Fall eine
Code:
Assigned
Prüfung machen.
Felix
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 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