[Gelöst] Bidirektionalaufrufe bei Forms
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
[Gelöst] Bidirektionalaufrufe bei Forms
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.
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1647
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Bidirektionalaufrufe bei Forms
Wenn beide Units gegenseitig im implementation Teil eingebunden werden, gibt es keine zirkuläre Referenz.
Re: Bidirektionalaufrufe bei Forms
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.Ich934 hat geschrieben: Mo 26. Okt 2020, 06:34 Gibt es hier eine bessere Methode oder habe ich gar etwas übersehen?
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Bidirektionalaufrufe bei Forms
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.
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.
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: Bidirektionalaufrufe bei Forms
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.
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1647
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Bidirektionalaufrufe bei Forms
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.
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.
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: Bidirektionalaufrufe bei Forms
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- 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: Bidirektionalaufrufe bei Forms
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).
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: Bidirektionalaufrufe bei Forms
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.
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1647
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: [Gelöst] Bidirektionalaufrufe bei Forms
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.
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.
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: [Gelöst] Bidirektionalaufrufe bei Forms
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1647
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: [Gelöst] Bidirektionalaufrufe bei Forms
Ich hab mir jetzt mal FPC und Lazarus mit Debuggerinfos compilieren lassen. Die Observerunterstützung ist etwas "halbherzig" in TStringlist implementiert.