nochmal Interfaces
-
charlytango
- Beiträge: 1228
- 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
nochmal Interfaces
zb in meinem Datenbankzugriffsobjekt gibt es eine Möglichkeit sich eim Hauptmenü oder als Popupmenü ein Menü erzeugen zu lassen mit etlichen Funktionen und Menüpunkten.
Die gleiche Situation habe ich für ein GUI Objekt.
Nun stört die umfangreiche Menügenerierung die ohnehin schon eingeschränkte Übersichtlichkeit und außerdem laufe ich immer wieder mal in Zirkulärreferenzen.
Die hier im Forum ampfohlene Methode mit include Dateien wäre sicher möglich, halte ich im Moment noch für nicht so elegant wie Interfaces (von denen ich bis gestern absolut keinen Tau hatte und immer hübsch einen Bogen drum machte)
Daher habe ich mich bei @m.fuchs mal bedient
viewtopic.php?p=85583#p85583
und diesen Vorschlag erweitert.
Allerdings scheitere ich an der Übergabe eines TStrings Objektes dorthin wo ich es brauche. (uMenuService line 43 - nur mal als Beispiel für spätere komplexere Datentypen).
Und in weiterer Folge auch an der Zweisung der Eventprozedur (uMain line 86)
Das Hauptziel ist die Vermeidung von Zirkulärreferenzen.
Projektbeschreibung (falls nötig):
in der Unit uDBservice.pas befindet sich die "Hauptklasse" TDBService.
Diese Klasse soll eine "Menu Item Click" Prozedur zur Verfügung stellen die als Click-Event im Hauptmenü Menüpunkte ins Hauptmenü einträgt.
In diesem Beispiel gibt es auf dem Hauptfenster (uMain.pas/TfrmMain) ein Memo, dessen Zeilen als Menüpunkte eingetragen werden sollen. Diese Zeilen sollen als TSTrings dem Objekt TDBService als property übergeben werden, das dann mittels TMenuService die Erstellung erledigt.
Alle Erstellungsaktionen sollen in TMenuService erfolgen, damit der Source des Hauptobjekte übersichtlich bleibt.
TDBService braucht also Dienste von TMenuService und TMenuService muss auf properties und Funktionen von TDBService zugreifen können um sauber arbeiten zu können.
Die gleiche Situation habe ich für ein GUI Objekt.
Nun stört die umfangreiche Menügenerierung die ohnehin schon eingeschränkte Übersichtlichkeit und außerdem laufe ich immer wieder mal in Zirkulärreferenzen.
Die hier im Forum ampfohlene Methode mit include Dateien wäre sicher möglich, halte ich im Moment noch für nicht so elegant wie Interfaces (von denen ich bis gestern absolut keinen Tau hatte und immer hübsch einen Bogen drum machte)
Daher habe ich mich bei @m.fuchs mal bedient
viewtopic.php?p=85583#p85583
und diesen Vorschlag erweitert.
Allerdings scheitere ich an der Übergabe eines TStrings Objektes dorthin wo ich es brauche. (uMenuService line 43 - nur mal als Beispiel für spätere komplexere Datentypen).
Und in weiterer Folge auch an der Zweisung der Eventprozedur (uMain line 86)
Das Hauptziel ist die Vermeidung von Zirkulärreferenzen.
Projektbeschreibung (falls nötig):
in der Unit uDBservice.pas befindet sich die "Hauptklasse" TDBService.
Diese Klasse soll eine "Menu Item Click" Prozedur zur Verfügung stellen die als Click-Event im Hauptmenü Menüpunkte ins Hauptmenü einträgt.
In diesem Beispiel gibt es auf dem Hauptfenster (uMain.pas/TfrmMain) ein Memo, dessen Zeilen als Menüpunkte eingetragen werden sollen. Diese Zeilen sollen als TSTrings dem Objekt TDBService als property übergeben werden, das dann mittels TMenuService die Erstellung erledigt.
Alle Erstellungsaktionen sollen in TMenuService erfolgen, damit der Source des Hauptobjekte übersichtlich bleibt.
TDBService braucht also Dienste von TMenuService und TMenuService muss auf properties und Funktionen von TDBService zugreifen können um sauber arbeiten zu können.
- Dateianhänge
-
project1.zip- (97.17 KiB) 51-mal heruntergeladen
- Zvoni
- Beiträge: 544
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
- CPU-Target: 64Bit
- Wohnort: BW
Re: nochmal Interfaces
Erster Punkt:
Nope
Korrekt:
EDIT: OK, jetzt bin ich verwirrt.
Ich hab in der Doku tatsächlich diese "falsche" Schreibweise gefunden (TObject statt TInterfacedObject)
Hä? Kann mal jemand das aufklären?
Code: Alles auswählen
TDBService = class(TObject, IDBService)
...
TMenuService = class(TObject, IMenuService)
Korrekt:
Code: Alles auswählen
TDBService = class(TInterfacedObject, IDBService)
....
TMenuService = class(TInterfacedObject, IMenuService)Ich hab in der Doku tatsächlich diese "falsche" Schreibweise gefunden (TObject statt TInterfacedObject)
Hä? Kann mal jemand das aufklären?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
charlytango
- Beiträge: 1228
- 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: nochmal Interfaces
Dem schließe ich mich anZvoni hat geschrieben: Fr 13. Feb 2026, 13:19 Ich hab in der Doku tatsächlich diese "falsche" Schreibweise gefunden (TObject statt TInterfacedObject)
Hä? Kann mal jemand das aufklären?
Nur zur Info:
Der Wechsel auf TInterfacedObject hat nichts bewirkt, die Access Violation ist nach wie vor da. Trotzem interessiert mich der Unterschied natürlich auch.
- Zvoni
- Beiträge: 544
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
- CPU-Target: 64Bit
- Wohnort: BW
Re: nochmal Interfaces
Also ich hab jetzt was rudimentäres zum laufen bekommen
Achtung: Konsolenprogramm
Achtung: Konsolenprogramm
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
charlytango
- Beiträge: 1228
- 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: nochmal Interfaces
hmm ... bis auf die nicht grafische Oberfläche sieht alles gleich aus? oder bin ich da falsch?
und der Access Violation ist nach wie vor da.
hmm ??
und der Access Violation ist nach wie vor da.
hmm ??
- Zvoni
- Beiträge: 544
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
- CPU-Target: 64Bit
- Wohnort: BW
Re: nochmal Interfaces
Hö?charlytango hat geschrieben: Fr 13. Feb 2026, 16:54 hmm ... bis auf die nicht grafische Oberfläche sieht alles gleich aus? oder bin ich da falsch?
und der Access Violation ist nach wie vor da.
hmm ??
Nix AV in meinem projekt so wie es ist. Läuft sauber durch.
Ich hab ein paar kleine Änderungen zu dir (die property explizit in der klasse usw)
Und ich nutze nicht die getter/setter, sondern die property
Was ich jetzt nicht gemacht habe (zeit) war dein thema mit der event-Zuweisung wobei die Fehlermeldung eigentlich deutlich ist
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
charlytango
- Beiträge: 1228
- 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: nochmal Interfaces
Ich habe mal mit einem einfachen String die Übergabe getestet und das klappt einwandfrei. Die Interface-Konstruktion scheint grundsätzlich richtig zu sein.
Der Setter scheint auch zu funktionieren, ich habe den Getter in Verdacht.
DBService.GetpMemo.
Der Setter scheint auch zu funktionieren, ich habe den Getter in Verdacht.
DBService.GetpMemo.
- Dateianhänge
-
project1.zip- (97.82 KiB) 62-mal heruntergeladen
- af0815
- Lazarusforum e. V.
- Beiträge: 7138
- 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: nochmal Interfaces
Ich habe da dein Konstrukt mit dem FMemo in TDBService in Verdacht. FMemo ist vom Typ TStrings, das heisst es ist im Hintergrund ein Zeiger. Du weisst den Zeiger wild durch das Programm zu, was ist wenn die QUelle der TStrings nicht mehr existiert, dann sind alle gespeicherten Referenzen ungültig.charlytango hat geschrieben: Fr 13. Feb 2026, 18:27 Der Setter scheint auch zu funktionieren, ich habe den Getter in Verdacht.
DBService.GetpMemo.
Es wird nicht der Inhalt übergeben !!
BTW: TString ist eine Basisklasse, wo noch sehr viel abstract ist. Daher eine davon abgeleitete Klasse nehmen. zB. TStringlist.
Ich habe die TStrings durch eine TStringList ersetzt. FMemo expizit im Create erzeugt (im destructor gefreed) und mit FMemo.Assign(AValue) den Inhalt übertragen (zuerst den alten Inhalt mit clear löschen nicht vergessen).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).