| Autor |
Beitrag |
Peter18
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Di 25.10.11 13:05
Ein freundliches Hallo an alle,
es ist doch immer wieder erfrischend eine Fehlermeldung zu lesen die einem alles sagt und die Lösung mitliefert. So geschehen am heutigen Tag, beim Versuch ein Word-Dokument bei OpenOffice einzufügen.
Fehlermeldung: " Typkonflikt"
Lösung:
Nach diversen Versuchen stehe ich hier, ich Tor und weiß so viel als wie zuvor! (geklaut)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure OOInsertDoc( OO: T_OO; Fil: String; Err: T_Error ); var Par : OLEVariant; begin if LowerCase( GetExt(Fil) ) = '.doc' then begin Par := VarArrayCreate([0, 1], varVariant); Par[0] := OO.OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue'); Par[1] := OO.OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue'); Par[0].Name := 'Name'; Par[0].Value := OO.FCP.getFileURLFromSystemPath('', Fil); Par[1].Name := 'Filter'; Par[1].Value := 'MS Word 97'; OO.Disp.executeDispatch( OO.Fil, '.uno:InsertDoc', '', 0, Par ); end else begin Par := VarArrayCreate([0, 0], varVariant); Par[0] := OO.OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue'); Par[0].Name := 'Name'; Par[0].Value := OO.FCP.getFileURLFromSystemPath('', Fil); OO.Disp.executeDispatch( OO.Fil, '.uno:InsertDoc', '', 0, Par ); end; end; |
Das ist die Testroutine. Der Fehler tritt bei "executeDispatch" im ersten Teil auf, da die eingezogene Datei ein Word-Dokument ist. Die Parameter habe ich aus einem aufgezeichneten OO-Makro entnommen. Ich hoffe jemand hat eine Idee!
Dank Euch im Voraus und Grüße von der nun sonnigen Nordsee.
Peter
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 25.10.11 13:51
Muss es Dispatch sein? So wie ich das sehe, ist das mehr ne Krücke für den Macrorecorder, man sollte das nicht tun, wenn man nicht muss.
Die API-Funktion dafür wäre insertDocumentFromURL vom TextCursor.
Ich hab auch so den Eindruck, dass die Parameter da anders heißen. Jedenfalls steht in der Doc zu MediaDescriptor, dass der FilterName heißt, nicht Filter. Aber warum gehts dann mit dem Recorder? Seltsam, das.
Funktioniert die andere Hälfte (ohne Filter-Angabe) denn?
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Di 25.10.11 17:38
Hallo Martok,
danke für Deine Antwort! Genau nach einer solchen Funktion habe ich gesucht. Den Dispatcher wollte ich möglichst nicht verwenden. Wozu gehört denn die Methode? Zum Dokument? Da bekomme ich einen Fehler (... nicht unterstützt), oder Cursor? Auch da gibt es eine Fehlermeldung. Sind die Parameter so richtig oder habe ich da etwas falsch verstanden?
Delphi-Quelltext 1:
| OO.Cur.insertDocumentFromURL( OO.FCP.getFileURLFromSystemPath('', Fil), '', 0 ); |
Wenn es eine Beschreibung gibt, in der es anders heißt, kann man Basic warscheinlich nicht auf Delphi oder die API übertragen. Im Moment tu ich mich noch etwas schwer, die Sachen zu finden, z.B. den MediaDescriptor oder die Hirarchie bei "insertDocumentFromURL". Hast Du einen Tipp?
Die andere Hälfte ist noch nicht getestet.
Grüße
Peter
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 25.10.11 17:50
Also ich Google da auch nur planlos rum
Diese Funktion hatte ich in einem Mailinglistenarchiv gefunden, wo jemand direkt gefragt hatte ob es denn sowas gibt.
Sollte zum TextCursor gehören. Der erste Parameter ist ein String, der zweite wieder so ein PropertyValue-Array.
Ja, der Recorder macht etwas anderes als die "richtige" API. Die ist wohl etwas kompliziert zum Autogenerieren; daher wird per Dispatch nur UI-Aktionen simuliert. So versteh ich das jedenfalls.
In dem Attachment zu diesem Bug findest du ein Basic-Beispiel wie man die Funktion aufruft.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mi 26.10.11 16:18
Hallo Martok,
danke für deine Antwort. Sie hat weitergeholfen. Mit OO-Dokumenten geht es schon, aber mit MS-Docs noch nicht. Da habe ich noch Probleme mit dem Import. Es erscheint kein Text, ich nehme daher an, ich muß den Importfilter und Optionen angeben. Doch bisher ist es mir nicht gelungen in der Dokumentation eine Liste mit gültigen Filternamen und Optionen zu finden. Der Filter "MS Word 97" hat zwar keinen Fehler produziert, aber es erschien auch damit kein Text. Irgend etwas fehlt da noch, denn vor dem nicht vorhandenen Text wird auch noch ein Seitenumbruch gesetzt.
Grüße
Peter
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 27.10.11 17:44
Ein freundliches Hallo an alle,
es war tatsächlich der Filter!  Mit " <Alle Formate>" kann ich ein Word-Dokument laden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure OOInsertDoc( OO: T_OO; Fil: String; Err: T_Error ); var Par : OLEVariant; Path : String;
begin if LowerCase( GetExt(Fil) ) = '.doc' then begin Par := VarArrayCreate([0, 0], varVariant); Par[0] := OO.OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue'); Par[0].Name := 'FilterName'; Par[0].Value := '<Alle Formate>'; Path := OO.FCP.getFileURLFromSystemPath('', Fil); OO.Cur.insertDocumentFromURL( Path, Par ); end; if LowerCase( GetExt(Fil) ) = '.odt' then begin Path := OO.FCP.getFileURLFromSystemPath('', Fil); OO.Cur.insertDocumentFromURL( Path, VarArrayCreate([0, - 1], varVariant) ); end; end; |
Das Dumme ist nur es wird ein Seitenumbruch vorangestellt.
Grüße von der Nordsee
Peter
|
|
|