Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OpenOffice und OLE, wie ? (https://www.delphipraxis.net/6812-openoffice-und-ole-wie.html)

LokutusvB 19. Aug 2009 12:53

Re: OpenOffice und OLE, wie ?
 
Schade, das kenne ich leider schon. So grundlege Sachen sind mir klar, wie Öffnen, Texte bei Textmarken einfügen, Dokument speichern und ein wenig Scalc. Was jedoch so überhaupt nicht klar ist, ist wie man Platzhalter manipuliert, z.B. mit Text füllt oder ganz löscht.

Ich gehe mal davon aus, das
Delphi-Quellcode:
enum := Document.getTextFields.createEnumeration;
while enum.hasMoreElements do begin
  field := enum.nextElement;  
  if field.TextFieldMaster.Name = 'Name' then begin
      InputField := Document.createInstance('com.sun.star.text.TextField.Input');
      // Löschen oder Text setzten    
  end;
end;
Das ist so in etwa das Einzige, was man im netz finden kann. Wobei das nach meinem Verständnis auch nicht gehen kann, weil jeglicher Zusammenhang zwischen INputField und field fehlt. Oder geht das trotzdem irgendwie so?

shmia 19. Aug 2009 13:04

Re: OpenOffice und OLE, wie ?
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von LokutusvB
Nein, diesen OleViewer habe ich noch nicht installiert.

Wie gesagt: Pflichtprogramm.
Ich habe Open Office nicht installiert, deshalb zeige ich die Vorgehensweise mit Microsoft Word.
1.) OleView starten und links im Baum das Item "Type Libraries" aufklappen.
Im 1. Screenshot sieht man, dass ich "Microsoft Word 11.0 Object Library" ausgewählt habe.
Du wählst natürlich irgend etwas mit "Open Office" aus.
2.) Doppelklick darauf öffnet ein neues Fenster (2. Screenshot)
Unter "Interfaces" sieht man die ganzen Schnittstellen.
3.) auch bei WinWord gibt es ein Interface "IField"
Im 3. Screenshot sieht man rechts die Methoden dazu.
Unter Anderem gibt es zweimal die Methode "Data" (Propget und Propput sagt aus, dass die Methoden an ein Property angebunden sind )
In diesem Fall (WinWord) könnte man also schreiben:
Delphi-Quellcode:
field.Data := 'der neue Inhalt';
Mir hat natürlich niemand gesagt, dass das Property Data für den Inhalt des Feldes steht.
Aber anhand des Namens erscheint das doch ziemlich logisch.

Jetzt musst du nur noch das neue Wissen auf Open Office übertragen.

LokutusvB 19. Aug 2009 13:47

Re: OpenOffice und OLE, wie ?
 
Ich habe den OLE/COM Object Viewer aus dem Resource Kid 2000 installiert und gestartet. IN den Type Libraries ist alles Mögliche drinn, von A bis Z, jedes noch so glitzekleine installierte Programm, allerdings kein Open Office. Dieser Viewer hat leider keine Such-Funktion. Ist nun mein Open Office fehlerhaft installiert oder was ist hier nun wieder los?

LokutusvB 20. Aug 2009 16:47

Re: OpenOffice und OLE, wie ?
 
Ich bin nun auch ohne diesen für OO anscheinend nicht funktionierenden Viewer ein Stückchen weiter gekommen. Meine 2 Hauptprobleme sind zum einen die für mich recht unverständliche OO-API und zum anderen das richtige Zuordnen der Felder zu ihren Namen in der OO-API.

Durch folgenden Quelltext konnte ich zumindest schon winzig kleine Teilerfolge ermitteln:
Delphi-Quellcode:
function TOLE_OpenOffice.EntfPlatzhalter(platzhalter: String): Boolean;
var
  enum, field, InputField: Variant;
begin
  enum := Document.getTextFields.createEnumeration;
  while enum.hasMoreElements do begin
    field := enum.nextElement;
    // if VarType(field) <> varDispatch then ShowMessage('kein Dispatch-Interface vorhanden!');
    if field.supportsService('com.sun.star.text.TextField.Input') then begin
      ShowMessage('Input');
      ShowMessage(field.getPropertyValue('Hint'));
      ShowMessage(field.getPropertyValue('Content'));
      field.setPropertyValue('Content', 'Test-Content');
      Document.TextFields.refresh;
    end;
    if field.supportsService('com.sun.star.text.TextField.User') then begin
      ShowMessage('User');
    end;
    if field.supportsService('com.sun.star.text.TextField.InputUser') then begin
      ShowMessage('InputUser');
    end;
  end;
end;
So konnte ich zumindest ersteinmal herausfinden, daß die Platzhalter (Feldtyp->Platzhalter, Format->Text). nicht vom Typ Input sind, wie bisher von mir angenommen. Nur von welchem Typ sind sie dann?

Daraufhin habe ich ein Benutzerfeld vom Typ Text angelegt, und siehe da, es handelt sich um ein User-Feld. Daraufhin habe ich mich in der API zu User durchgeklickt, in der Hoffnung hier die Methoden zur Bearbeitung zu finden, aber Pustekucken, da stehen nur die Eigenschaften drinn. Entweder ist es jetzt schon zu spät, um klare Gedanken zu fassen oder aber die Open Office API ist die Schlimmste, mit der ich bisher zu tun hatte.

Kann jemand bei einem der beiden Probleme weiter helfen (also Methodensuche oder aber Felder und ihre bezeichnung in der API) oder sollte ich mich damit lieber an ein OO-Forum wenden?

LokutusvB 24. Aug 2009 14:33

Re: OpenOffice und OLE, wie ?
 
Um das Ganze abzuschließen, mit folgendem Code kann man einfach den Content des Feldes (Funktionen -> Eingabefeld) ändern:

Delphi-Quellcode:
function EditInput(name, inhalt: String): Boolean;
var
  enum, field: Variant;
begin
  Result := False;
  enum := Document.getTextFields.createEnumeration;
  while enum.hasMoreElements do begin
    field := enum.nextElement;  
    if field.supportsService('com.sun.star.text.TextField.Input') then begin
      if (field.getPropertyValue('Hint') = name) then begin
        field.setPropertyValue('Content', inhalt);
        Document.TextFields.refresh;
        Result := True;
      end;
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:10 Uhr.
Seite 3 von 3     123   

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