Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C# Klasse -> Delphi Klasse / OpenOffice (https://www.delphipraxis.net/76042-c-klasse-delphi-klasse-openoffice.html)

vsti 29. Aug 2006 08:25


C# Klasse -> Delphi Klasse / OpenOffice
 
hier mal der ursprüngliche Code:

Code:
internal class OOoCloseListener : XCloseListener {
  internal OOoTextDocument mTextDocument;
 
  public OOoCloseListener(OOoTextDocument pTextDocument) {
      mTextDocument = pTextDocument;
  } 
 
 
  public void notifyClosing(EventObject Source) { }
 
  public void queryClosing(EventObject Source, bool GetsOwnership) {
      mTextDocument.OnClosing(EventArgs.Empty);
  }
 
  public void disposing(EventObject Source) { }
}
und hier meine jetzige Version der Delphi Klasse (mach das zum ersten mal :/)

Delphi-Quellcode:
  OOoCloseListener = class(TObject)
  private
    mTextDocument: variant;
  public
    constructor Create(pTextDocument:variant);
    destructor Destroy; override;
    procedure notifyClosing(Source:variant);
    procedure queryClosing(Source:variant;GetsOwnership:boolean);
    procedure disposing(Source:variant);
  end;

implementation

procedure OOoCloseListener.disposing(Source:variant);
begin
//
end;

procedure OOoCloseListener.notifyClosing(Source:variant);
begin
//
end;

destructor OOoCloseListener.Destroy;
begin
  mTextDocument.free;
  inherited Destroy;
end;

constructor OOoCloseListener.Create(pTextDocument:variant);
begin
  inherited Create;
  mTextDocument := pTextDocument;
end;

procedure OOoCloseListener.queryClosing(Source:variant;GetsOwnership:boolean);
begin
//  mTextDocument.OnClosing(EmptyParam);
  showmessage('es schließt sich jetzt');
end;
da es in delphi die Typen XCloseListener oder EventObject nicht gibt und um OpenOffice anzusprechen der Typ variant genutzt wird, habe ich auf gut Glück alles auf variant geändert

jetzt geht es wie folgt weiter
Delphi-Quellcode:
function TOOWriter.OpenDocument(const aFileName:string): boolean;
var
  fFileName: string;
  document: variant;
  mCloseListener: OOoCloseListener;
begin
  fFileName := ConvertToUrl(aFileName);
  Document := StarDesktop.LoadComponentFromURL(
                fFileName, '_blank', 0,
                VarArrayCreate([0, -1], varVariant));
  // Close-Listener initialisieren
  mCloseListener := OOoCloseListener.create(document);
  // Close-Listener hinzufügen
  document.addCloseListener(mCloseListener); //<-- hier kommt beim Kompilieren eine Fehlermeldung
  Result := not (VarIsEmpty(Document) or VarIsNull(Document));
end;
die Fehlermeldung lautet: E2281 Typ ist im Aufruf von Variant Dispatch nicht zulässig

bitte macht mich darauf aufmerksam wenn ich was übersehen habe, diese ganze OpenOffice Geschichte in Delphi ist echt Nerfenzerreißend :?

devidespe 23. Jun 2022 10:29

AW: C# Klasse -> Delphi Klasse / OpenOffice
 
Dieses Thema scheint ganz interessant zu sein und beschäftigt mich aktuell. Leider erscheint bei mir der gleiche Fehler, hat jemand eine Idee?

Sherlock 23. Jun 2022 12:39

AW: C# Klasse -> Delphi Klasse / OpenOffice
 
Der Typ OleVariant wäre vielleicht einen Versuch wert. Immer wenn ich SO Übersetzungen gesehen habe, schien das der Datentyp der Wahl zu sein.

Sherlock

peterbelow 23. Jun 2022 12:44

AW: C# Klasse -> Delphi Klasse / OpenOffice
 
Zitat:

Zitat von devidespe (Beitrag 1507698)
Dieses Thema scheint ganz interessant zu sein und beschäftigt mich aktuell. Leider erscheint bei mir der gleiche Fehler, hat jemand eine Idee?

Für OLE automation via late binding sind nur parameter erlaubt, die automation-kompatible Typen sind, also variant, widestring, ordinale typen etc.. Eine Objektreferenz gehört definitiv nicht dazu.

Falls OpenOffice Ole automation unterstützt sollte es eine type library installieren, die man (hoffentlich) in Delphi importieren kann. Das sollte eine Unit liefern, die man dann entweder via early binding verwenden kann, oder die zumindest die Typen der möglichen Parameter angibt. Dein Listener ist vermutlich als callback interface zu implementieren.

devidespe 23. Jun 2022 13:56

AW: C# Klasse -> Delphi Klasse / OpenOffice
 
Selbst wenn ich aus Variant -> OleVariant mache, erhalte ich die Fehlermeldung

E2160 Typ in einem OLE-Automatisierungsaufruf nicht erlaubt

und zwar genau in der Zeile, wo die Objektreferenz zugewiesen wird. Das bestätigt die Aussage von Peter, dass eine Objektreferenz wohl nicht erlaubt ist.

Was mich aber wieder an den Anfang bringt, wie man in Delphi anhand der frei verfügbaren API einen XCloseListener verwendet, um beim Schließen eines Dokumentes in einem Event darauf reagieren zu können?

Die hier beschriebene Klasse scheint sich dafür ja nicht zu eignen...

peterbelow 23. Jun 2022 16:48

AW: C# Klasse -> Delphi Klasse / OpenOffice
 
Zitat:

Zitat von devidespe (Beitrag 1507712)
Selbst wenn ich aus Variant -> OleVariant mache, erhalte ich die Fehlermeldung

E2160 Typ in einem OLE-Automatisierungsaufruf nicht erlaubt

und zwar genau in der Zeile, wo die Objektreferenz zugewiesen wird. Das bestätigt die Aussage von Peter, dass eine Objektreferenz wohl nicht erlaubt ist.

Was mich aber wieder an den Anfang bringt, wie man in Delphi anhand der frei verfügbaren API einen XCloseListener verwendet, um beim Schließen eines Dokumentes in einem Event darauf reagieren zu können?

Die hier beschriebene Klasse scheint sich dafür ja nicht zu eignen...

Wie gesagt, Du mußt die type library importieren, um zu sehen, wie der Listener in Delphi-Syntax deklariert werden muß. Das C#-Beispiel basiert vermutlich auf einem fertigen .NET Assembly, das solche Feinheiten intern versteckt.

devidespe 4. Jul 2022 08:32

AW: C# Klasse -> Delphi Klasse / OpenOffice
 
Zitat:

Zitat von peterbelow (Beitrag 1507737)

Wie gesagt, Du mußt die type library importieren, um zu sehen, wie der Listener in Delphi-Syntax deklariert werden muß. Das C#-Beispiel basiert vermutlich auf einem fertigen .NET Assembly, das solche Feinheiten intern versteckt.

Hallo Peter,

wo finde ich diese Type Library - ich habe nichts entsprechendes gefunden.

Danke

peterbelow 4. Jul 2022 11:18

AW: C# Klasse -> Delphi Klasse / OpenOffice
 
In der IDE: Component -> Import Component

Der angezeigte Wizard bietet dann die Möglichkeit, eine registrierte type library zu importieren, er zeigt eine Liste der registrierten libraries auf der nächsten Seite. Wenn Du da nichts zu Open Office gehöriges findest kannst Du über den Add-Button in den OO-Verzeichnissen nach einem TLB-File oder einer DLL suchen, in der die type library eingebettet ist.

Man kann auch ein registriertes .NET assembly importieren, welches für COM interop vorgesehen ist, auch da gibt es eine Liste, aus der man auswählen kann.

Eine kurze Google-Suche hat das hier gefunden, scheint aber für eine sehr alte OO-Version zu sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 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