Da die bisherigen Anwendungen funktionieren, würd ich die Version nur ändern wollen, wenn es unbedingt sein muss.
Aktuell will ich eine Datei erstellen, die wie folgt aussieht, indem ich für jede Zeile InsertText und InsertPara aufrufe:
Code: Alles auswählen
procedure TOpenOffice.InsertText(Text:string);
var
OODispatcher:variant;
Ar,SM:variant;
begin
SM:=CreateOleObject('com.sun.star.ServiceManager');
OODispatcher:=SM.CreateInstance('com.sun.star.frame.DispatchHelper');
Ar:=VarArrayCreate([0,0],varVariant);
Ar[0]:=SM.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
Ar[0].Name:='Text';
Ar[0].Value:=Text;
OODispatcher.ExecuteDispatch(FDocument.GetCurrentController.GetFrame,'.uno:InsertText', '', 0, Ar);
OODispatcher:=Unassigned;
Ar:=Unassigned;
SM:=Unassigned;
end;
Code: Alles auswählen
procedure TOpenOffice.InsertPara; // Zeilenumbruch
var
OODispatcher:variant;
Ar,SM:variant;
begin
SM:=CreateOleObject('com.sun.star.ServiceManager');
OODispatcher:=SM.CreateInstance('com.sun.star.frame.DispatchHelper');
Ar:=VarArrayCreate([0,0],varVariant);
OODispatcher.ExecuteDispatch(FDocument.GetCurrentController.GetFrame,'.uno:InsertPara', '', 0, Ar);
OODispatcher:=Unassigned;
Ar:=Unassigned;
SM:=Unassigned;
end;

Soweit so gut, jetzt soll aber vor jeder Zeile ein Icon stehen.
Unten die dafür benutzte Methode InsertGraphic, die ich vor Inserttext aufrufe.
Das Ergebnis ist ein einziges (das letzte geladene) Icon und kein Text:

Klicke ich im Dokument rum, während die Fernsteuerung läuft, so dass das gerade geladene Icon den Fokus verliert, werden weitere Bilder eingefügt.
Ich nehme daher an, dass das Problem ist, dass das Icon den Fokus hat und dadurch ein erneutes Laden das alte Icon überschreibt. Warum der Text nicht erscheint, ist mir aber noch etwas rätselhaft.
Fragen: Wie werde ich den Fokus nach dem Laden der Grafik los? Hab versucht, den Cursor zu setzen mit GoToEndOfLine, aber das blieb ohne sichtbare Auswirkung. Oder gibt es einen anderen Ansatz wie man das Problem löst? Welche Argumente müsste ich dem InsertGraphic mitgeben, um die Größe des Bilds zu beeinflussen? Width und Height hatten keinen Effekt.
Code: Alles auswählen
procedure TOOWriter.InsertGraphic(Datei:string);
var
OODispatcher:variant;
Ar,SM:variant;
begin
SM:=CreateOleObject('com.sun.star.ServiceManager');
OODispatcher:=SM.CreateInstance('com.sun.star.frame.DispatchHelper');
Ar:=VarArrayCreate([0,0],varVariant);
Ar[0]:=SM.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
Ar[0].Name:='FileName';
Ar[0].Value:='file:///'+ StringReplace(Datei, '\', '/', [rfReplaceAll]);
OODispatcher.ExecuteDispatch(FDocument.GetCurrentController.GetFrame,'.uno:InsertGraphic', '', 0, Ar);
Ar:=VarArrayCreate([0,0],varVariant);
OODispatcher.ExecuteDispatch(FDocument.GetCurrentController.GetFrame,'.uno:SetAnchorToChar', '', 0, Ar); // "als zeichen" formatieren
OODispatcher:=Unassigned;
Ar:=Unassigned;
SM:=Unassigned;
end;
Meine Suche nach einer Doku der möglichen Befehle und Parameter war bisher noch erfolglos.
Carsten