Makro : Textstellen finden und formatieren

Hallo,

ich habe schon mal Makros für OO geschrieben, bin aber etwas eingerostet
...

Nun brauche ich etwas Starthilfe.

Ich möchte ein Makro schreiben, dass in einem Writer-Dokument, die mit
'#' markierten Textstellen erkennt, den Text fett macht und die
Schriftgröße um 2 erhöht.

Mein Problem ist : Wie finde ich Textstellen in einem Text?

Ich möchte das nicht mit Textmarken lösen! (Das ist für den, der den
Text schreibt zu umständlich.)
http://www.dannenhoefer.de/faqstarbasic/WiekannichaneineTextmarkespringenundText.html#Zweig250

Vielen Dank für alle Tipps!

lg
Klaus

Hallo,

klaus garen schrieb:

Ich möchte ein Makro schreiben, dass in einem Writer-Dokument,
die mit '#' markierten Textstellen erkennt, den Text fett macht
und die Schriftgröße um 2 erhöht.

Mein Problem ist : Wie finde ich Textstellen in einem Text?

Ich möchte das nicht mit Textmarken lösen! (Das ist für den,
der den Text schreibt zu umständlich.)

Ich hatte ein Makro zur Arbeitserleichterung erstellt, das etwas
Ähnliches macht: Es sucht ein bestimmtes Wort und formatiert die
betreffende Zeile fett.

Es ist leider nur mittels Makrorekorder im Dispatcher-Stil
aufgebaut und nicht mit der UNO-API...

Könnte ich Dir bei Interesse mailen.

Gruß
Stefan

Hallo,

mit Hilfe von :
http://www.wollmux.net/wiki/images/f/f9/Makro_Kochbuch.pdf (seite 176)

ich finde nun prinzipiell die Textstelle.

Code s.u.

Ich verstehe aber findnext(xtextrange).End nicht

Was soll dieses ".End" bedeuten?

Danke für jeden Tipp!

lG
Klaus

REM ***** BASIC *****

Option Explicit
public const VON as string = "*"
public const BIS as string = "~"

Sub formatiereMyTextstellen
  dim oDoc as object 'xDocument
  dim osdStart as object 'xSearchDescriptor
  dim otrStart as object 'xTextRange
  dim osdEnd as object 'xSearchDescriptor
  dim otrEnd as object 'xTextRange
    
  oDoc = thisComponent
  
  osdStart = oDoc.createSearchDescriptor()
  osdStart.setSearchString(VON)
  otrStart = oDoc.findFirst(osdStart)
  if IsNull(otrStart) then exit sub 'stop wenn kein ergebnis
  
  osdEnd = oDoc.createSearchDescriptor()
  osdEnd.setSearchString(BIS)
  otrEnd = oDoc.findFirst(osdEnd)
  if IsNull(otrEnd) then exit sub 'stop, wenn kein
  
  otrStart.gotoRange(oDoc.findnext(otrStart.End, osdEnd).End,true)
  msgbox otrStart.getString()

End Sub

Hallo Klaus,

hier eine Lösung für deine Frage:

Sub pSuchenUndAendern
     Dim oDok As Object, oSK As Object, oTK As Object, oSuche As Object, oFund As Object
     Dim i As Integer
     Const sSuche = "#"
     oDok = ThisComponent
     oSK = oDok.CurrentController.ViewCursor
     oTK = oSK.Text.CreateTextCursorByRange(oSK)
     oSuche = oDok.CreateSearchDescriptor()
     oSuche.SearchString = sSuche
     oFund = oDok.FindFirst(oSuche)
     While Not IsNull(oFund)
         oTK.GotoRange(oFund, FALSE)
         oTK.GotoStartOfParagraph(FALSE)
         oTK.GotoEndOfParagraph(TRUE)
         i = oTK.Start.CharHeight
         oTK.CharHeight = i + 2
         oTK.CharWeight = com.sun.star.awt.FontWeight.BOLD '/ .NORMAL
         oFund = oDok.FindNext(oTK.End, oSuche)
     Wend
End Sub

Gruß

Andreas

hallo,

so klappt es !

die stellen, die formatiert werden sollen beginnen mit einem '<' und
enden mit einem leerzeichen!

lg
jochen

code:

Option Explicit
public const VON as string = "<"
public const BIS as string = " "

Sub formatiereMyTextstellen
GlobalScope.BasicLibraries.LoadLibrary("Tools")
    dim oDoc as object 'xDocument
    dim osdStart as object 'xSearchDescriptor
    dim otrStart as object 'xTextRange
    dim osdEnd as object 'xSearchDescriptor
    dim otrEnd as object 'xTextRange
    dim i as integer
    dim otxt as String
       
    oDoc = thisComponent
   
    osdStart = oDoc.createSearchDescriptor()
    osdStart.setSearchString(VON)
    otrStart = oDoc.findFirst(osdStart)
    if IsNull(otrStart) then exit sub 'stop wenn kein ergebnis

    osdEnd = oDoc.createSearchDescriptor()
    osdEnd.setSearchString(BIS)
    otrEnd = oDoc.findFirst(osdEnd)
    if IsNull(otrEnd) then exit sub 'stop, wenn kein

    otrStart.gotoRange(oDoc.findnext(otrStart.End, osdEnd).End,true)
    i = otrStart.Start.CharHeight
    otrStart.CharHeight = i + 4
    otrStart.CharWeight = com.sun.star.awt.FontWeight.BOLD
       otrStart.CharPosture= com.sun.star.awt.FontSlant.NONE
    otxt = otrStart.getString()
    otrStart.setString(DeleteStr(otxt,VON))
   
    do until isNull(otrStart)
        otrStart=oDoc.findNext(otrStart.End,osdStart)
        if IsNull(otrStart) then exit sub 'stop wenn kein ergebnis
        otrStart.gotoRange(oDoc.findnext(otrStart.End, osdEnd).End,true)
   
        otrStart.CharHeight = i + 4
        otrStart.CharWeight = com.sun.star.awt.FontWeight.BOLD
        otrStart.CharPosture= com.sun.star.awt.FontSlant.NONE
        otxt = otrStart.getString()
        otrStart.setString(DeleteStr(otxt,VON))
        'msgbox otrStart.getString()
    loop

End Sub

Jochen georges schrieb:

code:

Option Explicit
public const VON as string = "<"
public const BIS as string = " "

Sub formatiereMyTextstellen
[...]

Hallo,

ich hänge mich mal hierdran, weil ich diesen und auch Andreas'
Vorschlag sehr brauchbar finde, und meine gefrickelte Dispatcher-
Lösung mit einem der beiden ersetzen möchte.

Meine Anforderung wäre allerdings, eine Kennung bzw. ein Suchwort
zu finden und dann den Textrange bis auf das Zeilenende (nicht
Absatzende!) zu erweitern, bevor er formatiert wird.
Oder wahlweise die ganze Zeile, weil das Suchwort immer am
Zeilenanfang ist.

Ist es z.B. irgendwie möglich (auf Deinen Vorschlag bezogen), das
Zeilenende in den BIS-String zu codieren?

Stefan

A Dreier schrieb:

Sub pSuchenUndAendern
[...]

Schöne Lösung, siehe auch mein anderes Posting...

Hiermit wird der ganze Absatz, in dem die Suchkennung steht,
formatiert.

Gibt es hier die Möglichkeit, nur die betreffende Zeile (hier mit
manuellem Zeilenbruch versehen) auszuwählen?

Stefan

Hallo Stefan,

so müsste es gehen (siehe die Änderungen zwichen "'#>>" und "'<<#":

Sub pSuchenUndAendern
     Dim oDok As Object, oSK As Object, oTK As Object, oSuche As Object, oFund As Object
     Dim i As Integer
     Const sSuche = "#"
     oDok = ThisComponent
     oSK = oDok.CurrentController.ViewCursor
     oTK = oSK.Text.CreateTextCursorByRange(oSK)
     oSuche = oDok.CreateSearchDescriptor()
     oSuche.SearchString = sSuche
     oFund = oDok.FindFirst(oSuche)
     While Not IsNull(oFund)
         oTK.GotoRange(oFund, FALSE)
         oTK.GotoStartOfParagraph(FALSE)
         '#>> Geändert:
         'oTK.GotoEndOfParagraph(TRUE)
         oSK.GotoRange(oTK, FALSE)
         oSK.GotoEndOfLine(TRUE)
         oTK.GotoRange(oSK, FALSE)
         '<<#
         i = oTK.Start.CharHeight
         oTK.CharHeight = i + 2
         oTK.CharWeight = com.sun.star.awt.FontWeight.BOLD '/ .NORMAL
         oFund = oDok.FindNext(oTK.End, oSuche)
     Wend
End Sub

Alternativ könntest du auch nach dem manuell eingefügten Zeilenumbruch (= Chr(13)) suchen lassen.

Gruß

Andreas

Hallo Andreas,

A Dreier schrieb:

so müsste es gehen (siehe die Änderungen zwichen "'#>>" und
"'<<#":
[...]
         '#>> Geändert:
         'oTK.GotoEndOfParagraph(TRUE)
         oSK.GotoRange(oTK, FALSE)
         oSK.GotoEndOfLine(TRUE)
         oTK.GotoRange(oSK, FALSE)
         '<<#

Tatsächlich geht das sehr gut, danke. Auf die Funktion
GotoEndOfLine war ich auch schon gestoßen, wusste aber nicht
richtig, auf welches Objekt sie zu beziehen ist...

Interessant ist, dass damit wirklich ans Ende der jeweiligen
Zeile gesprungen wird, egal ob sich dort ein harter Zeilenumbruch
befindet oder nicht.

Gruß,
Stefan

Stefan Gruber schrieb:

Meine Anforderung wäre allerdings, eine Kennung bzw. ein
Suchwort zu finden und dann den Textrange bis auf das
Zeilenende (nicht Absatzende!) zu erweitern, bevor er
formatiert wird. Oder wahlweise die ganze Zeile, weil das
Suchwort immer am Zeilenanfang ist.

Ist es z.B. irgendwie möglich (auf Deinen Vorschlag bezogen),
das Zeilenende in den BIS-String zu codieren?

Ich habe dafür eine Möglichkeit gefunden. Es geht über reguläre
Ausdrücke:

Option Explicit
public const VON as string = ">"
public const BIS as string = "\n"

Sub formatiereMyTextstellen
  GlobalScope.BasicLibraries.LoadLibrary("Tools")
  dim oDoc as object 'xDocument
  dim osdStart as object 'xSearchDescriptor
  dim otrStart as object 'xTextRange
  dim osdEnd as object 'xSearchDescriptor
  dim otrEnd as object 'xTextRange
  dim i as integer
  dim otxt as String

  oDoc = thisComponent

  osdStart = oDoc.createSearchDescriptor()
  osdStart.setSearchString(VON)
  otrStart = oDoc.findFirst(osdStart)
  if IsNull(otrStart) then exit sub 'stop wenn kein
ergebnis

  osdEnd = oDoc.createSearchDescriptor()
  osdEnd.SearchRegularExpression = True
  osdEnd.setSearchString(BIS)
  otrEnd = oDoc.findFirst(osdEnd)
  if IsNull(otrEnd) then exit sub 'stop, wenn kein

  otrStart.gotoRange(oDoc.findnext(otrStart.End,
osdEnd).End,true)
  i = otrStart.Start.CharHeight
  otrStart.CharHeight = i + 4
  otrStart.CharWeight = com.sun.star.awt.FontWeight.BOLD
  otrStart.CharPosture= com.sun.star.awt.FontSlant.NONE
  otxt = otrStart.getString()
  otrStart.setString(DeleteStr(otxt,VON))

  do until isNull(otrStart)
    otrStart=oDoc.findNext(otrStart.End,osdStart)
    if IsNull(otrStart) then exit sub 'stop wenn kein
ergebnis
    otrStart.gotoRange(oDoc.findnext(otrStart.End,
osdEnd).End,true)

    otrStart.CharHeight = i + 4
    otrStart.CharWeight =
com.sun.star.awt.FontWeight.BOLD
    otrStart.CharPosture=
com.sun.star.awt.FontSlant.NONE
    otxt = otrStart.getString()
    'otrStart.setString(DeleteStr(otxt,VON))
    'msgbox otrStart.getString()
  loop
End Sub

Stefan

Hi Klaus, *,

Ich möchte ein Makro schreiben, dass in einem Writer-Dokument, die mit
'#' markierten Textstellen erkennt, den Text fett macht und die
Schriftgröße um 2 erhöht.

Nur der Vollständigkeithalber, und weniger als Antwort für dich:

Für so eine Aufgabenstellung ist auch Suchen und Ersetzen mit der
aktivierten Option "Regulärer Ausdruck" geeignet.
→ "Finde Alle" (→ alle entsprechenden Textstellen werden selektiert)
und dann entweder hart formatieren, oder besser eine Zeichenvorlage
zuweisen.

Mein Problem ist : Wie finde ich Textstellen in einem Text?

Ein Regulärer Ausdruck, der alle Wörter mit einem vorangestelltem "#"
findet wäre z.B. folgender:

#\S+

(\S → "kein Freiraumzeichen", + → "eins oder mehrere")

ciao
Christian

Hallo zusammen,

ich setze LibreOffice
Version: 4.2.4.2
Build-ID: 63150712c6d317d27ce2db16eb94c2f3d7b699f8

ein.

Wenn ich mehrere Zeilen markiere, um für diese die Tabulatoren zu setzen, geht das nicht mehr en Block.
Nur noch zeilenweise.

Gruss

Klaus

Hallo Klaus,

Version: 4.2.4.2
Build-ID: 63150712c6d317d27ce2db16eb94c2f3d7b699f8

ein.

Wenn ich mehrere Zeilen markiere, um für diese die Tabulatoren zu
setzen, geht das nicht mehr en Block.
Nur noch zeilenweise.

Hier geht's nach wie vor gleichzeitig für alle markierten Zeilen.

Das hat mir keine Ruhe gelassen.

Es geht tatsächlich nicht, wenn man von einem anderen Rechner eine Datei kopiert hat, deren Schrifttype NICHT auf dem eigenen Rechner installiert ist.

Klaus