Autotext ohne Format
Moderator: Moderatoren
Autotext ohne Format
Hallo,
per Makro möchte ich eine umfangreiche Liste mit Autotexten generieren. Das klappt auch ganz prima. Was mich stört, ist dass alle meien Autexte ein Format haben.
Beispiel: Ich generriere mit der Vorlage "Standard". Möchte dann aber an eine Textstelle einfügen die mit "Besonderes Format" formatiert ist und die Einträge sollen ebenso formatiert werden.
Beim manuellen Erstellen der Autotexte kann man "nur-Text" wählen, mir scheint, das ergibt so in etwa das, was ich brauche. Wie aber macht man das bei atomatischer Autotext-Generigerung per Makro??
Die entscheidende Codezeile bei mir lautet:
oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor)
Der AbsatzCursor wird entsprechend vorher gesetzt usw.
Ich freue mich auf Hilfe.
Stefan
per Makro möchte ich eine umfangreiche Liste mit Autotexten generieren. Das klappt auch ganz prima. Was mich stört, ist dass alle meien Autexte ein Format haben.
Beispiel: Ich generriere mit der Vorlage "Standard". Möchte dann aber an eine Textstelle einfügen die mit "Besonderes Format" formatiert ist und die Einträge sollen ebenso formatiert werden.
Beim manuellen Erstellen der Autotexte kann man "nur-Text" wählen, mir scheint, das ergibt so in etwa das, was ich brauche. Wie aber macht man das bei atomatischer Autotext-Generigerung per Makro??
Die entscheidende Codezeile bei mir lautet:
oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor)
Der AbsatzCursor wird entsprechend vorher gesetzt usw.
Ich freue mich auf Hilfe.
Stefan
Re: Autotext ohne Format
Aloha
Versuch mal statt
das hier:
Versuch mal statt
Code: Alles auswählen
oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor)
Code: Alles auswählen
oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor.Text)
Re: Autotext ohne Format
Danke für den Tipp, aber das ergibt eine Fehlermeldung. Die Funtkion oAutoGroup.insertNewByName erwartet als drittes Argument ein Objekt vom Typ AbsatzCursor, also eben ein Objekt MIT Formatierung.
Stefan
Stefan
Re: Autotext ohne Format
Aloha
XAutoTextGroup erwartet ein Argument vom Typ XTextRange.
Zufälligerweise liefert .getText ein Objekt mit dem Interface XText, welches wiederum das Interface XTextRange beinhaltet.
Bei mir funktioniert das Ganze ohne Fehlermeldung und tut auch genau das, was Du wolltest, sprich beim Einfügen werden keine Formatierungen mitgebracht, sondern die lokal eingestellten verwendet.
delta9 hat geschrieben:Die Funtkion oAutoGroup.insertNewByName erwartet als drittes Argument ein Objekt vom Typ AbsatzCursor, also eben ein Objekt MIT Formatierung.

XAutoTextGroup erwartet ein Argument vom Typ XTextRange.
Zufälligerweise liefert .getText ein Objekt mit dem Interface XText, welches wiederum das Interface XTextRange beinhaltet.
Bei mir funktioniert das Ganze ohne Fehlermeldung und tut auch genau das, was Du wolltest, sprich beim Einfügen werden keine Formatierungen mitgebracht, sondern die lokal eingestellten verwendet.
Re: Autotext ohne Format
Bei mir kommt dann eine Fehlermeldung:
"Es ist eine Exception aufgetreten. Type com.su.star.xml.sax.SAXINVALIDCharacterException.
Message invalid character during xml export."
Schlimmer noch. Dieser Befehl ruiniert irgendwie meine Autotext-Gruppe. Sie ist dann da aber auch nicht mehr da und bereitete mir eine Menge Ärger.
Befehle wie
zeigen schon im Schleifenkopf Fehler usw. usw.
Kann es daran liegen, dass ich oo1.1 benutze?
Stefan
"Es ist eine Exception aufgetreten. Type com.su.star.xml.sax.SAXINVALIDCharacterException.
Message invalid character during xml export."
Schlimmer noch. Dieser Befehl ruiniert irgendwie meine Autotext-Gruppe. Sie ist dann da aber auch nicht mehr da und bereitete mir eine Menge Ärger.
Befehle wie
Code: Alles auswählen
for i= 0 to oAutoTextContainer.count-1
Kann es daran liegen, dass ich oo1.1 benutze?
Stefan
Re: Autotext ohne Format
Aloha
Da oben beschriebenes Vorgehen wie gesagt bei mir (Windows XP, OOo 3.1.1) reibungslos funktioniert, liegt diese Vermutung natürlich nahe.
Ich kann den Fehler auch nicht reproduzieren, so dass ich eigentlich nur raten kann, mal eine neuere Version zu testen.
Da oben beschriebenes Vorgehen wie gesagt bei mir (Windows XP, OOo 3.1.1) reibungslos funktioniert, liegt diese Vermutung natürlich nahe.
Ich kann den Fehler auch nicht reproduzieren, so dass ich eigentlich nur raten kann, mal eine neuere Version zu testen.
Re: Autotext ohne Format
Nun habe ich OO Version 2 probiert, damit klappt es auch nicht, der Fehler ist nur ein anderer:
Obwohl das Programm mit bis auf mein Foramtproblem anstandslos klappt und einzeln angesprungende Textstellen als Autotext genommen werden,
wird bei bei für alle Autotexte immmer das gesamte Vorlagendokument aös Autotext genommen!!??
Darf ich fragen wie Du den AbsatzCursor definiert hast? Ich habe es so gemacht:
Oder kann es daran liegen, dass der Absatzcursor irgendwie nicht bis zum Zeilendende oder vm Zeilenanfang stehen darf, damit er keine Formate "trägt"
Obwohl das Programm mit
Code: Alles auswählen
oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor)
wird bei bei
Code: Alles auswählen
oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor.text)
Darf ich fragen wie Du den AbsatzCursor definiert hast? Ich habe es so gemacht:
Code: Alles auswählen
dim AbsatzCursor
AbsatzCursor = oText.CreateTextCursor()
Re: Autotext ohne Format
Aloha
Du hast Recht - warum auch immer mir das nie aufgefallen ist
Als Workaround kannst Du folgende 2 Zeilen vor dem insertNewByName einfügen, nachdem Du mit dem Cursor an die gewünschte Stelle gesprungen bist:
Du hast Recht - warum auch immer mir das nie aufgefallen ist

Als Workaround kannst Du folgende 2 Zeilen vor dem insertNewByName einfügen, nachdem Du mit dem Cursor an die gewünschte Stelle gesprungen bist:
Code: Alles auswählen
'**********
MyTextRange = CreateUnoService("com.sun.star.text.TextRange")
MyTextRange.String = AbsatzCursor.String
'**********
oAutoGroup.insertNewByName( Kuerzel, Eintragname, MyTextRange )
Re: Autotext ohne Format
Hört sich interessant an, klappt aber leider immer noch nicht.
Die Zeile
meldet "Objektvariable nicht belegt"
Füge ich ein
gibt es keinen Fehler, aber die Formatierung ist wieder drin.
Die Zeile
Code: Alles auswählen
MyTextRange.String = AbsatzCursor.String
Füge ich ein
Code: Alles auswählen
MyTextRange = AbsatzCursor
Re: Autotext ohne Format
Aloha
Woran das liegt, kann ich Dir nicht sagen, ohne Deinen Code gesehen zu haben - evtl Schreibfehler.
Das heisst, das entweder MyTextRange oder AbsatzCursor bei Dir ein Null-Objekt ist.delta9 hat geschrieben:Die Zeile meldet "Objektvariable nicht belegt"
Woran das liegt, kann ich Dir nicht sagen, ohne Deinen Code gesehen zu haben - evtl Schreibfehler.
Natürlich, wenn Du diese Zuweisung verwendest kannst Du auf die TextRange auch gleich verzichten und AbsatzCursor als 3. Argument übergeben.delta9 hat geschrieben:Füge ich eingibt es keinen Fehler, aber die Formatierung ist wieder drin.Code: Alles auswählen
MyTextRange = AbsatzCursor
Re: Autotext ohne Format
Ich habe genau die Zeilen genommen, wie du geschrieben hast. Demnach muss MyTextRange ja ein Nullobjekt sein?
Schicke mir doch mal Deine Code, bei dem es funktioniert.
Unten mein Code.
Stefan
Schicke mir doch mal Deine Code, bei dem es funktioniert.
Unten mein Code.
Stefan
Code: Alles auswählen
option explicit
sub aufnehmen
aufnehmen1(0)
end sub
sub loeschen
aufnehmen1("Bausteine Energie1")
end sub
sub aufnehmen1(Loeschname)
' *********************************
' * Sucht Texteinträge für autotext
' Aufbau:
' Nur Zeilen, die mit * anfangen, haben einen Eintrag
' der Aufrbau ist wie Folgt:
' *_Tabulator_Kürzel_Tabulator_Eingtag bis Absatzende (Unterstriche exitsieren nicht)
' Wenn nur Loeschname, dann wird nur diese Gruppe gelöscht
' Endet bei MArke STOPP Tab Text Tab Text
' *********************************
dim nur_loeschen as boolean
if Loeschname = 0 then
nur_loeschen = false
else
nur_loeschen = true
end if
const MaxAbsatzZahl = 1000
Const GruppenNameAutotext = "Bausteine Energie"
dim NameAutoGruppe
dim quelldatei as object ' Blatt, in dem die Autotextdaten stehen
Dim oText
Dim i
dim AbsatzZaehler
dim zeichen as string
dim AbsatzCursor
dim eintragzaehler ' Anzah der gefundenen Einträge
dim PosErstzeichen as integer ' Nummer des ersten Zeichens des Textabuseins (nach Stern und Kürzel)
dim Kuerzel as string
dim textbaustein as object
dim s1
dim oAutoTextContainer
dim oAutoGroup
dim AutotextBaustein
dim oAutoGroupIndex
dim Eintragname as string
dim fehlertext as string
' Initialisieren
if nur_loeschen then
NameAutoGruppe = loeschname
else
NameAutoGruppe = GruppenNameAutotext
end if
quelldatei = thiscomponent
oText = quelldatei.Text
AbsatzCursor = oText.CreateTextCursor()
AbsatzCursor.GoToStart(False)
oAutoTextContainer = CreateUnoService("com.sun.star.text.AutoTextContainer")
eintragzaehler = 0
dim gefunden
dim oProgressbar
oProgressbar = ThisComponent.GetCurrentController.GetFrame.CreateStatusIndicator
oProgressbar.setText("Start Mustertexte Lesen", 100 )
gefunden = false
for i= 0 to oAutoTextContainer.count-1 ' contanier suchen
' msgbox "Container: ( " & I & ") : =" & oAutoTextContainer.GetByIndex(i).Title
If oAutoTextContainer.GetByIndex(i).Title = NameAutoGruppe then
oAutoGroupIndex = i
gefunden = True
end if
next i
if gefunden = false then
Msgbox "Autotextgruppe: '" & NameAutoGruppe & "' nicht gefunden."
if nur_loeschen then
msgbox "Zu loeschender Bautsein:: " & NameAutoGruppe & " nicht gefunden"
exit sub
endif
oautoTextcontainer.insertNewByName NameAutoGruppe
msgbox "Autotextgruppe: '" & NameAutoGruppe & "' neu erzeugt."
oProgressbar.setText ( "Autotextgruppe: '" & NameAutoGruppe & "' neu erzeugt.", 100)
else
msgbox "Autotextgruppe: '" & NameAutoGruppe & "' gefunden."
if oAutoTextContainer.count < 1 then ' füllen um zu löschen, sonst gehts nicht
msgbox "Autotextgruppe: '" & NameAutoGruppe & " war leer."
AbsatzCursor.gotoNextParagraph(True)
AbsatzCursor.gotoNextParagraph(True)
AbsatzCursor.gotoNextParagraph(True)
oAutoGroup.insertNewByName ( "dummy", "dummychen", AbsatzCursor)
end if
'GOTO XXX
oAutoGroup = oAutoTextContainer.GetByName (NameAutoGruppe )
dim b
do while oAutoGroup.haselements
b = oAutoGroup.elementnames(0)
xray.xray oAutoGroup.getbyname (b)
' oAutoGroup.getbyname (b).implementationname = "SwXAutoTextEntry"
oProgressbar.SetText("Löschen " & b , 100 )
oAutoGroup.removeByname (b)
loop
XXX:
oautoTextcontainer.removeByName NameAutoGruppe
if nur_loeschen then
msgbox "Zu loeschender Bautsein: " & NameAutoGruppe & " geloescht"
exit sub
end if
oautoTextcontainer.insertNewByName NameAutoGruppe
oProgressbar.setText ( "Autotextgruppe: '" & NameAutoGruppe & "' gelöscht und neu erzeugt.", 100)
msgbox "Autotextgruppe: '" & NameAutoGruppe & "' gelöscht und neu erzeugt"
end if
oAutoGroup = oAutoTextContainer.GetByName (NameAutoGruppe)
' Das es offensichtlich nicht reicht, den Textbausteincontainer zu löschen,müssen alle eventuellen Einträge gelöscht werden:
oProgressbar.SetText("Löschen Vorhandener Einträge", 100 )
dim a
do while oAutoGroup.haselements
a = oAutoGroup.elementnames(0)
oProgressbar.SetText("Löschen " & a , 100 )
oAutoGroup.removeByname (a)
loop
'Schleife durch Absätze *************************************************
oProgressbar.SetText("Start Schleife", 100 )
AbsatzZaehler = 0
Do While AbsatzCursor.gotoNextParagraph(True)
zeichen = left(AbsatzCursor.String,1)
if zeichen = "*" then
' msgboy "gefunden: " & AbsatzCursor.String
rausziehen(AbsatzCursor.String, PosErstzeichen, kuerzel)
If PosErstzeichen <= 0 then
select case PosErstzeichen
case -1: Fehlertext = "FEHLER: Leerzeichen im Kürzel in: " & chr(13) & AbsatzCursor.String
case -2: Fehlertext = "FEHLER" & chr(13) & "Erster Tabulator fehlt in: " & chr(13) & AbsatzCursor.String
case -3: Fehlertext= "FEHLER" & chr(13) & "Zweiter Tabulator fehlt in: " & chr(13) & AbsatzCursor.String
case else: Fehlertext = "FEHLER SONST poserstzeichen = " & PosErstzeichen & " in: " & chr(13) & AbsatzCursor.String
end select
msgbox fehlertext
else
AbsatzCursor.collapsetostart()
AbsatzCursor.goRight(PosErstzeichen-1,false)
AbsatzCursor.gotoEndOfParagraph(True)
' msgbox "Gefunden" & chr(13) & "Tabulator in Pos: " & Poserstzeichen & chr(13) _
' & "ausgewertet: " & AbsatzCursor.string & chr(13) & "Kürzel: " & Kuerzel
Eintragname = kuerzel ' & " " & AbsatzCursor.string
' on error goto kuerzelfehler
' AbsatzCursor.ParaStyleName= "_Musterabsatz"
'**********
dim AbsatzCursorX
AbsatzCursorX = oText.CreateTextCursor()
dim MyTextRange
MyTextRange = CreateUnoService("com.sun.star.text.TextRange")
'MyTextRange = AbsatzCursor
'xray.xray MyTextRange
'MyTextRange.String = "OTTO"
MyTextRange.String = AbsatzCursor.String
'**********
'AbsatzCursorX.string = AbsatzCursor.string
oAutoGroup.insertNewByName( Kuerzel, Eintragname, MyTextRange)
'oAutoGroup.insertNewByName( Kuerzel, Eintragname, MyTextRange )
' oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor)
on error goto 0
'
' xray.xray oAutoGroup' .getbyindex(oAutoGroup.count-1)
' dim c
' c = oAutoGroup.getbyindex(oAutoGroup.count-1)
' c.start.parastylename = "Standard"
eintragzaehler = eintragzaehler +1
oProgressbar.SetText("Eingetragen: " & eintragzaehler & " " & Kuerzel, 100 )
goto weiter
kuerzelfehler:
msgbox "Fehler bei Kürzel: " & Kuerzel &chr(13) & "Kürzel doppelt vergeben?"
on error goto 0
weiter:
AbsatzCursor.collapsetoend()
AbsatzCursor.GoRight(1,false)
AbsatzZaehler = AbsatzZaehler +1
if AbsatzZaehler > MaxAbsatzZahl then
msgbox "Ende nicht gefunden nach " & MaxAbsatzZahl & " Absätzen"
exit do
end if
end if ' PosErstzeichen <= 0
else
AbsatzCursor.collapsetoend()
' AbsatzCursor.GoRight(1,false)
AbsatzZaehler = AbsatzZaehler +1
if AbsatzZaehler > MaxAbsatzZahl then
msgbox "Ende nicht gefunden nach " & MaxAbsatzZahl & " Absätzen"
exit do
end if
end if ' Zeichen = "*"
' msgbox "AbsatzZaehler: " & AbsatzZaehler & " Kuerzel:" & Kuerzel & " Zeichen = " & Zeichen
IF KUERZEL = "STOPP" then
msgbox "Stoppmarke gefunden"
exit do
end if
Loop
msgbox "Fertig! " & eintragzaehler & " Einträge gefunden."
end sub
sub rausziehen(prueftext, PosErstzeichen as integer, kuerzel as string) as string
' ***************************************
' liefert das Kürzel das ein Leezeichen nach dem dritten Zeichen beginn
' PosErstzeichen = die Position, wo der Autotexteeingtrag begeinnt
' Dies ist der Text nach dem Tabulatuor
' PosErstzeichen = -1 , wenn Leerzeichen im Kürzel enthalten ist
' PosErstzeichen = -2 , wenn erster Tabulator fehlt
' PosErstzeichen = -3 , wenn zweiter Tabulator fehlt
' ***************************************
dim i as integer
dim zeichen as string
PosErstzeichen = 0
zeichen = mid(prueftext,2,1)
if asc(zeichen) <> 9 then
PosErstzeichen = -2
exit sub
end if
i = 2
do while i < len(prueftext)
i = i +1
zeichen = mid(prueftext,i,1)
'msgboy "prüftext: " & prueftext & "zeichen(" & i & ") = " & zeichen & " acs= " & asc(zeichen)
' if asc(zeichen) = 32 then
' PosErstzeichen = -1
' exit do
' end if
if asc(zeichen) = 9 then
PoserstZeichen = i + 1 ' Tabulator nicht mitzählen
exit do
end if
loop
if i >= len(prueftext) then PosErstzeichen = -3
kuerzel = mid(prueftext,3,PosErstzeichen-2-2)
if instr(kuerzel," ") <> 0 then PosErstzeichen = -1
end sub
sub test
end sub
Re: Autotext ohne Format
Aloha
Hier mal der Beispielcode, um Autotexte zu erstellen, ohne dass sie ihre Formatierung mitbringen:
Hier mal der Beispielcode, um Autotexte zu erstellen, ohne dass sie ihre Formatierung mitbringen:
Code: Alles auswählen
Dim oDoc, oAutoTextContainer, oText, oCursor, oMyAutoTexts, oMyTextRange
oDoc = thisComponent
oAutoTextContainer = CreateUnoService("com.sun.star.text.AutoTextContainer")
oMyTextRange = CreateUnoService("com.sun.star.text.TextRange")
oText = oDoc.Text
oCursor = oText.createTextCursor
oCursor.gotoStart(False)
oCursor.gotoEndOfParagraph(True)
oMyTextRange.String = oCursor.String
oMyAutoTexts = oAutoTextContainer.getByName("mytexts")
If NOT oMyAutoTexts.hasByName("kurz") Then
oMyAutoTexts.insertNewByName("kurz","Titel",oMyTextRange)
End If
Re: Autotext ohne Format
Oh, vielen Dank! Jetzt klappt es, prima.
Bleibt nur noch die philosophische Frage warum bei
von OO1 ein leeres Objekt angemeckert wird, OO2 sich darum aber nicht schert?
Bleibt nur noch die philosophische Frage warum bei
Code: Alles auswählen
oMyTextRange.String = oCursor.String
Re: Autotext ohne Format
Aloha
002 würde sich um ein leeres Objekt genauso scheren - dort ist es aber kein leeres Objekt, sondern ein TextRange-Service.
Ich vermute, dass es den TextRange-Service in 001 noch nicht gab oder aber der genaue "Pfad" zum Service ein anderer war.
CreateUnoServie liefert bei Erfolg den entsprechenden Service, bei Misserfolg ein Null-Objekt zurück, und zwar ohne jegliche Fehlermeldung.
Sprich: gibt es den Service gar nicht oder hast Du auch nur einen Buchstabendreher drin, dann nimmt OOBasic das erstmal einfach nur hin und lässt Dich mit einem Null-Objekt weitermachen.
Genau das ist in Deinem Fall geschehen - den Service "com.sun.star.text.TextRange" gibt es in OO1 in dieser Form nicht -> MyTextRange wird ein Null-Objekt zugewiesen.
002 würde sich um ein leeres Objekt genauso scheren - dort ist es aber kein leeres Objekt, sondern ein TextRange-Service.
Ich vermute, dass es den TextRange-Service in 001 noch nicht gab oder aber der genaue "Pfad" zum Service ein anderer war.
CreateUnoServie liefert bei Erfolg den entsprechenden Service, bei Misserfolg ein Null-Objekt zurück, und zwar ohne jegliche Fehlermeldung.
Sprich: gibt es den Service gar nicht oder hast Du auch nur einen Buchstabendreher drin, dann nimmt OOBasic das erstmal einfach nur hin und lässt Dich mit einem Null-Objekt weitermachen.
Genau das ist in Deinem Fall geschehen - den Service "com.sun.star.text.TextRange" gibt es in OO1 in dieser Form nicht -> MyTextRange wird ein Null-Objekt zugewiesen.