Autotext ohne Format

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Autotext ohne Format

Re: Autotext ohne Format

von DPunch » Fr, 26.03.2010 15:45

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.

Re: Autotext ohne Format

von stbuerk » Fr, 26.03.2010 14:23

Oh, vielen Dank! Jetzt klappt es, prima.

Bleibt nur noch die philosophische Frage warum bei

Code: Alles auswählen

 oMyTextRange.String = oCursor.String
von OO1 ein leeres Objekt angemeckert wird, OO2 sich darum aber nicht schert?

Re: Autotext ohne Format

von DPunch » Fr, 26.03.2010 12:26

Aloha

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

von delta9 » Fr, 26.03.2010 07:59

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


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

von DPunch » Do, 25.03.2010 15:26

Aloha
delta9 hat geschrieben:Die Zeile meldet "Objektvariable nicht belegt"
Das heisst, das entweder MyTextRange oder AbsatzCursor bei Dir ein Null-Objekt ist.
Woran das liegt, kann ich Dir nicht sagen, ohne Deinen Code gesehen zu haben - evtl Schreibfehler.
delta9 hat geschrieben:Füge ich ein

Code: Alles auswählen

MyTextRange = AbsatzCursor
gibt es keinen Fehler, aber die Formatierung ist wieder drin.
Natürlich, wenn Du diese Zuweisung verwendest kannst Du auf die TextRange auch gleich verzichten und AbsatzCursor als 3. Argument übergeben.

Re: Autotext ohne Format

von delta9 » Do, 25.03.2010 08:28

Hört sich interessant an, klappt aber leider immer noch nicht.
Die Zeile

Code: Alles auswählen

MyTextRange.String = AbsatzCursor.String
meldet "Objektvariable nicht belegt"
Füge ich ein

Code: Alles auswählen

MyTextRange = AbsatzCursor
gibt es keinen Fehler, aber die Formatierung ist wieder drin.

Re: Autotext ohne Format

von DPunch » Mi, 24.03.2010 13:58

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:

Code: Alles auswählen

'**********
MyTextRange = CreateUnoService("com.sun.star.text.TextRange")
MyTextRange.String = AbsatzCursor.String
'**********
oAutoGroup.insertNewByName( Kuerzel, Eintragname, MyTextRange )

Re: Autotext ohne Format

von delta9 » Mi, 24.03.2010 10:39

Nun habe ich OO Version 2 probiert, damit klappt es auch nicht, der Fehler ist nur ein anderer:
Obwohl das Programm mit

Code: Alles auswählen

oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor)
bis auf mein Foramtproblem anstandslos klappt und einzeln angesprungende Textstellen als Autotext genommen werden,
wird bei bei

Code: Alles auswählen

 oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor.text)
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:

Code: Alles auswählen

dim AbsatzCursor
AbsatzCursor = oText.CreateTextCursor()
Oder kann es daran liegen, dass der Absatzcursor irgendwie nicht bis zum Zeilendende oder vm Zeilenanfang stehen darf, damit er keine Formate "trägt"

Re: Autotext ohne Format

von DPunch » Di, 23.03.2010 15:51

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.

Re: Autotext ohne Format

von delta9 » Di, 23.03.2010 15:37

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

Code: Alles auswählen

for i= 0 to oAutoTextContainer.count-1 
zeigen schon im Schleifenkopf Fehler usw. usw.

Kann es daran liegen, dass ich oo1.1 benutze?

Stefan

Re: Autotext ohne Format

von DPunch » Mo, 22.03.2010 12:32

Aloha
delta9 hat geschrieben:Die Funtkion oAutoGroup.insertNewByName erwartet als drittes Argument ein Objekt vom Typ AbsatzCursor, also eben ein Objekt MIT Formatierung.
:shock:
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

von delta9 » Mo, 22.03.2010 09:54

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

Re: Autotext ohne Format

von DPunch » Fr, 19.03.2010 20:54

Aloha

Versuch mal statt

Code: Alles auswählen

oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor)
das hier:

Code: Alles auswählen

oAutoGroup.insertNewByName ( Kuerzel, Eintragname, AbsatzCursor.Text)

Autotext ohne Format

von delta9 » Fr, 19.03.2010 15:41

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

Nach oben