[Gelöst] Bidirektionalaufrufe bei Forms

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Ich934
Lazarusforum e. V.
Beiträge: 161
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

[Gelöst] Bidirektionalaufrufe bei Forms

Beitrag von Ich934 »

Hallo,

ich habe hier zum ersten Mal das "Problem", dass ich bidirektional zwischen zwei (mehreren) Forms arbeiten muss. Wie ist hier die beste Vorgehensweise?

Form1 ruft Form2 auf. Von Form1 aus kann ich ja alles Mögliche auf Form2 machen, da ja die Eigenschaften aufrufbar sind. Form2 ist ja in den Klassen von Form1 vorhanden. Ich kann jedoch nicht Form1 bei Form2 mit aufnehmen, da ich ja sonst einen Kreisel baue, was nicht zulässig ist.

Meine Idee war jetzt, eine Hilfsunit zu bauen, welche ich in Form2 einbinde. Diese wiederum bindet Form1 ein und ruft dann die entsprechenden Funktionen/Methoden auf.

Gibt es hier eine bessere Methode oder habe ich gar etwas übersehen?

Vielen Dank.
Zuletzt geändert von Ich934 am Di 27. Okt 2020, 06:15, insgesamt 1-mal geändert.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 786
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Bidirektionalaufrufe bei Forms

Beitrag von fliegermichl »

Wenn beide Units gegenseitig im implementation Teil eingebunden werden, gibt es keine zirkuläre Referenz.

wp_xyz
Beiträge: 3519
Registriert: Fr 8. Apr 2011, 09:01

Re: Bidirektionalaufrufe bei Forms

Beitrag von wp_xyz »

Ich934 hat geschrieben:
Mo 26. Okt 2020, 06:34
Gibt es hier eine bessere Methode oder habe ich gar etwas übersehen?
Nein. Du musst die Daten von den Formularen abspalten und in eine dritte Unit auslagern, so dass jedes Formular unabhängig vom anderen wird. Wie fliegermichl schreibt, könntest du zwar auch versuchen, die jeweils andere Formularunit in die uses-Zeile des Implementation-Teils zu schreiben, aber wenn dein Programm größer wird, kann das oft nicht mehr durchgehalten werden, und dann wird es extrem schwer, die Struktur wieder so hinzubiegen, dass es der Compiler wieder akzeptiert.

braunbär
Beiträge: 363
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Bidirektionalaufrufe bei Forms

Beitrag von braunbär »

Wenn du die Anzeige sauber von der Datenverwaltung trennst, kannst du alle gemeinsam genutzten Daten in ein eigenes datenmodul auslagern, das du in beide Formular-Units einbindest.
Bei echten Zwergprojekten , bei denen du sicher bist, dass sie nicht viel größer werden werden, kannst du dir den Aufwand sparen, in dem du zumindest eines der uses in die Implementation section verlegst. Wie wp_xyz schon geschrieben hat, empfiehlt sich das aber schon bei nur ein wenig umfangreicheren Projekten wirklich nicht, da ist dann eine saubere Trennung zwinschen Daten und Anzeige und eine Auslagerung der Datendeklaration (inkl. Prüfprogramme u. dgl.) in eine eigene Unit dringend zu empfehlen.

Ich934
Lazarusforum e. V.
Beiträge: 161
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Bidirektionalaufrufe bei Forms

Beitrag von Ich934 »

Ich glaube, ich hab mich hier falsch ausgedrückt. Die Daten sind nicht mein Problem. Die liegen eh in einer extra Klasse und sind somit unabhängig. Aber wie löst ihr z. B. das Laden von diesen Daten?

Beispiel: Form1 zeigt die Daten an, Form2 stellt eine Suche bereit. Dort werden die neuen Daten ausgewählt und ich kann diese in der Datenklasse aktualisieren. Wie löse ich jetzt am besten die Aktualisierung von Form1 aus. Mir ist hier nur diese Zwischenklasse eingefallen, die ich von Form2 aus aufrufe und dann die LadeDaten-Prozedur anstartet.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 786
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Bidirektionalaufrufe bei Forms

Beitrag von fliegermichl »

Ich erstelle in solchen Fällen gerne eine spezielle Botschaft die an die Application geschickt wird. Alle Formulare, die auf dieses Ereignis reagieren müssen, haben eine entsprechende wndproc die auf diese Botschaft reagiert.

So kann form2 oder jeder beliebige andere Code die Daten verändern und sendet dann die Botschaft ohne sich weiter darum kümmern zu müssen.
Alle Formulare, die auf die Änderung reagieren müssen, werden dann automatisch informiert.

Ich934
Lazarusforum e. V.
Beiträge: 161
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Bidirektionalaufrufe bei Forms

Beitrag von Ich934 »

Hm, das an sich eine gute Idee. Aber WNDPROC ist Windows-Spezifisch oder lieg ich da falsch?
Tipp für PostgreSQL: www.pg-forum.de

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

Re: Bidirektionalaufrufe bei Forms

Beitrag von af0815 »

Die Datenklasse beinhaltet einen Observer, dann kann sich ein jedes Formular oder auch immer dort anmelden und wird je nach wunsch benachrichtigt oder auch nicht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Ich934
Lazarusforum e. V.
Beiträge: 161
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Bidirektionalaufrufe bei Forms

Beitrag von Ich934 »

Vielen Dank für die Beiträge. Das hat mir weitergeholfen.

Bei einem kleinen Projekt habe ich es jetzt dadurch gelöst, dass ich die Einbindung in den implementation Teil eingebunden habe (danke an fliegermichl).

Für ein größeres Projekt baue ich das jetzt auf einen Observer um. Das war das richtige Stichwort (danke hier auch an af0815). Zur Dokumentation hier ein Link zu einem Beispiel sollte jemand das gleiche Problem haben.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 786
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Gelöst] Bidirektionalaufrufe bei Forms

Beitrag von fliegermichl »

Das ist interessant.

Ich hab das kleine Beispiel mal compiliert. Da bekomme ich zwei mal ooChange und einmal ooFree als Operation. Ich hätte erwartet, dass auch mall ooAdd und ooDelete dabei ist und in Data steht die Stringlist. Jetzt wäre es natürlich nicht schlecht, wenn man auch herausfinden könnte welches Item sich geändert hat. Aber prinzipiell eine coole Sache.

Ich934
Lazarusforum e. V.
Beiträge: 161
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: [Gelöst] Bidirektionalaufrufe bei Forms

Beitrag von Ich934 »

Naja ist ein sehr einfaches Beispiel. Da kann man sicherlich noch mehr daraus machen. Muss mir das auch mal noch in Ruhe anschauen. Aber ein Anfang ist es schon mal...
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 786
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Gelöst] Bidirektionalaufrufe bei Forms

Beitrag von fliegermichl »

Ich hab mir jetzt mal FPC und Lazarus mit Debuggerinfos compilieren lassen. Die Observerunterstützung ist etwas "halbherzig" in TStringlist implementiert.

Antworten