AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C# Klasse -> Delphi Klasse / OpenOffice

C# Klasse -> Delphi Klasse / OpenOffice

Ein Thema von vsti · begonnen am 29. Aug 2006 · letzter Beitrag vom 23. Jun 2022
Antwort Antwort
Benutzerbild von vsti
vsti

Registriert seit: 20. Sep 2004
Ort: Syke
70 Beiträge
 
Delphi 2005 Architect
 
#1

C# Klasse -> Delphi Klasse / OpenOffice

  Alt 29. Aug 2006, 08:25
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
Thorsten
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
426 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: C# Klasse -> Delphi Klasse / OpenOffice

  Alt 23. Jun 2022, 10:29
Dieses Thema scheint ganz interessant zu sein und beschäftigt mich aktuell. Leider erscheint bei mir der gleiche Fehler, hat jemand eine Idee?
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.577 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: C# Klasse -> Delphi Klasse / OpenOffice

  Alt 23. Jun 2022, 12:39
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
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
474 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: C# Klasse -> Delphi Klasse / OpenOffice

  Alt 23. Jun 2022, 12:44
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.
Peter Below
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
426 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: C# Klasse -> Delphi Klasse / OpenOffice

  Alt 23. Jun 2022, 13:56
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...
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
474 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: C# Klasse -> Delphi Klasse / OpenOffice

  Alt 23. Jun 2022, 16:48
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.
Peter Below
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf