SearchDescriptor als Text-Cursor?

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

Moderator: Moderatoren

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

SearchDescriptor als Text-Cursor?

Beitrag von Mr.Ed »

Hallo zusammen,

habe einen SearchDescriptor "oSuche". Er sucht in einem Writer-Dokument nach Absätzen mit Textmustern von der Art "Fehler Nr. 1", "Fehler Nr. 2" ... "Fehler Nr. 20". Zwischen den jeweiligen Absätzen mit den Textmustern befinden sich mehrere Absätze als Fälle des jeweiligen Typs. Ich möchte nun alle Absätze, die unter "Fehler Nr. 1" (usw.) stehen, markieren, "ausschneiden" und in ein anderes Fenster schaffen, um sie dort weiter zu bearbeiten. Es will nicht gelingen. Hier der Code:

Code: Alles auswählen

Function AlFe1_bearbeiten
	Dim oDoc1 as Object, oTxt as Object, oSuche as Object, oSuchErg as Object, oTxtC as Object, oViewC as Object
	Dim oDoc2 as Object, sStr as String
	oDoc1 = ThisComponent
	oTxt = oDoc1.text
	oSuche = oDoc1.createSearchDescriptor()
	With oSuche
		.SearchRegularExpression = True
		.setSearchString("Fehler Nr. [:digit:]{1,2}")
	End With
	oSuchErg = oDoc1.findFirst(oSuche)
	oSuchErg = oDoc1.findNext(oSuchErg.End, oSuche)
	oSuchErg = oDoc1.gotoStart(true)
	sStr = oSuchErg.string
	oSuchErg.setString("")
	MsgBox sStr
End Function
"findFirst" und "findNext" werden brav ausgeführt. Wenn ich dann aber mit "gotoStart(true)" alle Absätze bis zum Anfang des Dokuments markieren will, gibt mir sStr kein Ergebnis zurück. - Die Literatur, die mir zur Verfügung steht, sagt, dass das Suchobjekt (createSearchDescriptor) ein vollwertiges Text-Cursor-Objekt (SwXTextCursor) zurückliefert, das dann genauso behandelt werden kann wie ein manuell erzeugter Text-Cursor. Also müsste es doch auch möglich sein, mit "gotoStart(true)" die Cursor-Auswahl auf alle Absätze bis zum Beginn des Textes auszuweiten. Hat jemand einen Tipp?

MfG Mr.Ed
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: SearchDescriptor als Text-Cursor?

Beitrag von DPunch »

Aloha
Mr.Ed hat geschrieben:Die Literatur, die mir zur Verfügung steht, sagt, dass das Suchobjekt (createSearchDescriptor) ein vollwertiges Text-Cursor-Objekt (SwXTextCursor) zurückliefert
Der SearchDescriptor liefert Dir gar nichts, sondern beschreibt nur die Vorgaben, unter denen Dir das "Dokument" selber eine (in der Regel) TextRange zurückliefern soll.
Die dann gefundene TextRange beinhaltet z.B. "Fehler Nr. 1". Der auf der TextRange basierende TextCursor hat als Start als sozusagen das F und als Ende die 1.
Ein .gotoStart wird den Cursor also dementsprechend navigieren.

Prinzipiell kannst Du das, was Du vorhast über mehrere Herangehensweisen lösen:
Nicht flexibel und quasi per Holzhammer:

Code: Alles auswählen

oSuchErg.goleft(65.535,True)
Über den Text des Dokuments

Code: Alles auswählen

oSuchErg.gotoRange(oSuchErg.Text.Start,True)
oder mit einem neuen Cursor

Code: Alles auswählen

oCursor = oTxt.createTextCursorByRange(oSuchErg)
oCursor.gotoStart(True)
Übrigens ist die Verwendung

Code: Alles auswählen

oSuchErg = oDoc1.gotoStart(true)
falsch bzw. sinnlos, die Navigationsmethoden haben keinen Rückgabewert (dass Du oDoc1 verwendest, wird wohl ein Schreibfehler gewesen sein).
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: SearchDescriptor als Text-Cursor?

Beitrag von Mr.Ed »

Vielen Dank,

deine klärenden Hinweise am Anfang kann ich jetzt gut nachvollziehen. Sie entsprechen genau dem, worauf ich bei meinen Texts gestoßen war (ohne es zu verstehen). - Zu deinen Lösungsvorschlägen:

Den Holzhammer lassen wir mal liegen. Interessant erscheinen die zweite und die dritte Lösungsmöglichkeit. Ich habe mich für die dritte entschieden, weil ich sie schnell nachvollziehen kann. Ich hatte auch schon versucht, mit einem Textcursor zu arbeiten, mich dabei aber wohl mit der Syntax (ByRange) verhaspelt. Jetzt funktioniert es, ich kann weitermachen! (Zusammenhänge erst mal sauber "in den Kopf kriegen", dann allmählich "vom Kopf in die Finger".)
Antworten