Vererbung von Formularen

Für Fragen rund um die Ide und zum Debugger
Antworten
charlytango
Beiträge: 1105
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

Vererbung von Formularen

Beitrag von charlytango »

Bin irgendwie etwas ratlos.
Für meine Report-Aufgaben habe ich seit Jahren eine Vererbungsstruktur.
In einem Formular (nennen wir es TParent) werden alle allgemeingültigen Aufgaben und Funktionen erledigt (Report designen, Report anzeigen, Daten aufbereiten etc). Im Nachfolgerformular (nennen wir es TDescendent) werden nur die individuell für einen speziellen Report nötigen Attribute gesetzt (zb SQL-Statement, Reportnamen, etc etc)

Soweit hat das ja alles geklappt und tut es im Grunde immer noch.
Nun kam ich auf die glorreiche Idee das alles etwas zu behübschen und habe im TParent auf Actionlist umgestellt, Bitbuttons statt der Buttons genommen etc.

Wie erwartet hat sich dadurch das TDescendent Formular gewehrt, daher hab ich die alten nutzlosen Buttons entfernt und alles lief scheinbar ok. 4 Buttons taten was sie sollten und nur der Close-Button tat ... nichts.

Es sieht so aus als ob der irgendwie die Verbindung zu TParent verloren hätte.
Bei Doppelklick auf den Close Button in TDescendent (also den der aus TParent vererbt wurde) in der IDE führt mich die IDE exakt zur Close-Action im Parent.
Sie müsste also wissen was der Button tun soll. Zur Laufzeit wird die Arbeit verweigert.

(mehrfaches Cleanup and Build könnt ihr voraussetzen)

Als Proof Of Conzept hab ich ein Testprojekt beigelegt, das genau das erwartete Verhalten zeigt. Im Konzept scheine ich also richtig zu liegen, aber irgend etwas hakt

Vorschläge bitte


PS (Edit): klar könnte ich in TDescendent einen Button draufkleben und ein eigenes Close auslösen, aber da bricht der Ehrgeiz durch -- elegant wäre anders
Dateianhänge
published.zip
(96.73 KiB) 115-mal heruntergeladen

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

Re: Vererbung von Formularen

Beitrag von fliegermichl »

Also bei mir passiert exakt das, was ich erwartet habe. Beide Buttons schliessen das Fenster.
Lazarus 4.0RC2 (rev lazarus_4_0RC2-37-g6d590ab2ec) FPC 3.3.1 i386-win32-win32/win64

paweld
Beiträge: 99
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Vererbung von Formularen

Beitrag von paweld »

In Lazarus 4.99-trunk und FPC 3.2-fixes ist alles in Ordnung, d.h. beide Knöpfe schließen das Fenster.
Grüße / Pozdrawiam
paweld

charlytango
Beiträge: 1105
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: Vererbung von Formularen

Beitrag von charlytango »

Danke für den Einsatz, aber ....

Das Beispielprojekt liegt leider nur bei, um zu zeigen dass ich nicht ganz im Wald stehe und dass es in einem Beispielprojekt klaglos klappt.

In meiner Applikation klappt das bei vier von fünf Buttons ohne Probleme, aber meim Schließen-Button eben nicht.

Da ich nicht die ganze App raufladen kann und dürfte, bin ich auf eure Vermutungen angewiesen was da schief gegangen sein könnte.

Oder auch eine Idee wie ich die Vererbung irgendwie "refreshen" kann

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

Re: Vererbung von Formularen

Beitrag von Niesi »

charlytango hat geschrieben: So 20. Jul 2025, 10:18 Bin irgendwie etwas ratlos.
Für meine Report-Aufgaben habe ich seit Jahren eine Vererbungsstruktur.
In einem Formular (nennen wir es TParent) werden alle allgemeingültigen Aufgaben und Funktionen erledigt (Report designen, Report anzeigen, Daten aufbereiten etc). Im Nachfolgerformular (nennen wir es TDescendent) werden nur die individuell für einen speziellen Report nötigen Attribute gesetzt (zb SQL-Statement, Reportnamen, etc etc)

Soweit hat das ja alles geklappt und tut es im Grunde immer noch.
Nun kam ich auf die glorreiche Idee das alles etwas zu behübschen und habe im TParent auf Actionlist umgestellt, Bitbuttons statt der Buttons genommen etc.

Wie erwartet hat sich dadurch das TDescendent Formular gewehrt, daher hab ich die alten nutzlosen Buttons entfernt und alles lief scheinbar ok. 4 Buttons taten was sie sollten und nur der Close-Button tat ... nichts.

Es sieht so aus als ob der irgendwie die Verbindung zu TParent verloren hätte.
Bei Doppelklick auf den Close Button in TDescendent (also den der aus TParent vererbt wurde) in der IDE führt mich die IDE exakt zur Close-Action im Parent.
Sie müsste also wissen was der Button tun soll. Zur Laufzeit wird die Arbeit verweigert.

(mehrfaches Cleanup and Build könnt ihr voraussetzen)

Als Proof Of Conzept hab ich ein Testprojekt beigelegt, das genau das erwartete Verhalten zeigt. Im Konzept scheine ich also richtig zu liegen, aber irgend etwas hakt

Vorschläge bitte


PS (Edit): klar könnte ich in TDescendent einen Button draufkleben und ein eigenes Close auslösen, aber da bricht der Ehrgeiz durch -- elegant wäre anders

Hast Du alle "Erbstränge" durchgesehen? Ich meine damit "inherited", "override" usw. - es scheint ja so, dass Deinem Close-Button da was nicht komplett duchvererbt wurde ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

charlytango
Beiträge: 1105
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: Vererbung von Formularen

Beitrag von charlytango »

Ja habe ich.
In besagtem Button steht wie erwartet überhaupt kein Code. Alles wie es sein sollte.

Der Treppenwitz ist auch dass die anderen beiden abgeleiteten Formulare wie erwartet funktionieren.

Werde demnächst Mal ein neues Formular ableiten und man das *.lfm vergleichen. Grübel.

Gibt es in der GUI irgend eine Möglichkeit so ein abgeleitetes Formular zu "reparieren" ?

Joh
Lazarusforum e. V.
Beiträge: 313
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Vererbung von Formularen

Beitrag von Joh »

Also bei mir gab es teilweise ähnliche Probleme bei (angepaßten-) abgeleiteten Formulare.
Gefühlt würde ich sagen: in der Ereignisprozedur des abgeleiteten Formulars steht etwas drin, aber nicht der Zugriff auf das Parent.
Bei mir hat es geholfen, den Eintrag in der Ereignisprozedur zu löschen und neu anzulegen.

IMHO werden teilweise bei abgeleiteten Formularen /auch bei Datenmodulen die Einträge, die in den lfm-Dateien stehen, nicht korrekt gelöscht/aktualisiert.

Das passiert scheinbar dann, wenn man "bewußt" mehrere Fehler einbaut, wie Felder aus dem abgeleiteten Formular in das Parent-Formular übernimmt, dann die anderen abgeleiteten Formulare durchgeht.
Bei machem Formular (einem von zwei fast identischen) meckert der Kompiler nicht, sondern der Funktionszeiger zeigt ins Nirvana.

Die Ereignisprozedur im abgeleiteten Formular löschen, neu anlegen, Bestätigen, das es sich auf die inherited-Funktion bezieht und fertig.
just my two Beer

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6881
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Vererbung von Formularen

Beitrag von af0815 »

Wenn sowas bei m ir auftraucht, so sehe ich mit im abgeleiteten Formular die lfm an. Da kann es sein, das eine hängende Eventprocedure gibt. Das ist so ähnlich auch mit den Frames zur Designzeit. Einmal die lfm korr. und dann ist das Problem meistens gegessen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1105
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: Vererbung von Formularen

Beitrag von charlytango »

@Joh @af0815
So etwas in der Art hatte ich eh auf dem Schirm und wenn alle Stricke reißen leite ich einfach ein neues Formular ab. Das sind nur ein paar Zeilen Code.

Es ging mir eher darum, es auch zu verstehen und zu finden. Leider kam ich noch nicht dazu die .lfm genauer anzusehen, aber das passiert noch.

Scheinbar gibt es auch keine Funktion die so etwas repariert, denn die eingebaute scheint ja von zeit zu zeit nicht ganz korrekt zu funktionieren

Jedenfalls erstmal danke für den Input.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6881
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Vererbung von Formularen

Beitrag von af0815 »

Die lfm sollte man sich einmal generell ansehen, da gibt es ein paar Kleinigkeiten die man wissen sollte (ich aber nirgends dokumentiert gefunden habe). Am besten ein Testprojekt, einmal mit vererbten Formular einmal ohne und dann einfach nur sehen was unterschiedlich ist.

Beim vererben wirst du ähnliche Erscheinungen haben, wie bei den FRames zur Designzeit - du siehst Änderungen (am Elterformular) erst, wenn du das Formular mit der Vererbung einmal schliesst und wieder öffnest (oder das Projekt neu öffnest).

Wenn du im Kind ein Ereignis des Elternformulars überschreibst und später wieder löscht, musst du das auch in der lfm manuell ändern, weil dort das Ereignis stehen bleibt.
Aha, da hat sich ein wenig was getan, man wird bei erstellen gefragt ob man das Ereignis überschreiben will.

Löscht man das Ereignis aus dem Kind, bleibt folgendes in der lfm aber stehen
inherited Button1: TButton
OnClick = nil
end
Und genau das muss man löschen, das kann der Editor nicht (oder ich weis nicht wie)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten