Seite 1 von 1
Teilchart Verschieben
Verfasst: So, 15.11.2020 21:18
von wonk
Hallo,
ich habe eine *.ods mit einigen hundert Zeilen. Um die Daten in einem Chart vernünftig übersehen zu können, stelle ich immer nur 60 Zeilen in einem Chart dar. Diesen Chart kann ich mit dem folgenden Makro verschieben:
Code: Alles auswählen
Sub plus_60
Z = Z + 60
args(0).Name = "Name"
args(0).Value = "Object 1"
args(1).Name = "Range"
args(1).Value = "$Tabelle1.$C$" & Z & ":$C$" & Z + 60
args(2).Name = "ColHeaders"
args(2).Value = false
args(3).Name = "RowHeaders"
args(3).Value = false
dispatcher.executeDispatch(document, ".uno:ChangeChartData", "", 0, args())
End Sub
Allerdings wird die Spalte B zur Beschriftung der X-Achse verwendet. Dieses wird hiermit nicht verändert.
Funktioniert dies auch mit dem obigen Service mit weiteren Argumenten (mir fehlt die Doku dazu)?
Oder kann man das nur anders aufziehen?
Gruss, wonk
Re: Teilchart Verschieben
Verfasst: Mo, 16.11.2020 06:31
von Stephan
es sollte gehen:
Code: Alles auswählen
Sub plus_60
Z = Z + 60
args(0).Name = "Name"
args(0).Value = "Object 1"
args(1).Name = "Range"
args(1).Value = "$Tabelle1.$B$" & Z & ":$C$" & Z + 60
args(2).Name = "ColHeaders"
args(2).Value = false
args(3).Name = "RowHeaders"
args(3).Value = true
dispatcher.executeDispatch(document, ".uno:ChangeChartData", "", 0, args())
End Sub
Gruß
Stephan
Re: Teilchart Verschieben
Verfasst: Mo, 16.11.2020 11:49
von wonk
Hallo,
daran hatte ich auch gedacht, aber das funktioniert so leider nicht. Der Bereich zur x-Achsenbeschriftung (hier Spalte B) wird dann für eine weitere Datenreihe verwendet.
Ich habe auch mal ein Makro zum nachträglichen Einfügen der x-Achsenbeschriftung aufgezeichnet, um zu sehen welche Funktionen da verwendet werden. Das funktioniert aber auch nicht, das Makro ist weitgehend "leer". Kann das daran liegen, das in den Einstellungen keine JRE eingetragen ist?
Gruss, wonk
Re: Teilchart Verschieben
Verfasst: Mo, 16.11.2020 13:25
von Stephan
daran hatte ich auch gedacht, aber das funktioniert so leider nicht. Der Bereich zur x-Achsenbeschriftung (hier Spalte B) wird dann für eine weitere Datenreihe verwendet.
Für mich nicht nachvollziehbar.
Bei mir tritt das nur ein, wenn ich die Werte für "ColHeader"s und "RowHeaders" tesrtweise auf false setze, nicht jedoch wenn, wie in meinem Code-Vorschlag "RowHeaders" auf true gesetzt wird.
Gruß
Stephan
Re: Teilchart Verschieben
Verfasst: Mo, 16.11.2020 15:01
von wonk
Sorry, sorry, sorry
die Veränderung hatte ich in Deinem Code übersehen!
Funktioniert jetzt!
Danke!
Habe aber noch eine andere Frage:
Ich habe verschiedene "Verschieben"-Subs. In ALLEN habe ich jeweils dem Aray args alle Werte neu zu gewiesen, was eigentlich blöd ist. Es gelingt mir aber weder das Aray zu übergeben, noch es global zu deklarieren. Es ist ein Objekt:
oberhalb von Sub Main im Modul deklariert.
Wenn ich übrigens Sub Main aufrufe, "flackern" die auf dem Chart angelegten Schaltflächen.
Gruss, wonk
Re: Teilchart Verschieben
Verfasst: Mo, 16.11.2020 18:36
von Stephan
Es gelingt mir aber weder das Aray zu übergeben,
Die Übergabe des Arrays könntest Du so erledigen:
Code: Alles auswählen
Sub starten()
dim args(3) as new com.sun.star.beans.PropertyValue
Z = 30
Z = Z + 60
args(0).Name = "Name"
args(0).Value = "Object 1"
args(1).Name = "Range"
args(1).Value = "$Tabelle1.$A$" & Z & ":" & "$B$" & Z+30
args(2).Name = "ColHeaders"
args(2).Value = false
args(3).Name = "RowHeaders"
args(3).Value = true
plus_60(args())
End Sub
Sub plus_60(par)
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:ChangeChartData", "", 0, par)
End Sub
noch es global zu deklarieren
mmh ... eigentlich nur Global davorschreiben:
Code: Alles auswählen
Global args(3) as new com.sun.star.beans.PropertyValue
Aber Global scheint mir hier garnicht nötig weil, zumindest unter Windows
(*), ein Dim genügt (bitte den Unterschied beachten das der Aufruf von "Sub plus_60" jetzt ohne Parameterübergabe erfolgt):
Code: Alles auswählen
Dim args(3) as new com.sun.star.beans.PropertyValue
Sub starten()
Z = 30
Z = Z + 60
args(0).Name = "Name"
args(0).Value = "Object 1"
args(1).Name = "Range"
args(1).Value = "$Tabelle1.$A$" & Z & ":" & "$B$" & Z+30
args(2).Name = "ColHeaders"
args(2).Value = false
args(3).Name = "RowHeaders"
args(3).Value = true
plus_60
End Sub
Sub plus_60
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:ChangeChartData", "", 0, args())
End Sub
(*)
Bitte nicht missverstehen, der Geltungsbereich einer Variable (auch einer Property-Value-Variable) ist eigentlich nicht Betriebssystemabhängig, aber erfahrungsgemäß braucht es bei StarBasic unter Linux manchmal ein Public, wo unter Windowes ein Dim genügt.
Gruß
Stephan
Re: Teilchart Verschieben
Verfasst: Di, 17.11.2020 11:38
von wonk
Hallo,
bevor ich zu den Problem komme: Ich habe den Eindruck, dass das Makro "unterschiedlich" reagiert. Wenn ich das Makro editiere, kommt es häufig vor, dass die Syntaxerkennung des LO-Editors nicht arbeitet. D.h., größere Teile des Quellcodes belieben schwarz. Ich dachte bisher, das hat nichts zu sagen. Oder kann es sein, dass dann irgendetwas "unsichtbares"(????) zu nicht korrektem Code führt? Wenn ich den Teil dann markiere und die Markierung wieder entferne, ist die Syntax wieder korrekt erkannt (Farben grün, blau, rot).
Eine globale Deklaration von args(3) führt zur Fehlermeldung error.jpg (Anhang) beim Ausführen von:
Code: Alles auswählen
dispatcher.executeDispatch(document, ".uno:ChangeChartData", "", 0, args())
Zum Gültigkeitsbereich von Variablen: Wenn ich eine Variable mit dim im Modul oberhalb von Sub main deklariere, müsste sie doch global für das ganze Modul sein!? D.h., wenn ich sie in einer Sub verändere, ist das eine Veränderung ByRef!? Oder gilt das für Objektvariable vom Typ com.sun.star.beans.PropertyValue nicht?
Zur Zeit ist es so, dass ich sub Main einmal zu Beginn durch einen Button auf dem Chart aufrufe, die Variable wird dort initialisiert. Wenn ich danach durch einen anderen Button auf dem Chart z.B. Sub plus_60 aufrufe, sehe ich durch tracen, dass die Variable nicht mher initialisiert ist.
Oder haben die verschiedenen Subs eines Moduls keinen gemeinsamen Gültigkeitsbereich für Variablen?
Re: Teilchart Verschieben
Verfasst: Di, 17.11.2020 17:25
von Stephan
Eine globale Deklaration von args(3) führt zur Fehlermeldung error.jpg (Anhang) beim Ausführen von:
kann ich bestätigen (gestestet mit LO 6.0.3 Windows). Mir fällt auf das das Makro zunächst einmalig funktioniert und erst ab dem zweiten Durchlauf die Fehlermeldung kommt.
Zum Gültigkeitsbereich von Variablen: Wenn ich eine Variable mit dim im Modul oberhalb von Sub main deklariere, müsste sie doch global für das ganze Modul sein!?
Dim darf/muss strenggenommen nur innerhalb einer Sub gelten, obwohl OpenOffice Dim definitiv so funktionieren lässt (bzw. funktionieren lassen würde, wenn Du OO benutzt) wie Du es hier beschreibst.
Möglicherweise ist LibreOffice generell (also nicht nur unter Linux) regider und braucht unbedingt die Deklaration mittels Public. In jedem Falle wäre dieses Verhalten definitionsgemäß richtig.
Die Programm-Hilfe sagt:
... zu Dim:
"Dim deklariert lokale Variablen in Subroutinen. Globale Variablen werden mit den Anweisungen PUBLIC oder PRIVATE deklariert."
... zu Public:
"Dimensioniert eine Variable oder ein Array auf Modulebene (also nicht innerhalb eine Subroutine oder Funktion), sodass die Variable bzw. das Array in allen Bibliotheken und Modulen gültig ist."
zu Global:
"Dimensioniert eine Variable oder ein Array auf globaler Ebene (also nicht innerhalb eine Subroutine oder Funktion), sodass die Variable bzw. das Array in allen Bibliotheken und Modulen für die Dauer der aktuellen Sitzung gültig ist."
Ich zitiere hier nicht deswegen aus der Programmhilfe um meine Meinung zu unterstreichen, sondern meine formulierte Meinung habe ich nach dem Nachlesen in der Programmhilfe formuliert, denn gegenwärtig sind mir nur gewisse Probleme unter Linux , welche ich auch irgendwo im Thread schon kurz als existent angesprochen hatte.
Außerdem gestehe ich das ich durchaus auch selbst Variablen so nutze, wie Du es hier ansprichst, es gleichzeitig aber für besser halte wenn sie explizit an Unter-Routinen (Subs und Functions) als Parameter übergeben werden (siehe mein erstes Beispiel).
Das ist aber nur meine Meinung, es wäre interessant andere Meinungen dazu zu hören bzw. Begründungen die die eine oder die andere Methode als objektiv besser erscheinen lassen.
Gruß
Stephan
Re: Teilchart Verschieben
Verfasst: Mi, 18.11.2020 18:21
von wonk
Hallo,
ich habe es jetzt halbwegs am Laufen, wobei aber noch diverses seltsam ist. Das Bild als Idee, was das alles soll.
Code: Alles auswählen
global document as object
global dispatcher as object
global Wertezahl as integer
global Startwert as integer
dim args(3) as new com.sun.star.beans.PropertyValue 'ähnlich Recorddeklaration
sub Main
Startwert = 2
Wertezahl = 90
argsSetzen(2, 90)
End Sub
Sub plus_90
Startwert = Startwert + Wertezahl
argsSetzen(Startwert, Wertezahl)
End Sub
... 'diverse weitere solche Subs
Sub argsSetzen (Start as integer, Wert as integer)
args(0).Name = "Name"
args(0).Value = "Object 1"
args(1).Name = "Range"
args(1).Value = "$Tabelle1.$B$" & Start & ":$G$" & Start + Wert - 1
args(2).Name = "ColHeaders"
args(2).Value = false
args(3).Name = "RowHeaders"
args(3).Value = true
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 'für spätere Anwendung dispatcher
dispatcher.executeDispatch(document, ".uno:ChangeChartData", "", 0, args())
End Sub
Zur Deklaration im Kopf: Mit "public"-Deklarationen für die beiden Zahlwerte arbeitet das Makro "seltsam falsch", liegt aber evtl. daran, dass ich das Modul unter "Meine Makros" einsortiert habe, nicht unterhalb des calc-Documents (ich will es für mehre Dokumente verwenden). Die Idee des Makros stammt aus calc-info.de, der Author dort hat die Werte auf das Rechenblatt geschrieben und von dort wieder eingelesen. Die Übergabe an die Sub argsSetzen könnte man so natürlich auch noch lassen.
Kann es übrigens eine Rolle spielen, das als Laufzeitumgebung ursprünglich noch eine ganz alte Java-Version eingestellt war? - Aber ich programmiere ja nicht in Java.
Mir fällt immer noch auf das nach dem ersten Aufruf des Makros, genauer der letzten Zeile in argsSetzen die Oberfläche grafisch "flattert", als wenn in schneller Reihernfolge die Schaltflächen den Fokus erhalten. Das Problem ist, das ich über ".uno:ChangeChartData" ein KEINERLEI Doku in OO-Basic gefunden habe. Ich habe das nur aus dem Beispiel in calc-info.de. Das "flattern" führt anscheinend auch dazu, dass die Schaltflächen zum Teil erst beim 2.Anklicken reagieren, und dann manchmal die globalen Variablen leer sind - ich weiß - kann alles eigentlich nicht sein!????
Gruss, wonk