Wie die Größe der Diagrammwand ändern?

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

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Wie die Größe der Diagrammwand ändern?

Beitrag von balu »

Hallo liebe Gemeinde.

Hab auch mal wieder ein Problem mit einem Diagramm. Und zwar möchte ich die Größe, genauer die Höhe, der Diagrammwand per Makro einstellen.

Position und Größe des Diagramm ist so weit kein Problem. Jedoch die Diagrammwand, also der Teil wo die ausgewerteten Daten angezeigt werden, bekomme ich nicht geändert.

Um z.B. der Diagrammwand eine Füllfarbe zuzuordnen, geht man ja über Wall zu der FillColor. Jedoch finde ich mit XRAY bei Wall nix was die Größe ändern könnte.

Auch wenn mir nach echten Schlaflosen Nächten deswegen der Kopf brummt, und mein englisch sowieso nicht das beste ist, hatte ich das WWW durchstöbert und im englischsprachigen Forum hier etwas gefunden was hätte vielleicht helfen können, auch wenn es dort um Java in OO anstatt Starbasic geht. Jedoch wurde dort als "gelöster Workaround" folgendes mitgeteilt.
I has resolved this by setting the RelativePosition and RelativeSize properties of chart2.XDiagram.
Aber selbst das bekomme ich nicht auf die Reihe, da ich nicht verstehe wie er das angestellt hat.

Meine Frage lautet jetzt also an Euch:
Wie kann ich die Größe der Diagrammwand ändern/einstellen?

Ich habe eine kleine einfache Beispieldatei angehängt, damit ihr es etwas leichter beim Testen habt. Auch wenn ich mit LO 5.1.5.2 arbeite (muss), so ist das wohl ein Generelles Problem.

Freue mich schon sehr auf Eure antworten, und bedanke mich schon mal für Eure Bemühungen.



Gruß
balu
Dateianhänge
Testdiagramm_wegen_DiagrammWand-groesse.ods
(14.89 KiB) 122-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von Stephan »

ich habe keine Ahnung wie das geht.

Wenn ich im Diagramm die Diagrammwand markiere und dieses Makro darauf loslasse:

Code: Alles auswählen

Sub sel()
x = ThisComponent.getCurrentSelection
Msgbox x(0).size.width 'dbg_properties


Dim NewSize As New com.sun.star.awt.Size
NewSize.width = 18000
NewSize.Height = x(0).size.Height
x(0).setSize(NewSize)

End Sub
wird zwar die Größe geändert, aber die des ganzen Diagramms. Augenscheinlich orientiert sich LO an der 'äußeren' Selektion und greift garnicht auf die Diagrammwand zu. Bezogen auf Deinen Code, sollte Obiges entsprechen:

chart2.Area.Size



Gruß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von balu »

Hallo Stephan,

erstmal eine Danke schön vorweg für deine Bemühungen.

ich habe keine Ahnung wie das geht.
Aber dafür scheine ich jetzt wohl auf dem "richtigen" Weg zu sein, habe aber die Lösung noch nicht hinbekommen, doch dazu gleich mehr.

Wenn ich im Diagramm die Diagrammwand markiere und dieses Makro darauf loslasse:
[...]
wird zwar die Größe geändert, aber die des ganzen Diagramms. Augenscheinlich orientiert sich LO an der 'äußeren' Selektion und greift garnicht auf die Diagrammwand zu.
Ja neeh! Ganz so ist das dann doch nicht. Wenn man weiss wie das ganze wirklich gehandhabt wird, zumindest nach meinem momentanigem Wissensstand, dann kann man das wohl irgendwie verstehen, aber Logisch ist es anfangs dennoch nicht.

Bezogen auf Deinen Code, sollte Obiges entsprechen:

chart2.Area.Size
Und damit hattest Du mir einen Weg aufgezeigt, an dem ich nicht gedacht hatte, da er mir sehr unlogisch vorkam.

Also, unter Wall werden nur "Schönheitsoperationen" durchgeführt. Das heißt; Soll die Hausfasade Gelb oder Blau angestrichen werden und soll vielleicht noch ein Firmenlogo angebracht werden. Ich habe das ganze jetzt mal sehr Lapidar mit einem Hausanstrich verglichen, da dies irgendwie am besten zu WALL(Wand) dazu passt. Kurz und gut, dort geht es nur um die Kosmetik.

Bevor man jedoch ein Haus anstreichen kann, muss es ja erstmal gebaut werden. Und dieser Prozess wird vom Anstreichen getrennt. Und für meinen Fall bedeutet das, ich muss mich nicht auf Wall konzentrieren, sondern einen anderen Weg gehen den ich aber erstmal suchen musste. Und da kam mir dein Denkanstoß mit "chart2.Area.Size" grad recht.

Und der wohl "richtige" Weg führt dann nämlich über chart2.Diagram.XAxis.Size. Es handelt sich dabei um einen Struct. Das heißt, es gibt dort .Height und .Width. Und beim reinschauen von .Height sah ich einen Wert der sehr nahe an den Wert kommt, als wenn man die Diagrammwand anklickt und sich dort bei "Position und Größe" die Höhe anschaut. Er ist so um ca. 1 cm kleiner als für das gesamte Diagramm.

So viel zu meinen Recherchen Ergebnissen.
Das dumme ist jetzt nur, da .Size ein Struct ist, bekomme ich es nicht auf die Reihe das ganze auch richtig anzuwenden. In meiner Beispieldatei habe ich ja schon mehrere Structs drin, z.B. für die Position und Größe des gesamten Diagramms. Aber irgendwie bekomme ich jetzt das Struct für die X-Achse einfach nicht ans Laufen.

Die chart2.Diagram.XAxis.Size unterstüzt ja auch com.sun.star.awt.Size. Und da ich ja diesen Struct in der Beispieldatei ja schon praktisch anwende,

Code: Alles auswählen

	Dim aSize as new com.sun.star.awt.Size
[...]
	aSize.Width = 28020
	aSize.Height = 18430
	chart2.Diagram.setSize (aSize)
dachte ich mir das ich das ganze jetzt wie folgt ergänze.

Code: Alles auswählen

	Dim XSize as new com.sun.star.awt.Size
[...]
	XSize.Width = 0
	XSize.Height = 18000
	chart2.Diagram.XAxis.setSize (XSize)
Aber Pustekuchen, nix is!
Das Makro gibt keine Fehlermeldung aus, es läuft ohne Probleme durch. Aber wenn ich anschließend sofort XRAY darauf ansetze, steht in dem Struct für die Höhe noch der alte Wert drin. Und es ist auch rein optisch zu erkennen, das sich an der Höhe nix geändert hat.

Ich frage mich jetzt also, was mache ich falsch und wie müsste dieses Struct richtig angewendet werden?

Hast Du, lieber Stephan, da vielleicht eine Idee, oder jemand anderer?



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von Stephan »

Ich frage mich jetzt also, was mache ich falsch und wie müsste dieses Struct richtig angewendet werden?

Hast Du, lieber Stephan, da vielleicht eine Idee, oder jemand anderer?
Nein, ich habe dazu leider keine Idee. Bestätigen kann ich Dir aber das solche 'Nichtreaktion' (also, es wird scheinbar ein Wert gesetzt, aber nicht wirklich und es kommt keine Fehlermeldung) auch bei anderen Dingen (ich habe gerade kein Bespiel) auftreten kann.


Gruß
Stephan
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von mikeleb »

Hallo balu,
Wie kann ich die Größe der Diagrammwand ändern/einstellen?
Soweit ich es herausgefunden habe, wird die Diagrammwand wirklich relativ zur Größe des (äußeren) Rahmen festgelegt.
Das klappt, bezogen auf dein Makro, per:

Code: Alles auswählen

	osize=chart2.Diagram.Diagram.RelativeSize
	osize.Primary=.5 'waagerecht
	osize.Secondary=.5 'senkrecht
	chart2.Diagram.Diagram.RelativeSize=osize
Gruß,
mikeleb
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von balu »

Hallo!

Ich bedanke mich bei Euch beiden :-)

Habe jetzt die Beispieldatei ein klein wenig aufgeräumt, etwas übersichtlicher gestaltet, etwas entmüllt und ein klein wenig mehr Komfort eingebaut. Habe nämlich eine kleine Abfrage eingebaut die überprüft ob schon das zu erstellende Diagramm existiert. Und wenn es existiert, dann wird es gelöscht bevor es neu erstellt wird.

Ich bin schon richtig "Betriebsblind", das ich eine kleinigkeit vollkommen übersehen habe. Das hat mir wohl bei meinem Hauptproblem nicht geholfen, als ich das entmüllte, aber zumindest ergibt das jetzt keinen Stolperstein mehr.

Um was gehts?
In meinem letzten Beitrag hatte ich ja gesagt, das ich z.B. folgendes Eingebaut hatte.

Code: Alles auswählen

	Dim aSize as new com.sun.star.awt.Size
[...]
	aSize.Width = 28020
	aSize.Height = 18430
	chart2.Diagram.setSize (aSize)
Und das ist vollkommener Müll, da ja die "Position und Größe" schon viel weiter vorne im Code eingestellt wird, und zwar mit

Code: Alles auswählen

	Set Charts2 = oDiaSheet.getCharts
	rect2.x = 10
	rect2.Y = 820
	rect2.Width = 29420
	rect2.Height = 19440
Aber wie gesagt, diese Aufräumaktion hat mir nicht weiter geholfen.


Nun hatte ich mir noch mal den Code von mikeleb vorgenommen, aber er will nicht funktionieren. Egal ob in OO.o 3.2.1, oder AOO 4.1.3, oder in LO 5.1.5.2.
Also dachte ich mir, das ich die Variable oSize noch deklarieren muss.
Also flugs noch direkt vor dem Codeabschnitt die Deklaration vorgenommen

Code: Alles auswählen

Dim oSize as new com.sun.star.awt.Size
aber das hilft auch nicht.

Das folgende habe ich in OO.o und AOO herausgefunden.

Ohne die Deklaration bekomme ich die Fehlermeldung: "Objektvariable nicht belegt."
Und es wird die Zeile

Code: Alles auswählen

osize.Primary=.5 'waagerecht
als Feher markiert

Mit der Deklaration bekomme ich die Fehlermeldung: "Objekt erforderlich."
Und es wird die Zeile

Code: Alles auswählen

osize=chart2.Diagram.Diagram.RelativeSize
als Feher markiert. Also eine Codezeile früher.

Ein sehr interessantes Ergebnis, das mit den Fehlermeldungen. Aber LO, zumindest meine Version, verhällt sich da etwas anders. Obwohl das gleiche vorgehen, also einmal mit und einmal ohne Deklaration, werden wohl die gleichen Situationsabhängige Zeilen als Fehler markiert, aber in beiden Fällen lautet die Fehlermeldung immer einfach nur "Objektvariable nicht belegt."

Es ist ja wohl sehr schön und lieb von dir, mikelb, das Du mir helfen willst und sagst das dein Code funktioniert, aber bei mir will er nicht funktionieren. Mache ich da etwas Falsch, und wenn ja, was?

Da ich ja "Betriebsblind" bin, würde ich mich über eine Hilfreiche Antwort deinerseits doch sehr freuen, besonders dann, wenn sie mein Problem löst.



Gruß
balu
Dateianhänge
Testdiagramm_wegen_DiagrammWand-groesse_1.ods
(15.24 KiB) 103-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von mikeleb »

Hallo balu,

anbei mal der Code in deine erste Datei gepackt. Er läuft bei mir unter LO 4.4.7.2 und LO 5.2.5.1 fehlerfrei durch :?
Dateianhänge
Testdiagramm_wegen_DiagrammWand-groesse.ods
(25.12 KiB) 130-mal heruntergeladen
Gruß,
mikeleb
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von mikeleb »

Hallo balu,

ich habe deine letzte Datei mal mit "meiner" verglichen. Offensichtlich muss das Diagramm erst erzeugt sein um dann seine relative Größe zu beeinflussen.
Gruß,
mikeleb
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von balu »

Moin mikeleb,

kurzes und schnelles Feedback, bevor ich ins Bett geh.

Deine geänderte Datei fumktioniert unter OO.o 3.2.1, eben schnell angeschaut.

Offensichtlich muss das Diagramm erst erzeugt sein um dann seine relative Größe zu beeinflussen.
Und ich glaube auch das dies der springende Punkt ist, erst erstellen, dann ändern.

Ich Danke dir also schon mal recht herzlich :-). Dadurch habe ich jetzt erstmal eine Denkbasis zum weitermachen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von balu »

Hallo mikeleb,

es ist wirklich schön wenn man Denkanstöße bekommt, woran man gar nicht gedacht hat. Das hilft öfters beim "um die Ecke denken". Danke dafür :-)

Doch jetzt kommt wieder ein ABER.
Aber ich verstehe da noch immer etwas nicht, und das wird dir wohl gleich nicht anders ergehen.

Ich hatte ja gesagt, das die letzt angehängte Datei von mir entmüllt wurde, und dabei habe ich folgendes rausgeschmissen.

Code: Alles auswählen

	Dim newPosition as new com.sun.star.awt.Point
	Dim aSize as new com.sun.star.awt.Size
[...]
' Diagrammfläche positionieren
'
	newPosition.X = 500
	newPosition.Y = 500
	chart2.Diagram.setPosition (newPosition)	
'
'------------------------------------------------------------------------------------
'
' Diagrammfläche Größe
'
	aSize.Width = 28020
	aSize.Height = 18430
	chart2.Diagram.setSize (aSize)
Und jetzt lösche mal in deiner überarbeiteten Datei den Bereich "Diagrammfläche positionieren".
Starte das Makro.
Und Du siehst, es funktioniert.


Jetzt mach mal folgendes.

Code: Alles auswählen

' Diagrammfläche Größe
'
'	aSize.Width = 28020
'	aSize.Height = 18430
'	chart2.Diagram.setSize (aSize)
Starte das Makro,

und

staune nicht schlecht!

Denn es kommt zu einer Fehlermeldung!


Und nun mach mal das hier.

Code: Alles auswählen

' Diagrammfläche Größe
'
'	aSize.Width = 28020
'	aSize.Height = 18430
	chart2.Diagram.setSize (aSize)
Starte das Makro

und wundere dich das es funktioniert!?


Zur Erinnerung, dein Vorschlag ist ja das hier.

Code: Alles auswählen

	osize=chart2.Diagram.Diagram.RelativeSize
	osize.Primary=.5 'waagerecht
	osize.Secondary=.5 'senkrecht
	chart2.Diagram.Diagram.RelativeSize=osize
Und jetzt könnte man ja meinen, das das Makro aSize mit osize irgendwie gleichsetzt, weil in beiden Variablen das "size" drin vorkommt. Doch dem ist nicht so. Und der Beweis könnte ja wie folgt aussehen.

Code: Alles auswählen

	Pizza = chart2.Diagram.Diagram.RelativeSize
	Pizza.Primary = .5 'waagerecht
	Pizza.Secondary = .5 'senkrecht
	chart2.Diagram.Diagram.RelativeSize = Pizza
Hier habe ich aus dem osize einfach mal auf die Schnelle eine Pizza gebacken, und es funktioniert trotzdem. Und zur Sicherheit hatte ich die Änderungen in der Datei gespeichert, LO beendet, LO neu gestartet, Datei geöffnet und das Makro ausgeführt. Und die Pizza funzt.

Verstehst Du das?
Also ich überhaupt nicht!

Entweder ist das ein Käääfer, oder aber ich habe noch immer nicht die Grundlegenden Abläufe in der Programmierung verstanden. Wie auch immer, ich wollte dir das nur mal mitgeteilt haben.

Ich werde mich aber weiterhin mit deinem Denkanstoß befassen, und mal schaun ob ich mein Ziel vielleicht auch noch anders hinbekomme. Wenn nicht, dann nehme ich halt deine Methode.




Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von mikeleb »

Hallo balu,

offensichtlich gibt es noch mehr zu entdecken.
An sich wird das eigentliche Diagramm am umgebenden Rechteck ausgerichtet und bemessen. Dazu gibt es dann eine Eigenschaft (von chart2):

Code: Alles auswählen

AutomaticSize=true
und ebenso

Code: Alles auswählen

AutomaticPosition=true
Wenn du die Diagrammfläche jedoch positionierst und die Größe definierst

Code: Alles auswählen

chart2.Diagram.setPosition (newPosition)

Code: Alles auswählen

chart2.Diagram.setSize (aSize)
werden obige Eigenschaften auf "false" gesetzt und die chart2.diagram.diagram initialisiert. Es existiert somit als Objekt und es kann weitergehen, sprich entweder die Größe per chart2.Diagram.setSize (aSize) direkt setzen oder per chart2.Diagram.Diagram.RelativeSize relativ einstellen.
Gruß,
mikeleb
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Wie die Größe der Diagrammwand ändern?

Beitrag von balu »

Hallo mikeleb,

oh mann was war ich doch wirklich blind und blöd! BildBild

Code: Alles auswählen

chart2.Diagram.setSize (aSize)
Da hatte ich das doch schon drin gehabt, und wieder gelöscht. Ich weiss wohl noch das ich auch damit experimentiert hatte, jedoch funktionierte das aus irgendwelchen Gründen nicht so wie ich es wollte. Oder ich hatte etwas falsch gemacht. Nun gut, also habe ich jetzt das

Code: Alles auswählen

	Dim aSize as new com.sun.star.awt.Size
[...]
	aSize.Width = 20830
	aSize.Height = 18430
	oDiagram.setSize (aSize)
wieder reingenommen, und jetzt funktioniert es doch wie es soll.

Ich war aber auch nicht ganz untätig und habe da auch noch einen anderen Weg gefunden. Dieser ist wohl nicht ganz so elegant, aber dadurch habe ich für mich persönlich wieder noch etwas dazu gelernt, und das ist für mich auch sehr wichtig.

Da ich ja schon das hier ganz am Anfang drin habe

Code: Alles auswählen

oDiaSheet = oDok.Sheets.GetByName("Blatt1")
konnte ich jetzt das hier

Code: Alles auswählen

xSize = oDiaSheet.DrawPage.getByIndex(1).EmbeddedObject.Component.Diagram.Size
xSize.Height = 18500
xSize.Width = 27830
oDiaSheet.DrawPage.getByIndex(1).EmbeddedObject.Component.Diagram.Size = xSize
doch noch etwas in der Schreibweise kürzen.
Und ja, auch das funktioniert! Habe ich überprüft.

Bis das ich den Weg über .EmbeddedObject.Component herausgefunden und verstanden hatte, war "viel Wasser den Rhein lang runter geflossen" - {hatte hier lange geregnet} -. Und wie Du siehst, war mir deine schreibweise für RelativeSize hilfreich gewesen. Und auch die hier gemachte Erfahrung, das nicht alles im Diagramm sofort eingestellt werden kann, sondern erst im nachhinein nachdem es fertig ist.

Wie schon gesagt; nicht elegant, aber auch das funktioniert.

Ach ja, das mit 'RelativeSize' habe ich jetzt natürlich rausgeschmissen.

Habe also ein Problem weniger mit dem Diagramm und LO, aber noch mindestens 2 weitere stehen noch aus, was aber hier nicht hingehört.

Also noch mal ein Danke schön für Eure Unterstützung. :-)



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten