Teilchart Verschieben

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

Moderator: Moderatoren

wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Teilchart Verschieben

Beitrag 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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Teilchart Verschieben

Beitrag 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
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Teilchart Verschieben

Beitrag 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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Teilchart Verschieben

Beitrag 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
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Teilchart Verschieben

Beitrag 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:

Code: Alles auswählen

dim args(3) as new com.sun.star.beans.PropertyValue
oberhalb von Sub Main im Modul deklariert.
Wenn ich übrigens Sub Main aufrufe, "flackern" die auf dem Chart angelegten Schaltflächen.

Gruss, wonk
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Teilchart Verschieben

Beitrag 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
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Teilchart Verschieben

Beitrag 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?
Dateianhänge
error.jpg
error.jpg (8.27 KiB) 2558 mal betrachtet
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Teilchart Verschieben

Beitrag 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
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Teilchart Verschieben

Beitrag 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
Dateianhänge
Chart1.jpg
Chart1.jpg (79.87 KiB) 2430 mal betrachtet
Antworten