![]() |
AddObject mit einem Interface?
Hallo!
Ich habe folgendes Problem: Bei einer Combobox möchte ich ein paar Einträge hinzufügen, außerdem zu jedem Eintrag ein Objekt abspeichern. Dies mache ich mit der AddObject-Methode der Combobox, dabei übergebe ich den Typ des Interfaces, welches das Objekt implementiert. Also:
Delphi-Quellcode:
Wenn ich das Objekt hinterher wieder herausholen möchte, bekomme ich aber eine AccessViolation:
procedure Eintragen(Objekt: IMyInterface);
begin cmbTest.AddObject('Test', Objekt); end;
Delphi-Quellcode:
Ich schätze, es ist nicht sauber, ein Interface per AddObject zu hinterlegen, weil bei Interfaces der Speicher anders verwaltet wird, richtig?
var
obj: TObject; begin obj := cmbDatenbank.Items.Objects[cmbDatenbank.ItemIndex]; if Supports(obj, IMyInterface, dbcs) then <----- Hier scheppert es...! dbcs.DoSomething; end; Was kann ich denn tun? Was haltet ihr davon, wenn ich eine Klasse mache, die das Interface in einer Variablen (sozusagen eine Wrapperklasse) speichert und diese Klasse dann per AddObject in der Combobox speichere? Ich freue mich auf ein paar Tipps! Danke, Angelika |
Re: AddObject mit einem Interface?
Versuch es mal mit TObject als Typ
|
Re: AddObject mit einem Interface?
Zitat:
Du deklarierst eine neue Klasse, welche das Interface verwendet:
Delphi-Quellcode:
Dann kannst du bequem deine Objekte verwalten:
TMyClass = class(IMyInterface)
public Name: string; end;
Delphi-Quellcode:
procedure Eintragen(Objekt: TMyClass);
begin if Assigned(Objekt) then cmbTest.AddObject(Objekt.Name, Objekt); end; |
Re: AddObject mit einem Interface?
Das funktioniert doch nicht. Was soll sie denn machen, falls die Interfaces von einer anderen Klasse stammen?
Wenn du es gerne sauber hast, solltest du es so machen, wie du es selbst vorgeschlagen hast, eine Klasse mit entsprechender Membervariable. Oder du kannst manuell mit _AddRef- und _Release-Aufrufen die Referenzzählung austricksen und einfach nach TObject casten. |
Re: AddObject mit einem Interface?
Ich wundere mich immer wieder, woher die Kerle hellsehen können. :lol: Wo wird die Prozedur "Eintragen" definiert ? Wie heißt die, wo der Fehler auftaucht (Kopf fehlt) ? Dann wundert mich etwas die Kenntnis der Objects-Eigenschaft. Die ist nämlich weitgehend unbekannt. Wie sieht das konkrete TObject denn überhaupt aus ? Rest : siehe mkinzler.
|
Re: AddObject mit einem Interface?
Hallo,
das Ganze ist eigentlich ziemlich einfach (aber mit einigen Schweinereien verbunden):
Delphi-Quellcode:
procedure Eintragen(Objekt: IMyInterface);
begin cmbTest.AddObject('Test', Pointer(Objekt)); end;
Delphi-Quellcode:
Man sollte aber beachten, dass dabei die Referenzzählung den Bach runter geht.
var
Intf: IInterface; begin Intf := IInterface(Pointer(cmbDatenbank.Items.Objects[cmbDatenbank.ItemIndex]); if Supports(Intf, IMyInterface, dbcs) then dbcs.DoSomething; end; Gruß xaromz |
Re: AddObject mit einem Interface?
Der nächste Hellseher. 8) Was muss in das TInterface rein ??? Du willst doch offensichtlich irgendwelche zusätzlichen Informationen in der ComboBox haben, oder nicht ??
|
Re: AddObject mit einem Interface?
Zitat:
Schließlich erwartet AddObject auch ein TObject und kein TInterface. :gruebel: |
Re: AddObject mit einem Interface?
Hallo,
Zitat:
Gruß xaromz |
Re: AddObject mit einem Interface?
Da muss man etwas tricksen:
Delphi-Quellcode:
Würde man nicht mit AddRef eingreifen, kann es passieren, dass das Objekt auf den der Interfacezeiger verweist,
procedure Eintragen(IntPtr: IMyInterface);
begin IntPtr._AddRef; // Referenzzählung "austricksen" cmbTest.AddObject('Test', TObject(IntPtr)); end; automatisch freigegeben wird. (=> Access Violation) Beim löschen ist dann ebenfalls eine Korrektur nötig:
Delphi-Quellcode:
var
p :Pointer; begin p := Pointer(stringliste.Objects[i]); if Assigned(p) then IUnknown(p)._Release; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz