Seite 1 von 1

Makro, aber elegant statt aufgezeichnet ...

Verfasst: Mo 19. Aug 2019, 13:00
von Butch
Hallo!

Könnte mir jemand hier am folgenden Beispiel zeigen, wie man ein aufgezeichnetes Writer-Makro in eine elegante Form umschreibt?
Das Makro fügt nur drei Zeichen (|A|), allerdings in rot, fett, unterstrichen und gelb hervorgehoben, in den Text ein.

Vielen Dank im Voraus!

Z.

Code: Alles auswählen

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Text"
args1(0).Value = "|A|"

dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Count"
args2(0).Value = 3
args2(1).Name = "Select"
args2(1).Value = true

dispatcher.executeDispatch(document, ".uno:GoLeft", "", 0, args2())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "Bold"
args5(0).Value = true

dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(2) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Underline.LineStyle"
args6(0).Value = 1
args6(1).Name = "Underline.HasColor"
args6(1).Value = false
args6(2).Name = "Underline.Color"
args6(2).Value = -1

dispatcher.executeDispatch(document, ".uno:Underline", "", 0, args6())

rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "Color"
args7(0).Value = 13181214

dispatcher.executeDispatch(document, ".uno:Color", "", 0, args7())

rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "BackColor"
args8(0).Value = 16776960

dispatcher.executeDispatch(document, ".uno:CharBackgroundExt", "", 0, args8())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Escape", "", 0, Array())


end sub

Re: Makro, aber elegant statt aufgezeichnet ...

Verfasst: Mo 19. Aug 2019, 16:48
von Butch
Ergänzung: So weit wäre ich schon: siehe unten. Wie könnte man für oString die Formatierungen angeben?

Code: Alles auswählen

Sub Test
  Dim oDoc As Object
  Dim oText As Object
  Dim oVCurs As Object
  Dim oTCurs As Object
  Dim oString As String
          
  oDoc = ThisComponent
  oText = oDoc.Text
  oVCurs = oDoc.CurrentController.getViewCursor()
  oTCurs = oText.createTextCursorByRange(oVCurs.getStart())
  ' Place the text to insert here
  oString = "|A|"
  oText.insertString(oTCurs, oString, FALSE)
End Sub

Re: Makro, aber elegant statt aufgezeichnet ...

Verfasst: Mo 19. Aug 2019, 17:54
von craig
Hallo Butch,

nutze die Debug-Funktionen der Basic-IDE:
Stichwörter:
  • Ansicht --> Zeilennummerierung
  • Haltepunkte
  • Prozedurschritte
  • Nutze den "Beobachter" für die Untersuchung der Variablen, in Kombination mit den Haltepunkten
  • Achte auf die Programmier-Konventionen ,
    ist besonders hilfreich bei längeren Codes und es ist für Helfer eine Erleichterungen gepostete Codes zu "entschlüsseln"
  • Lade Dir hier das Codeinspektionstool siehe Abschnitt X-RAY Tool
    Es handelt sich hierbei um eine deutschsprachige Writerdatei mit Makros. Lese die Anleitung, wie diese Tool verwendet wird.
Achte auf die Kommentare im Code:

Code: Alles auswählen

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

Sub Test
  Dim oDoc As Object
  Dim oText As Object
  Dim oVCurs As Object
  Dim oTCurs As Object

' Präfix s, weil STRING und nicht o wie OBJECT
' siehe Konventionen:
' https://wiki.openoffice.org/wiki/DE/Makro_Basic_Tutorial  
  Dim sString As String	
          
  oDoc = ThisComponent
  oText = oDoc.Text
  
  oVCurs = oDoc.CurrentController.getViewCursor()
  oTCurs = oText.createTextCursorByRange(oVCurs.getStart())
  ' Place the text to insert here
  With oTCurs
  		.CharBackColor=RGB(255,255,0)
  		.CharColor=RGB(255,0,0)
' https://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/FontWeight.html
' https://www.openoffice.org/api/docs/common/ref/com/sun/star/awt/FontWeight.html#BOLD
  		.CharWeight=150.000000
  End With
  sString = "|A|"
  oText.insertString(oTCurs, sString, FALSE)
End Sub

Re: Makro, aber elegant statt aufgezeichnet ...

Verfasst: Mo 19. Aug 2019, 19:55
von Butch
Wunderbar, besten Dank, craig, das funktioniert schon mal.
Ein Nachteil: Beim Rückgängigmachen wird nur der Text entfernt, nicht aber die Formatierung ...

Re: Makro, aber elegant statt aufgezeichnet ...

Verfasst: Mo 19. Aug 2019, 20:06
von craig
Hallo Butch,

Makro's werden schrittweise abgearbeitet, deshalb musst Du ggf. mehrere Schritte zurückgehen.