nochmal Interfaces

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
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

Beitrag von charlytango »

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.
Dateianhänge
project1.zip
(97.17 KiB) 51-mal heruntergeladen

Benutzeravatar
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

Beitrag von Zvoni »

Erster Punkt:

Code: Alles auswählen

TDBService = class(TObject, IDBService)
...
TMenuService = class(TObject, IMenuService)
Nope
Korrekt:

Code: Alles auswählen

TDBService = class(TInterfacedObject, IDBService)
....
TMenuService = class(TInterfacedObject, IMenuService)
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?
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.

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

Beitrag von charlytango »

Zvoni 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?
Dem schließe ich mich an ;-)
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.

Benutzeravatar
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

Beitrag von Zvoni »

Also ich hab jetzt was rudimentäres zum laufen bekommen
Achtung: Konsolenprogramm
project1.zip
(2.81 KiB) 54-mal heruntergeladen
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.

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

Beitrag von charlytango »

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 ??

Benutzeravatar
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

Beitrag von Zvoni »

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 ??
Hö?
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.

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

Beitrag von charlytango »

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.
Dateianhänge
project1.zip
(97.82 KiB) 62-mal heruntergeladen

Benutzeravatar
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

Beitrag von af0815 »

charlytango hat geschrieben: Fr 13. Feb 2026, 18:27 Der Setter scheint auch zu funktionieren, ich habe den Getter in Verdacht.
DBService.GetpMemo.
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.
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).

Antworten