Simpel, aber - Kapitälchen per Makro ein/ausschalten
Verfasst: Do, 17.03.2005 17:28
Hallo!
Ich möchte eins vorwegschicken: Ich kenne mich mit StarBasic nicht aus und wurstle daher mit Code-Teilen herum, die der Makro-Recorder erstellt hat. Aber ganz so blöd, daß ich so ein eigentlich einfaches Problem, wie ich es hier beschreiben werde, nicht lösen kann, bin ich normalerweise nicht. (Oder eben doch? :oops: )
Um es anders zu sagen: Ich bin kein Freund von MS Word, aber manches geht da wirklich einfacher.
Das Problemchen: Ich möchte Fett, Kursiv, Unterstrichen und eben auch Kapitälchen per Tastatur ein- und ausschalten können (mit EINER Tastenkombination, nicht jeweils einer für an und aus!). Word: Makro-Recorder an, Attribut per Menü oder Icon klicken, Recorder aus, fertig. Weil: VBA verwendet die toggle-Funktion, d. h. der Wahrheitswert eines Attributs wird einfach umgekehrt. Wenn ein Wort schon kursiv ist und ich klicke auf kursiv, dann wird es "normal" - und umgekehrt.
Selbe Prozedur in OOo 1.1.4: Wenn ich aufzeichne, wie ich ein nicht-kursives Wort kursiv setze, dann wird nur genau das Einschalten aufgezeichnet. Wenn ich also mit demselben Makro auf ein schon kursives Wort zugreife, tut sich nichts, es bleibt kursiv.
Aber gut, ganz so leicht gebe ich nicht auf, und schließlich habe ich das Kursiv-Makro soweit umgebaut, das es klappt. Und so sieht es aus:
Unverständnis Nr. 2: Warum die rotmarkierte Zeile da nicht stehen darf (mit "rem" natürlich schon)? Nach meinem Verständnis müßte sie da zwingend hin.
Aber gut. Daß aus Recorder-Aufzeichnungen zusammengestückelter Code nicht das Optimum ist, weiß ich - und es funktioniert ja. Soweit, so gut also.
Aber mit den Kapitälchen geht das nicht so einfach.
Hier ein Testcode, mit dem die Kapitälchen eingeschaltet werden, "Kapitälchen" geschrieben wird und anschließend die Kapitälchen wieder ausgeschaltet werden:
Funktioniert aber nicht. Ich bekomme nur ein Einschalten ODER ein Ausschalten (je nachdem, wie herum ich abfrage) hin. Warum, weshalb? Ich weiß es nicht.
Wer hat eine Idee? Oder noch besser, einen anderen, besseren Weg, dieses an sich unglaublich winzige Problem zu lösen?
Bin dankbar für jede Hilfe!
Ich möchte eins vorwegschicken: Ich kenne mich mit StarBasic nicht aus und wurstle daher mit Code-Teilen herum, die der Makro-Recorder erstellt hat. Aber ganz so blöd, daß ich so ein eigentlich einfaches Problem, wie ich es hier beschreiben werde, nicht lösen kann, bin ich normalerweise nicht. (Oder eben doch? :oops: )
Um es anders zu sagen: Ich bin kein Freund von MS Word, aber manches geht da wirklich einfacher.
Das Problemchen: Ich möchte Fett, Kursiv, Unterstrichen und eben auch Kapitälchen per Tastatur ein- und ausschalten können (mit EINER Tastenkombination, nicht jeweils einer für an und aus!). Word: Makro-Recorder an, Attribut per Menü oder Icon klicken, Recorder aus, fertig. Weil: VBA verwendet die toggle-Funktion, d. h. der Wahrheitswert eines Attributs wird einfach umgekehrt. Wenn ein Wort schon kursiv ist und ich klicke auf kursiv, dann wird es "normal" - und umgekehrt.
Selbe Prozedur in OOo 1.1.4: Wenn ich aufzeichne, wie ich ein nicht-kursives Wort kursiv setze, dann wird nur genau das Einschalten aufgezeichnet. Wenn ich also mit demselben Makro auf ein schon kursives Wort zugreife, tut sich nichts, es bleibt kursiv.
Aber gut, ganz so leicht gebe ich nicht auf, und schließlich habe ich das Kursiv-Makro soweit umgebaut, das es klappt. Und so sieht es aus:
Unverständnis Nr. 1: Warum muß ich zwei Variablen (args1 und args2, die Benennungen habe ich vom Recorder übernommen) verwenden?sub Kursiv
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 = "Italic"
If args1(0).value = true Then
args1(0).value = false
dispatcher.executeDispatch(document, ".uno:Italic", "", 0, args1())
Else
dim args2(0) as new com.sun.star.beans.PropertyValue
rem args2(0).Name = "Bold"
args2(0).value = true
dispatcher.executeDispatch(document, ".uno:Italic", "", 0, args2())
End if
end sub
Unverständnis Nr. 2: Warum die rotmarkierte Zeile da nicht stehen darf (mit "rem" natürlich schon)? Nach meinem Verständnis müßte sie da zwingend hin.
Aber gut. Daß aus Recorder-Aufzeichnungen zusammengestückelter Code nicht das Optimum ist, weiß ich - und es funktioniert ja. Soweit, so gut also.
Aber mit den Kapitälchen geht das nicht so einfach.
Hier ein Testcode, mit dem die Kapitälchen eingeschaltet werden, "Kapitälchen" geschrieben wird und anschließend die Kapitälchen wieder ausgeschaltet werden:
Nicht sehr kompliziert, dachte ich. Muß man doch bloß die if-Struktur vom Kursiv-Makro nehmen, die als .Name "CaseMap"-Werte setzen und statt true und false 0 und 4 abfragen.Sub Kapitaelchentest
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 = "CaseMap"
args1(0).Value = 4
dispatcher.executeDispatch(document, ".uno:CaseMap", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Text"
args2(0).Value = "Kapitälchen"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args2())
rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "CaseMap"
args3(0).Value = 0
dispatcher.executeDispatch(document, ".uno:CaseMap", "", 0, args3())
End Sub
Funktioniert aber nicht. Ich bekomme nur ein Einschalten ODER ein Ausschalten (je nachdem, wie herum ich abfrage) hin. Warum, weshalb? Ich weiß es nicht.
Wer hat eine Idee? Oder noch besser, einen anderen, besseren Weg, dieses an sich unglaublich winzige Problem zu lösen?
Bin dankbar für jede Hilfe!