Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   allgemeines Verständnisproblem mit Interfaces (https://www.delphipraxis.net/63275-allgemeines-verstaendnisproblem-mit-interfaces.html)

Luckie 16. Feb 2006 09:37


allgemeines Verständnisproblem mit Interfaces
 
Folgender Code:
Delphi-Quellcode:
function TDWJabberSession.GetStatus(JID: WideString): String;
var
  JabberPres: IJabberPres;
begin
  JabberPres := FJabberSession.GetPres(JID, '', True);
  result := JabberPres.Status;
end;
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.

Zottel 16. Feb 2006 09:45

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:
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;
//edit: formatierung ausgebessert

Luckie 16. Feb 2006 10:07

Re: allgemeines Verständnisproblem mit Interfaces
 
Was soll mir dein Code jetzt helfen? Ich weiß ja aus der Dokumentation, dass es dieses Interface gibt.

Zottel 16. Feb 2006 10:20

Re: allgemeines Verständnisproblem mit Interfaces
 
ups. sorry. hatte mich verlesen.

freak4fun 16. Feb 2006 10:24

Re: allgemeines Verständnisproblem mit Interfaces
 
Delphi-Quellcode:
function TDWJabberSession.GetStatus(JID: WideString): String;
var
  JabberPres: IJabberPres;
begin
  //Fehlt hier nicht ein create?
  JabberPres := FJabberSession.GetPres(JID, '', True);
  result := JabberPres.Status;
end;
MfG
freak

Luckie 16. Feb 2006 10:27

Re: allgemeines Verständnisproblem mit Interfaces
 
Dachte ich mir auch, nur gibt es kein IJabberPres.Create. :gruebel:

freak4fun 16. Feb 2006 10:36

Re: allgemeines Verständnisproblem mit Interfaces
 
Du solltest eine Klasse erstellen, die das Interface unterstützt.
Delphi-Quellcode:
TJabberPres = class (TInterfacedObject, IJabberPres)
Denn wenn du auf Funktionen eines Interface zugreifen willst kann das nicht gehen, da sie nicht ausgeprägt sind.

Delphi-Quellcode:
function TDWJabberSession.GetStatus(JID: WideString): String;
var
  JabberPres: IJabberPres;
begin
  JabberPres := TJabberPres.Create;
  JabberPres := FJabberSession.GetPres(JID, '', True);
  result := JabberPres.Status;
end;
MfG
freak

Muetze1 16. Feb 2006 10:52

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?

TKC 16. Feb 2006 10:54

Re: allgemeines Verständnisproblem mit Interfaces
 
Zitat:

Zitat von freak4fun
Du solltest eine Klasse erstellen, die das Interface unterstützt.
Delphi-Quellcode:
TJabberPres = class (TInterfacedObject, IJabberPres)

sollte das nicht besser so sein ?
Delphi-Quellcode:
TJabberPres = class (TComObject, IJabberPres)
Schau dir doch mal ein ppar implementierungen vom TembeddedWB an, z.b. den IDocHostUIHandler.

Luckie 16. Feb 2006 11:27

Re: allgemeines Verständnisproblem mit Interfaces
 
Nun ja, ich denke mal das hat Delphi schon selber gemacht beim Importieren der Typbibliothek.

tommie-lie 16. Feb 2006 12:03

Re: allgemeines Verständnisproblem mit Interfaces
 
Zitat:

Zitat von Luckie
da mir der Code mit einer Access Violation abstürzt.

In welcher der beiden Zeilen? Ist das zurückgegebene Objekt gültig (!= nil)? Laut Doku will GetPres() ein Objekt aus der "Presence Databse" (whatever) zurückgeben. Es steht dort nicht, was geschehen soll, wenn dort kein Objekt drin ist, ich würde es für logisch halten, wenn nil zurückgegeben werden würde. Ist denn in deinem Jabber-Netzwerk jemand online?

Zitat:

Zitat von freak4fun
Fehlt hier nicht ein create?

Nein, ist eien Factory, GetPres() *ist* das Create, wenn man unbedingt mit der Teminologie von Create und Destroy arbeiten will (auf ein Destroy muss man dann aber verzichten, das gips nicht).
Zitat:

Zitat von freak4fun
Du solltest eine Klasse erstellen, die das Interface unterstützt.

Himmel! Wenn mir eine COM-Typbibliothek ein Interface gibt, will ich es nicht selber implementieren, sondern benutzen. Eine Klasse, die ein Interface implementiert, implementiert dieses Interface auch. D.h. die Klasse sollte alle Methoden des Interfaces mit Code hinterlegen. Michael will will aber aus einer fertigen Bibliothek ein Objekt benutzen. Die Klasse, die das implementiert, steckt in der Bibliothek. Er will ja lediglich das Interface benutzen und nicht seinen eigenen Jabber-Klon schreiben.
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 JOPL gibt, oder will er auch eine von Delphi unabhängige Lösung, ergo COM?

Flocke 16. Feb 2006 12:06

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);

freak4fun 16. Feb 2006 12:13

Re: allgemeines Verständnisproblem mit Interfaces
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von freak4fun
Fehlt hier nicht ein create?

Nein, ist eien Factory, GetPres() *ist* das Create, wenn man unbedingt mit der Teminologie von Create und Destroy arbeiten will (auf ein Destroy muss man dann aber verzichten, das gips nicht).
Zitat:

Zitat von freak4fun
Du solltest eine Klasse erstellen, die das Interface unterstützt.

Himmel! Wenn mir eine COM-Typbibliothek ein Interface gibt, will ich es nicht selber implementieren, sondern benutzen. Eine Klasse, die ein Interface implementiert, implementiert dieses Interface auch. D.h. die Klasse sollte alle Methoden des Interfaces mit Code hinterlegen. Michael will will aber aus einer fertigen Bibliothek ein Objekt benutzen. Die Klasse, die das implementiert, steckt in der Bibliothek. Er will ja lediglich das Interface benutzen und nicht seinen eigenen Jabber-Klon schreiben.
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.

Ok, sorry ich schreib nichts mehr. :roll:

Luckie 16. Feb 2006 12:14

Re: allgemeines Verständnisproblem mit Interfaces
 
@Thomas: Das wars mit dem nil. So geht es:
Delphi-Quellcode:
function TDWJabberSession.GetStatus(AJID: WideString): string;
var
  JabberPres       : IJabberPres;
begin
  JabberPres := FJabberSession.GetPres(AJID, '', True);
  if Assigned(JabberPres) then
    result := JabberPres.Status;
end;
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. :?

tommie-lie 16. Feb 2006 12:48

Re: allgemeines Verständnisproblem mit Interfaces
 
Zitat:

Zitat von Luckie
@Thomas: Das wars mit dem nil.

Gut, daß ich meine Glaskugel gestern erst poliert habe :mrgreen:
Zu deinem aktuellen Code: Result may be undefined ;-)

Zitat:

Zitat von Luckie
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. :?

Du sollst ja auch nicht zuhause arbeiten, du sollst deinen Schlafsack mit ins Büro bringen und dort arbeiten :mrgreen:
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:

Zitat von freak4fun
Ok, sorry ich schreib nichts mehr.

So war es nicht gemeint. Du solltest nur wissen, worüber du schreibst.


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