[Erledigt] Properties zur Laufzeit einer unbekannten TForm hinzufügen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 1154
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Erledigt] Properties zur Laufzeit einer unbekannten TForm hinzufügen

Beitrag von charlytango »

Es geht um ein unbekanntes Formular
ich weiß zwar dass es von TForm abgeleitet wird aber ich weiß erstmal die Klasse nicht (ja, kann ich per RTTI abfragen und das klappt auch)

Nun will ich dieses Formular weiter verwenden und zum Beispiel in eine tabbed GUI einhängen. Passt alles, klappt alles.

Damit die GUI alles ausspielen kann, was sie könnte, sind Einstellungen/Properties im Formular nötig.
Kann man alles mit einem Vorgängerformular lösen -- ABER

Da hat sich im Kopf festgesetzt ob es nicht ginge, zur Laufzeit einem Formular properties beizubringen. Dann bräuchte ich kein Vorgängerformular von dem man ableiten müsste.

Code: Alles auswählen

uses
  TypInfo;

procedure TForm1.Button1Click(Sender: TObject);
var
  PropInfo: PPropInfo;
begin
  PropInfo := GetPropInfo(Self, 'NonExistentProperty');
  if PropInfo <> nil then
    ShowMessage('Property exists')
  else
    ShowMessage('Property does not exist');
    {--> hier wäre fein wenn man das NonExistentProperty dem Formular einbauen könnte}
end;
Nachdem mir die KI halluziniert hat dass das nicht geht, frage ich mal wirkliche Experten ob und wie man so etwas darstellen könnte.

Klar kann ich eine parallele Liste mit diversen Eigenschaften mitführen, aber dann bleibe ich lieber beim Vorgängerformular ;-)
Zuletzt geändert von charlytango am So 24. Aug 2025, 21:39, insgesamt 1-mal geändert.

charlytango
Beiträge: 1154
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Properties zur Laufzeit einer unbekannten TForm hinzufügen

Beitrag von charlytango »

17 Zugriffe in 2 Stunden ohne Reaktion ? ggg
Sieht nach einer harten Nuss aus 8)

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 630
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.3 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Properties zur Laufzeit einer unbekannten TForm hinzufügen

Beitrag von Niesi »

charlytango hat geschrieben: So 24. Aug 2025, 10:43 Es geht um ein unbekanntes Formular
ich weiß zwar dass es von TForm abgeleitet wird aber ich weiß erstmal die Klasse nicht (ja, kann ich per RTTI abfragen und das klappt auch)

Nun will ich dieses Formular weiter verwenden und zum Beispiel in eine tabbed GUI einhängen. Passt alles, klappt alles.

Damit die GUI alles ausspielen kann, was sie könnte, sind Einstellungen/Properties im Formular nötig.
Kann man alles mit einem Vorgängerformular lösen -- ABER

Da hat sich im Kopf festgesetzt ob es nicht ginge, zur Laufzeit einem Formular properties beizubringen. Dann bräuchte ich kein Vorgängerformular von dem man ableiten müsste.

Code: Alles auswählen

uses
  TypInfo;

procedure TForm1.Button1Click(Sender: TObject);
var
  PropInfo: PPropInfo;
begin
  PropInfo := GetPropInfo(Self, 'NonExistentProperty');
  if PropInfo <> nil then
    ShowMessage('Property exists')
  else
    ShowMessage('Property does not exist');
    {--> hier wäre fein wenn man das NonExistentProperty dem Formular einbauen könnte}
end;
Nachdem mir die KI halluziniert hat dass das nicht geht, frage ich mal wirkliche Experten ob und wie man so etwas darstellen könnte.

Klar kann ich eine parallele Liste mit diversen Eigenschaften mitführen, aber dann bleibe ich lieber beim Vorgängerformular ;-)
Ist das nicht von der Logik her schon ziemlich gewagt?

Du willst einem Dir unbekannten Formular (oder meinst Du Form?) properties hinzufügen - wenn das Formular unbekannt ist, dann weißt Du nicht, welche properties bereits vorhanden sind, richtig? Das kann also dazu führen, dass Du welche hinzufügst, die es schon gibt. Und dass es dadurch zu Problemen kommt, da Du ja nicht wissen kannst, wie das Formular die properties verarbeitet oder bearbeit.

Wie gesagt: Nur von der Logik her.

Ich mache ja auch nicht blind an einen LKW eine dritte Achse, damit die Zuladung erhöht werden kann, ohne zu wissen, wie viele Achsen vorhanden sind. Mit einer vierten Achse wird das Teil u. U. unlenkbar ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

PascalDragon
Beiträge: 979
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Properties zur Laufzeit einer unbekannten TForm hinzufügen

Beitrag von PascalDragon »

charlytango hat geschrieben: So 24. Aug 2025, 10:43 Nachdem mir die KI halluziniert hat dass das nicht geht, frage ich mal wirkliche Experten ob und wie man so etwas darstellen könnte.
Die Künstliche Inkompetenz hat in dem Fall Recht. Die RTTI ist zur Kompilierzeit festgelegt, du kannst da nicht einfach Dinge (egal ob Eigenschaften, Felder oder Methoden) zur Laufzeit hinzufügen.
FPC Compiler Entwickler

charlytango
Beiträge: 1154
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Properties zur Laufzeit einer unbekannten TForm hinzufügen

Beitrag von charlytango »

Danke für die knappe und präzise Antwort.
Dachte schon dass es nicht geht, wollte aber sicher gehen -- THX

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1671
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Properties zur Laufzeit einer unbekannten TForm hinzufügen

Beitrag von fliegermichl »

PascalDragon hat geschrieben: So 24. Aug 2025, 12:13
charlytango hat geschrieben: So 24. Aug 2025, 10:43 Nachdem mir die KI halluziniert hat dass das nicht geht, frage ich mal wirkliche Experten ob und wie man so etwas darstellen könnte.
Die Künstliche Inkompetenz hat in dem Fall Recht. Die RTTI ist zur Kompilierzeit festgelegt, du kannst da nicht einfach Dinge (egal ob Eigenschaften, Felder oder Methoden) zur Laufzeit hinzufügen.
Das ist richtig, ABER

Man kann natürlich Properties abfragen und bearbeitbar machen, die momentan noch unbekannt sind, dem Formular aber während dessen kompilierung mitgegeben wurden.
Der Objektinspektor von Lazarus zeigt ja auch Properies an, die zu dessen kompilierung unbekannt waren.

charlytango
Beiträge: 1154
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [Erledigt] Properties zur Laufzeit einer unbekannten TForm hinzufügen

Beitrag von charlytango »

Niesi hat geschrieben: So 24. Aug 2025, 12:10 Du willst einem Dir unbekannten Formular (oder meinst Du Form?) properties hinzufügen - wenn das Formular unbekannt ist, dann weißt Du nicht, welche properties bereits vorhanden sind, richtig? Das kann also dazu führen, dass Du welche hinzufügst, die es schon gibt.
ich meine ein TForm.
Und ja, ich kann natürlich abfragen ob ein Property bereits vorhanden ist (solange es published ist). Demnach würde ich ja gar keines hinzufügen das bereits existiert. Und dann kann man auch noch mit dem Namen arbeiten, der dann irgendwie ctGUI4711aus25 heißen könnte.
Aber du hast insoferne recht dass ein Restrisiko bliebe.

Etwas das ich nach einigem Forschen heraus gefunden habe ist, dass man sogar eine Eventprozedur eines unbekannten TForms triggern kann. Hat mich doch etwas überrascht.

Code: Alles auswählen

{
Check whether an OnCloseQuery event procedure exists in a form of any class.
Execute the event procedure if it exists and evaluate the result.
Otherwise, the form may be closed.}
procedure TfrmCtGUI.CallOnCloseQuery(Form: TForm; var CanClose: Boolean);
var
  PropInfo: PPropInfo;
  Method: TMethod;
  EventProc: TCloseQueryEvent;
begin
  if not Assigned(Form) then
    Exit;
  CanClose:=true;
  // RTTI verwenden, um die OnCloseQuery-Eigenschaft zu finden
  PropInfo := GetPropInfo(Form, 'OnCloseQuery');
  if PropInfo <> nil then
  begin
    // Methodenzeiger der Eventprozedur holen
    Method := GetMethodProp(Form, PropInfo);
    if Assigned(Method.Code) then
    begin
      // Methodenzeiger in den korrekten Typ casten
      EventProc := TCloseQueryEvent(Method);
      // OnCloseQuery aufrufen
      EventProc(Form, CanClose);
    end;
  end;

end; 

Antworten