[Geloest:] ViewCursor platzieren

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

[Geloest:] ViewCursor platzieren

Beitrag von Mr.Ed »

Hallo zusammen,

ich bearbeite ein größeres Writer-Dokument. Darin gibt es bestimmte Textstellen, zum Beispiel "[10]", die ich mit einem SearchDescriptor finden kann. Immer wenn eine solche Stelle gefunden worden ist, möchte ich das Makro dort anhalten und dem Benutzer ermöglichen, bestimmte Textstellen im Umfeld des Suchergebnisses mit der Maus zu markieren und diesen Stellen dann per Dialog bestimmte Eigenschaften (farbiger Text, Fettdruck et cetera) zuzuweisen. Dazu muss natürlich das Suchergebnis für den Benutzer sichtbar gemacht werden.

SearchDescriptor erzeugt so etwas wie einen TextCursor. Man kann auch die unter SearchDescriptor gefundene Textstelle in einen TextCursor umwandeln (ByRange). Dies ist aber für den Benutzer nicht sichtbar. Um zu erreichen, dass der Benutzer die gefundene Textstelle sieht, müsste diese Textstelle als ViewCursor eingelesen und so sichtbar gemacht werden. (Ich weiß nicht, ob ich mich verständlich ausdrücke.)

Der Code, mit dem ich arbeite:

Code: Alles auswählen

Function DialogTest
	Dim oDoc1 as Object
	Dim oSuche as Object, oSuchErg as Object, oTxtC as Object, oViewC as Object
	Dim sStr as String, n as Integer, z as Integer, iInt as Integer
	oDoc1 = ThisComponent
	oSuche = oDoc1.createSearchDescriptor()
	With oSuche
		.SearchRegularExpression = true
		.SearchBackwards = false
		.setSearchString("\[10\]")
	End With
	oSuchErg = oDoc1.findFirst(oSuche)
	if not isNull(oSuchErg) then
		oTxtC = oDoc1.text.createTextCursorByRange(oSuchErg)
	else
		MsgBox "Kein Suchergebnis!"
	End if
	oViewC = oDoc1.getCurrentController().getViewCursor()
	oViewC.goRight(10, true)
End Function
Die letzten beiden Zeilen liefern natürlich kein vernünftiges Ergebnis, sondern nur eine Aktion, die auf den jeweils angeklickten Bereich (CurrentController) Bezug nimmt (ist nur ein Test).

Wie also kann ich einen ViewCursor erzeugen, der dem Benutzer bestimmte Textstellen anzeigt und ihm dort bestimmte Aktionen ermöglicht?

Vielleicht weiß jemand was? Vielleicht gibt es bereit einen Thread zu dem Thema, den ich nicht gefunden habe?

MfG Mr.Ed
Zuletzt geändert von Mr.Ed am Sa, 23.07.2011 12:12, insgesamt 1-mal geändert.
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: ViewCursor platzieren

Beitrag von Karolus »

Hallo
odoc.findFirst(osuche) ist auch ein Textrange das du mit oviewC.gotoRange( oSuchErg , false ) ansteuern kannst.
Besorge dir Xray und/oder MRI

( wieso setzt du .RegularExpression auf True und maskierst die Klammern in der literalen Suche nach '[10]' ? )

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: ViewCursor platzieren

Beitrag von Mr.Ed »

Vielen Dank, Karo,

es funktioniert, so komme ich weiter. Mit der Methode gotoRange ist es wirklich ganz einfach. Aber so ist es, glaube ich, oft: Gerade nach einfachen Sachen sucht man sich die Finger wund. Die sind so einfach und selbstverständlich, dass man sie kaum irgendwo dokumentiert findet. - Xray habe ich seit Längerem installiert. Ich brauche wohl noch etwas Übung damit. - Der Code ist jetzt so:

Code: Alles auswählen

Function DialogTest
	Dim oDoc1 as Object
	Dim oSuche as Object, oSuchErg as Object, oViewC as Object
	oDoc1 = ThisComponent
	oViewC = oDoc1.getCurrentController().getViewCursor()
	oSuche = oDoc1.createSearchDescriptor()
	With oSuche
		.SearchRegularExpression = false
		.SearchBackwards = false
		.setSearchString("[10]")
	End With
	oSuchErg = oDoc1.findFirst(oSuche)
	if not isNull(oSuchErg) then
		oViewC.gotoRange(oSuchErg, false)
	else
		MsgBox "Kein Suchergebnis!"
	End if
End Function
Wegen der Suche mit RE = true und der Maskierung hast du natürlich recht. Ich hatte es gestern auch ohne RE versucht, klappte aber aus irgendwelchen Gründen nicht, vielleicht Tippfehler.

Gruß Mr.Ed
Antworten