[gelöst:] Ende eines Dokuments (EOF) erkennen

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

Moderator: Moderatoren

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

[gelöst:] Ende eines Dokuments (EOF) erkennen

Beitrag von Mr.Ed »

Hallo allerseits,

folgender Code führt zu einer Fehlermeldung "Basic-Laufzeitfehler. Objektvariable nicht belegt.", wenn der Textcursor (oSuchErg) sich am Ende des Writer-Dokuments befindet:

Code: Alles auswählen

		oSuche = oDoc1.createSearchDescriptor()
		With oSuche
			.SearchRegularExpression = false
			.SearchBackwards = false
			.setSearchString("}")
		End With
		oSuchErg = oDoc1.findNext(oSuchErg.End, oSuche)
Wenn ich versuche, den Fehler mit folgendem Code abzufangen, bekomme ich eine Meldung "Basic-Laufzeitfehler. Sub- oder Function-Prozedur nicht definiert.":

Code: Alles auswählen

		oSuche = oDoc1.createSearchDescriptor()
		With oSuche
			.SearchRegularExpression = false
			.SearchBackwards = false
			.setSearchString("}")
		End With
		If Not isEOF(oSuchErg) Then
			oSuchErg = oDoc1.findNext(oSuchErg.End, oSuche)
		else Exit Do
		End If
Kurz zum Zusammenhang: Es geht darum, ein längeres Writer-Dokument Absatz für Absatz durchzuarbeiten und dabei bestimmte Erläuterungen, die durch geschweifte Klammern eingeschlossen sind, jeweils an den Anfang des Absatzes zu setzen. Also:

Dies ist {Erläuterung 1}ein kurzer {Erläuterung 2}Beispieltext. ===>
{Erläuterung 1}{Erläuterung 2}Dies ist ein kurzer Beispieltext.

Das Ganze funktioniert über viele Absätze hinweg mit dem ersten Code wunderbar. Die Fehlermeldung taucht erst auf, wenn das Ende des Dokuments erreicht ist. Deshalb mein Versuch, den Fehler am Ende des Dokuments (EOF) mit der Abfrage abzufangen.

Hat jemand eine Idee, wie ich die Abfrage klüger formulieren kann? Kann jemand andere Hinweise geben?

MfG Mr.Ed
Zuletzt geändert von Mr.Ed am Do, 06.09.2012 18:36, insgesamt 1-mal geändert.
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: [gelöst:] Ende eines Dokuments (EOF) erkennen

Beitrag von Mr.Ed »

Hallo Stephan, hallo andere Leser im Forum,

Meister Pitonyak in allen Ehren, aber zur Lösung meines Problems konnte er diesmal nichts beitragen, denn dieses Problem beruhte ausschließlich auf meiner Unerfahrenheit im Umgang mit relativ komplexen Strukturen. Der Code läuft jetzt, und für alle, die es interessiert (und bitte nur für diese, ich will sonst niemanden belästigen, das Problem ist ja gelöst), gebe ich jetzt die komplette Do-Loop-Schleife wieder:

Code: Alles auswählen

REM Nun müssen die geschweiften Klammern vorgezogen werden.
	oSuche = oDoc1.createSearchDescriptor()
	With oSuche
		.SearchRegularExpression = false
		.SearchBackwards = false
		.setSearchString("}")
	End With
	oSuchErg = oDoc1.findFirst(oSuche)
	Do while Not isNull(oSuchErg)
		oSuchErg.gotoEndOfParagraph(false)						'ans Absatzende	
		oSuche = oDoc1.createSearchDescriptor()
		With oSuche
			.SearchRegularExpression = true
			.SearchBackwards = true
			.setSearchString("\{[^\{]{1,}\}")					'Letztes Vorkommen von "{...}" im Absatz
		End With
		oSuchErg = oDoc1.findNext(oSuchErg.End, oSuche)
		If Not isNull(oSuchErg) Then
			oSuchErg.goLeft(1, true)
			sStr = oSuchErg.string
			sStr2 = Mid(sStr, 1, 1)								'Zeichen vor "{...}" in sStr2 festhalten
			oSuchErg.goRight(1, true)
			If sStr2 <> "}" Then
				sStr = oSuchErg.string
				oSuchErg.setString("")
				oSuche = oDoc1.createSearchDescriptor()
				With oSuche
					.SearchRegularExpression = true
					.SearchBackwards = true
					.setSearchString("[:digit:]{2}\.[:digit:]{2}\.[:digit:]{2}\t[:digit:]{1,2}\.\t")
				End With
				oSuchErg = oDoc1.findNext(oSuchErg.End, oSuche)
				oSuchErg.collapseToEnd()
				oSuchErg.setString(sStr)						'sStr am Anfang des Absatzes auslesen
				oSuche = oDoc1.createSearchDescriptor()
				With oSuche
					.SearchRegularExpression = false
					.SearchBackwards = false
					.setSearchString("}")
				End With
				oSuchErg = oDoc1.findNext(oSuchErg.End, oSuche)	'nächstes Vorkommen von "}" suchen
			else
				oSucherg.gotoEndOfParagraph(false)
				oSuche = oDoc1.createSearchDescriptor()
				With oSuche
					.SearchRegularExpression = false
					.SearchBackwards = false
					.setSearchString("}")
				End With
				oSuchErg = oDoc1.findNext(oSuchErg.End, oSuche)	'nächstes Vorkommen von "}" suchen
			End If
		End If
	Loop
Es war also mein Problem, ich durfte am Ende der Schleife nicht noch einmal nach "}" suchen lassen. Stattdessen musste diese Suche am Ende der beiden Zweige der If-Else-Abfrage stehen. - Ein Denker, den ich sehr schätze und von dem ich vielleicht mehr verstehe als vom Programmieren, hat einmal gesagt:
Es ist schon ein großer und nötiger Beweis der Klugheit oder Einsicht, zu wissen, was man vernünftiger Weise fragen solle. Denn, wenn die Frage an sich ungereimt ist, und unnötige Antworten verlangt, so hat sie, außer der Beschämung dessen, der sie aufwirft, bisweilen noch den Nachteil, den unbehutsamen Anhörer derselben zu ungereimten Antworten zu verleiten, und den belachenswerten Anblick zu geben, daß einer (wie die Alten sagten) den Bock melkt, der andre ein Sieb unterhält.
Ich bin der unvernünftige Frager und nehme die Beschämung auf mich! Ansonsten: Großes Kompliment diesem Forum und Dank an alle, die auch für unvernünftige Frager eine Antwort zu finden versuchen!

Mit freundlichen Grüßen Mr.Ed
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: [gelöst:] Ende eines Dokuments (EOF) erkennen

Beitrag von Stephan »

Meister Pitonyak in allen Ehren, aber zur Lösung meines Problems konnte er diesmal nichts beitragen, denn dieses Problem beruhte ausschließlich auf meiner Unerfahrenheit im Umgang mit relativ komplexen Strukturen.
In Letzterem lag auch mein Problem, das aber eher zeitlicher Natur war. Ich hatte auf den Cofde von Pinoniak verwiesen weil er zwar eine andere Variante vorstellt aber funktioniert. Für DEinen konkreten Code hatte ich leider keine Zeit diesen zu debuggen und eine funktionierende fertige LÖsung zu liefern und wollte mich nicht auf nur Andeutungen beschränken.

Somit hat Du Recht insofern meine Antwort keine zielgenaue Lösung für den vorgegebenen Code darstellte.


Gruß
Stephan
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: [gelöst:] Ende eines Dokuments (EOF) erkennen

Beitrag von Karolus »

Hallo

Mit den Möglichkeiten aus Python ist die ganze Aufgabe in rund 15 Codezeilen zu lösen:

Code: Alles auswählen

import re

context = XSCRIPTCONTEXT

curlymatch = re.compile(r'\{.*?\}')

def curly_groups_to_front():
    doc = context.getDocument()
    text = doc.Text
    for paragraph in iterable( text ):
        paratext = paragraph.getString()
        curlytext = ''.join( curlymatch.findall( paratext ) )
        paragraph.setString( curlytext + curlymatch.sub( '', paratext ))


def iterable( enumerable ):
    enum = enumerable.createEnumeration()
    while enum.hasMoreElements():
        yield enum.nextElement()
Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Antworten