Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   OpenOffice Zugriff Fehler (https://www.delphipraxis.net/168426-openoffice-zugriff-fehler.html)

Cyberdine 21. Mai 2012 09:29


OpenOffice Zugriff Fehler
 
Hallo zusammen,
wollte von meiner Delphi Anwendung aus Zugriff auf ein OpenOffice Dokument haben, um mal zu sehen wie sowas eigentlich geht und bischen experimentieren.

habe ein Teil hiervon verwendet -> http://www.delphipraxis.net/6940-kle...penoffice.html

Und das ganze sieht jetzt so aus, beim Ausführen kommt dann eine Execption Access Violation

Hier der Quelltext





Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, comobj, Vcl.StdCtrls;

type

  TForm1 = class(TForm)
    e1: TEdit;
    M1: TButton;
    procedure e1Change(Sender: TObject);
    procedure M1Click(Sender: TObject);
  private
  protected
  public
  end;

  TOLE_OpenOffice = class(TObject)



  private
    { Private-Deklarationen }
      // Da OpenOffice Pfadangaben im Unixstyle haben will werden Backslashes umgewandelt
  function ToOOPfad(Pfad:String):String;


  protected
    // Das OLE-Objekt, die Desktopinstanz und das Dokument selbst.
  Service, Desktop, Document : Variant;


  public
    { Public-Deklarationen }
  // Erstellt ein OLE Objekt;
  function Connect: boolean;
  // Oeffnet eine neues Dokument
  function Open:boolean;OVERLOAD;
  // Laden eines forhandenen Dokuments
  function Open(datei:string):boolean;OVERLOAD;
  // Ein Bookmarkfeld ersetzen ( Nicht Case Sensitiv)
  function ErsetzeBookmark(name,inhalt:String):boolean;
  end;



var
  Form1: TForm1; // Zugriffsforumular
  TOffice : TOLE_OpenOffice;  // Open Office Zugriffsobjekt


{$R *.dfm}


implementation

function TOLE_OpenOffice.Connect:boolean;
var
  rueckgabe : boolean;
begin
  try
    Service := CreateOleObject('com.sun.star.ServiceManager');
    Desktop := Service.createInstance('com.sun.star.frame.Desktop');
    rueckgabe := true;
  except
    rueckgabe := false;
  end;
  result := rueckgabe;
end;

function TOLE_OpenOffice.Open:boolean;
var
  rueckgabe : boolean;
begin
  try
    Document := Desktop.LoadComponentFromURL(
              'private:factory/swriter',
              '_blank',
              0,
              VarArrayCreate([0, - 1], varVariant));
    rueckgabe := true;
  except
    rueckgabe := false;
  end;
  result := rueckgabe;
end;

function TOLE_OpenOffice.Open(datei:string):boolean;
var
  rueckgabe : boolean;
begin
  datei := ToOOPfad(datei);
  try
    Document := Desktop.LoadComponentFromURL(
              datei,
              '_blank',
              0,
              VarArrayCreate([0, - 1], varVariant));
    rueckgabe := true;
  except
    rueckgabe := false;
  end;
  result := rueckgabe;
end;

function TOLE_OpenOffice.ToOOPfad(Pfad:String):String;
var
  rueckgabe : string;
  i : integer;
begin
  rueckgabe := 'file:///';
  while (POS('\',pfad)>0) do
  begin
    i := POS('\',pfad);
    delete(pfad,i,1);
    Insert('/',pfad,i);
  end;
  rueckgabe := rueckgabe + pfad;
  result := rueckgabe;
end;

function TOLE_OpenOffice.ErsetzeBookmark(name,inhalt:String):boolean;
var
  objtext, tc, bm, li : Variant;
  i : integer;
  rueckgabe : boolean;
begin
  rueckgabe := false;
  try
    objText := Document.getText;
    tc := objText.createTextcursor;
    li := Document.Bookmarks.getElementNames;
    for i := VarArrayLowBound(li,1) to VarArrayHighBound(li,1) do
    begin
      if (uppercase(li[i]) = uppercase(name)) then
      begin
        bm := Document.Bookmarks.getbyName(li[i]);
        tc := Document.Text.createTextCursorByRange(bm.Anchor);
        tc.string := inhalt;
        rueckgabe := true;
      end;
    end;
  except
    rueckgabe := false;
  end;
  result := rueckgabe;
end;


procedure TForm1.e1Change(Sender: TObject);
var str_tmp : string;
begin
  str_tmp := e1.Text;

end;

procedure TForm1.M1Click(Sender: TObject);
var str_tmp : string;
    bool_file : Boolean;


begin
  str_tmp := e1.Text;

  bool_file := TOffice.Connect;

//  bool_file := TOffice.Open(str_tmp);

end;

end.

Cyberdine 21. Mai 2012 09:32

AW: OpenOffice Zugriff Fehler
 
Der Fehler tritt übrigens genau hier auf

Service := CreateOleObject('com.sun.star.ServiceManager');

Bernhard Geyer 21. Mai 2012 09:56

AW: OpenOffice Zugriff Fehler
 
Könnte mir vorstellen das Name nicht mehr passt und mittlerweilse was mit Oracle verwendet wird.

Und übrigens: Quellcode kann man auch formatiert darstellen lassen damit man es besser lesen kann. Einfach das Helm-Icon oben in der Toolbarleiste verwenden.

Cyberdine 21. Mai 2012 10:27

AW: OpenOffice Zugriff Fehler
 
Wenn ich das Helmsymbol anklicke, verschwindet der Cursor, hab dann den Quelltext reinkopiert, da kam aber nix.
Hab es dann so probiert, Helm anklicken, ins Textfenster rein den Quelltext posten und nochmal den Helm, war aber alles wieder beim alten.
Habs mit Firefox und IE ausprobiert.

Das mit OpenOffice wird schwierig, seh ich jetzt schon :)

Cyberdine 21. Mai 2012 10:45

AW: OpenOffice Zugriff Fehler
 
Also laut http://www.openoffice.org/udk/common...utomation.html
stimmen die Angaben noch, scheinbar gibt es irgendwie eine Kollision im Speicher zwischen TForm und den Zugriffsobjekt für OpenOffice, werde das ganze jetzt mal ohne TForm ausprobieren, obs vielleicht daran liegt.

Lemmy 21. Mai 2012 11:28

AW: OpenOffice Zugriff Fehler
 
Hi,

schon mal versucht ein

TOffice.Create;

vor dem Connect zu machen? Du verwendest hier eine Klasse und versuchst vor dem Erzeugen per TOffice.Connect eine Methode aufzurufen - das ist aber keine Klassenmethode - du brauchst erst ne entsprechende Instanz von TOffice

Grüße

Cyberdine 21. Mai 2012 11:39

AW: OpenOffice Zugriff Fehler
 
Hy Lemmy,
habe jetzt ein Create bei der Initialisierung des Forms gemacht

procedure TForm1.FormCreate(Sender: TObject);
begin
TOffice.Create;
end;

allerdings kommt gleich dort eine Exeption.

Lemmy 21. Mai 2012 11:47

AW: OpenOffice Zugriff Fehler
 
Hi,

sorry, ich habe mich verlesen. Du musst das so machen.


Delphi-Quellcode:

  TOffice:=TOLE_OpenOffice.Create;
dann kannst Du auf das Ding zugreifen

GRüße

Cyberdine 21. Mai 2012 12:05

AW: OpenOffice Zugriff Fehler
 
Super Danke Lemmy, die eine Zeile hat mir viel geholfen, jetzt läufts endlich ohne Execption :-)


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