Einzelnen Beitrag anzeigen

Cyberdine

Registriert seit: 21. Mai 2012
26 Beiträge
 
#1

OpenOffice Zugriff Fehler

  Alt 21. Mai 2012, 09:29
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.

Geändert von MrSpock (21. Mai 2012 um 11:42 Uhr) Grund: Code Tags hinzugefügt.
  Mit Zitat antworten Zitat