![]() |
allgemeines Verständnisproblem mit Interfaces
Folgender Code:
Delphi-Quellcode:
Die Methode GetPres liefert ein IJabberPres Objekt zurück. Aber irgendwas mache ich grundsätzlich falsch, da mir der Code mit einer Access Violation abstürzt.
function TDWJabberSession.GetStatus(JID: WideString): String;
var JabberPres: IJabberPres; begin JabberPres := FJabberSession.GetPres(JID, '', True); result := JabberPres.Status; end; |
Re: allgemeines Verständnisproblem mit Interfaces
Vielleicht hilft die das weiter.
Ich gehe aber über die Supports-Methode, um gleich ne rückmeldung zu bekommen, wenn das Interface nicht vorhanden ist.
Delphi-Quellcode:
//edit: formatierung ausgebessert
procedure TFormEditWindow.ControlChange(Sender: TObject; NewObject: TObject);
var InheritedInterface : IcParamFromObject; begin // Testen, ob Interface in Klasse vorhanden ist if Supports(NewObject, IcParamFromObject, InheritedInterface) then begin //Wenn vorhanden, dann das extrahierte Interface abfragen LogForm.LogMemo.Lines.Add(InheritedInterface.GetParamAsString); end else begin // ansonsten Fehler ausgeben raise ERangeError.CreateFmt('Not supported'); end; end; |
Re: allgemeines Verständnisproblem mit Interfaces
Was soll mir dein Code jetzt helfen? Ich weiß ja aus der Dokumentation, dass es dieses Interface gibt.
|
Re: allgemeines Verständnisproblem mit Interfaces
ups. sorry. hatte mich verlesen.
|
Re: allgemeines Verständnisproblem mit Interfaces
Delphi-Quellcode:
MfG
function TDWJabberSession.GetStatus(JID: WideString): String;
var JabberPres: IJabberPres; begin //Fehlt hier nicht ein create? JabberPres := FJabberSession.GetPres(JID, '', True); result := JabberPres.Status; end; freak |
Re: allgemeines Verständnisproblem mit Interfaces
Dachte ich mir auch, nur gibt es kein IJabberPres.Create. :gruebel:
|
Re: allgemeines Verständnisproblem mit Interfaces
Du solltest eine Klasse erstellen, die das Interface unterstützt.
Delphi-Quellcode:
Denn wenn du auf Funktionen eines Interface zugreifen willst kann das nicht gehen, da sie nicht ausgeprägt sind.
TJabberPres = class (TInterfacedObject, IJabberPres)
Delphi-Quellcode:
MfG
function TDWJabberSession.GetStatus(JID: WideString): String;
var JabberPres: IJabberPres; begin JabberPres := TJabberPres.Create; JabberPres := FJabberSession.GetPres(JID, '', True); result := JabberPres.Status; end; freak |
Re: allgemeines Verständnisproblem mit Interfaces
Aber wird so nicht der Inhalt der Variablen JabberPres überschrieben bei der 2. Zuweisung? Auch wenn es Interfaces sind, sind es doch nur Verweise und die werden hier eigentlich überschrieben - oder nicht?
|
Re: allgemeines Verständnisproblem mit Interfaces
Zitat:
Delphi-Quellcode:
Schau dir doch mal ein ppar implementierungen vom TembeddedWB an, z.b. den IDocHostUIHandler.
TJabberPres = class (TComObject, IJabberPres)
|
Re: allgemeines Verständnisproblem mit Interfaces
Nun ja, ich denke mal das hat Delphi schon selber gemacht beim Importieren der Typbibliothek.
|
Re: allgemeines Verständnisproblem mit Interfaces
Zitat:
Zitat:
Zitat:
Bezüglich der Benutzung von Interfaces ist Michaels Code vollständig, ich weiß nur nicht, ob und was die COM-Bibliothek so alles zurückgibt, wenn mal was nicht funktioniert. P.S.: Weiß Jan, daß es ![]() |
Re: allgemeines Verständnisproblem mit Interfaces
Kann es sein, dass dir GetPres nur ein IDispatch zurückliefert, dass du erst noch casten musst? Also:
Delphi-Quellcode:
JabberPres := (FJabberSession.GetPres(JID, '', True) as IJabberPres);
|
Re: allgemeines Verständnisproblem mit Interfaces
Zitat:
|
Re: allgemeines Verständnisproblem mit Interfaces
@Thomas: Das wars mit dem nil. So geht es:
Delphi-Quellcode:
Ja, er kennt die JOPL. Die gehört zu Exodus und Exodus ist vom gleichen Autor wie der JabberCom Com-Server. Allerdings blicke ich bei Exodus und der JOPL nicht durch. Die JOPL scheint igrendwie nit Exodus verknüpft zu sein, jedenfalls benötigt sie Dateien aus dem Exodus Projekt und dort braucht man wieder die TNTKontrols, die ich zu Hause mit D6 Personal nicht zum Laufen gebracht habe. :?
function TDWJabberSession.GetStatus(AJID: WideString): string;
var JabberPres : IJabberPres; begin JabberPres := FJabberSession.GetPres(AJID, '', True); if Assigned(JabberPres) then result := JabberPres.Status; end; |
Re: allgemeines Verständnisproblem mit Interfaces
Zitat:
Zu deinem aktuellen Code: Result may be undefined ;-) Zitat:
Ich bin nur bei der Suche nach der JabberCOM-Doku (in der ich hoffte, etwas über das Fehlerverhalten zu erfahren), über JOPL gestolpert und dacht, daß das wohl praktischer wäre, da es direkt eine Pascal-Implementierung ist. Naja, vielleicht ist die COM-Lösung im Endeffekt tatsächlich die flexiblere. Du kannst ja aus deinem Wrapper auch ein COM-Objekt basteln *g* Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 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 by Thomas Breitkreuz