AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AddObject mit einem Interface?

Ein Thema von angelika81 · begonnen am 8. Apr 2008 · letzter Beitrag vom 9. Apr 2008
Antwort Antwort
Seite 1 von 2  1 2      
angelika81

Registriert seit: 8. Apr 2008
12 Beiträge
 
Delphi 2007 Professional
 
#1

AddObject mit einem Interface?

  Alt 8. Apr 2008, 22:05
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:
procedure Eintragen(Objekt: IMyInterface);
begin
  cmbTest.AddObject('Test', Objekt);
end;
Wenn ich das Objekt hinterher wieder herausholen möchte, bekomme ich aber eine AccessViolation:
Delphi-Quellcode:
var
  obj: TObject;
begin
  obj := cmbDatenbank.Items.Objects[cmbDatenbank.ItemIndex];
  if Supports(obj, IMyInterface, dbcs) then <----- Hier scheppert es...!
      dbcs.DoSomething;
end;
Ich schätze, es ist nicht sauber, ein Interface per AddObject zu hinterlegen, weil bei Interfaces der Speicher anders verwaltet wird, richtig?
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: AddObject mit einem Interface?

  Alt 8. Apr 2008, 22:11
Versuch es mal mit TObject als Typ
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#3

Re: AddObject mit einem Interface?

  Alt 8. Apr 2008, 22:14
Zitat:
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?
--> So ähnlich.

Du deklarierst eine neue Klasse, welche das Interface verwendet:
Delphi-Quellcode:
TMyClass = class(IMyInterface)
public
  Name: string;
end;
Dann kannst du bequem deine Objekte verwalten:
Delphi-Quellcode:
procedure Eintragen(Objekt: TMyClass);
begin
  if Assigned(Objekt) then
    cmbTest.AddObject(Objekt.Name, Objekt);
end;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: AddObject mit einem Interface?

  Alt 8. Apr 2008, 22:20
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: AddObject mit einem Interface?

  Alt 9. Apr 2008, 00:41
Ich wundere mich immer wieder, woher die Kerle hellsehen können. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: AddObject mit einem Interface?

  Alt 9. Apr 2008, 00:53
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:
var
  Intf: IInterface;
begin
  Intf := IInterface(Pointer(cmbDatenbank.Items.Objects[cmbDatenbank.ItemIndex]);
  if Supports(Intf, IMyInterface, dbcs) then
    dbcs.DoSomething;
end;
Man sollte aber beachten, dass dabei die Referenzzählung den Bach runter geht.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: AddObject mit einem Interface?

  Alt 9. Apr 2008, 01:05
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 ??
Gruß
Hansa
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: AddObject mit einem Interface?

  Alt 9. Apr 2008, 02:18
Zitat von angelika81:
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.
Wieso nur "den Typen des Interfaces, welches das Objekt implementiert" und nicht das Objekt ansich?
Schließlich erwartet AddObject auch ein TObject und kein TInterface.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: AddObject mit einem Interface?

  Alt 9. Apr 2008, 09:23
Hallo,
Zitat von Hansa:
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 ??
Was soll der Kommentar? Es ist offensichtlich, dass hier an irgendwelche TStrings Interfaces gebunden werden sollen. Das macht mein Code. Also was willst Du?

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: AddObject mit einem Interface?

  Alt 9. Apr 2008, 11:02
Da muss man etwas tricksen:
Delphi-Quellcode:
procedure Eintragen(IntPtr: IMyInterface);
begin
  IntPtr._AddRef; // Referenzzählung "austricksen"
  cmbTest.AddObject('Test', TObject(IntPtr));
end;
Würde man nicht mit AddRef eingreifen, kann es passieren, dass das Objekt auf den der Interfacezeiger verweist,
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;
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz