vertikale Mitte von Calc-Zelle per Makro bestimmen

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

Moderator: Moderatoren

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

vertikale Mitte von Calc-Zelle per Makro bestimmen

Beitrag von Stephan »

Hallo,

die Überschrift ist evtl. ein wenig unverständlich, es geht um Folgendes:

Allgemein dürfte bekannt sein das sich mit Calc nicht vernünftig layouten lässt weil die Summe von Zellhöhen und Zellbreiten sich nicht mit den Koordinaten von Objekten in Einklang bringen lassen, die auf dem Tabellenblatt angeordnet werden. [1]

Meine Frage ist deshalb: Kann man, und wenn ja wie, per Makro die optisch genaue vertikale Mitte einer bestimmten Zelle ermitteln?

Mögliche zu beachtende Nebenbedingungen wären mir zunächst egal, z.B. hätte ich nichts dagegen feste Zellhöhen definieren zu müssen und somit nicht mit automatisch optimaler Höhe arbeiten zu können.



Gruß
Stephan

[1]
Beispiel zur Erklärung:
Zeile 1 bis 100 eines Tabellenblattes haben die Höhe 1 cm. Ordnet man ein Rechteck genau auf der unteren Zellgrenze von A1 an so entspricht das y=0,99 cm (wenn man nach der Bildschirmdarstellung geht). Dieses Rechteck müsste mit y=99 cm somit deckungsgleich zu Zelle A100 sein, ist es aber nicht.
(Unnötig zu erwähnen das auch die Einführung einer proportionalen Korrektur nicht hilft, denn die Abweichung zwischen A1 und A10 entspricht 0,06, verzehnfacht man die Korrektur für A100 passt es trotzdem nicht.)
Dateianhänge
Abweichung.gif
Abweichung.gif (14.68 KiB) 5144 mal betrachtet
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vertikale Mitte von Calc-Zelle per Makro bestimmen

Beitrag von Stephan »

Ach, falls jemand die Originaldatei zum 'rumprobieren' braucht ...
Dateianhänge
Layouten_mit_Calc.ods
(8.8 KiB) 118-mal heruntergeladen
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: vertikale Mitte von Calc-Zelle per Makro bestimmen

Beitrag von mikeleb »

Hallo,
wenn man sich die Position der Zelle A1 und die des ersten Rechtecks per Makro ansieht, dann befindet sich die Zelle bei y=1000 und das Rechteck bei y=993. Optisch erscheint das Rechteck genau auf dem oberen Rand, aber in Wirklichkeit 0,7 mm darüber.
Die Mitte einer Zelle wäre doch einfach der Mittelwert aus der Anfangsposition der Zelle und der der nachfolgenden Zelle? Ich glaube, ich habe das eigentliche Problem noch nicht erfasst.
Gruß,
mikeleb
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vertikale Mitte von Calc-Zelle per Makro bestimmen

Beitrag von Stephan »

bei y=1000 und das Rechteck bei y=993
ja, stimmt, die Angaben im Screenshot in cm waren ein 'Lapsus' meinerseits. Ich weiß das die Angaben per Makro in 1/100 mm erfolgen.
Die Mitte einer Zelle wäre doch einfach der Mittelwert aus der Anfangsposition der Zelle und der der nachfolgenden Zelle?
Ganz genau. Nun ist aber die Anfangsposition einer Zelle nur dadurch zu bekommen das man alle Zeilenhöhen oberhalb der Zelle addiert und das funktioniert nicht und das ist der Inhalt meiner Frage, also wie man das so löst das es funktioniert.
Ich glaube, ich habe das eigentliche Problem noch nicht erfasst.
Das eigentliche Problem ist das ich Objekte (Zeichnungen, Bilder, Steuerelemente, Diagramme ...) vertikal mittig zum Zelltext einer beliebigen Zelle, automatisiert per Makro ausrichten will.
Oder anders gesagt (das liefe auf Adäquates hinaus): Wie positioniere ich per Makro das im Screenshot sichtbare Rechteck (in Nähe von Zelle A100) so das es vertikal exakt zentriert zur 'Trennlinie' zwischen Zelle A100 und Zelle A101 ausgerichtet ist.



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

Re: vertikale Mitte von Calc-Zelle per Makro bestimmen

Beitrag von mikeleb »

Hallo,

Code: Alles auswählen

Sub Main
		oDoc=ThisComponent
		oDrawings=oDoc.Drawpages(0)
		For i=0 to oDrawings.Count-1
			oDraw=oDrawings.getByIndex(i)
			oAnkerzelle=oDraw.anchor
			'Höhe des Zeichnungsobjekts
			hoch=oDraw.size.height
			'Position und Höhe der Ankerzelle
			y_Anker=oAnkerzelle.Position.y
			h_Anker=oAnkerzelle.Size.Height
			'Neupositionierung
			y_neu=y_Anker+h_Anker-hoch/2
			oPosition=oDraw.Position
			oPosition.y=y_neu
			oDraw.setPosition(oPosition)
		Next
End Sub
Gruß,
mikeleb
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: vertikale Mitte von Calc-Zelle per Makro bestimmen

Beitrag von Stephan »

mikeleb hat geschrieben: So, 22.03.2020 22:42 Hallo,

Code: Alles auswählen

Sub Main
		oDoc=ThisComponent
		oDrawings=oDoc.Drawpages(0)
		For i=0 to oDrawings.Count-1
			oDraw=oDrawings.getByIndex(i)
			oAnkerzelle=oDraw.anchor
			'Höhe des Zeichnungsobjekts
			hoch=oDraw.size.height
			'Position und Höhe der Ankerzelle
			y_Anker=oAnkerzelle.Position.y
			h_Anker=oAnkerzelle.Size.Height
			'Neupositionierung
			y_neu=y_Anker+h_Anker-hoch/2
			oPosition=oDraw.Position
			oPosition.y=y_neu
			oDraw.setPosition(oPosition)
		Next
End Sub
Danke, aber das hilft mir noch nicht ausreichend.

Unter Realbedingungen 'zerschlägt' dieses Makro das Layout, weil überhaupt nicht gewährleistet ist das Objekte immer an der Zelle verankert sind zu welcher sie ausgerichtet werden müssen. z.B. siehe Beispieldatei, dort ist das 'erste' Rechteck mit 0,99 an A1 verankert, wenn das auf 1,00 erhöht wird, was optisch fast nicht zu sehen ist, ändert infolge das Makro die Verankerung um eine ganze Zellhöhe.

Hilfreich Ist:

Code: Alles auswählen

y_Anker=oAnkerzelle.Position.y
ABER: worauf bezieht sich y? In meiner Beispieldatei ist y für Zelle A100 gleich 98642 und das sollte die obere Zellbegrenzung sein. Ist es aber nicht denn richte ich danach ein Objekt aus ist es falsch positioniert, eben genauso falsch wie es der Grund war hier überhaupt den Thread zu eröffnen.
Oder ich bin inzwischen schon betriebsblind?


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

Re: vertikale Mitte von Calc-Zelle per Makro bestimmen

Beitrag von mikeleb »

Hallo,
die Positionierung ist offensichtlich nicht so ganz ohne.
An sich sollte (!) oAnkerzelle.Position.y die vertikale Position der Zelle liefern. Das funktioniert bei mir (getestet unter LO 4.3 + Win, LO5.3+Linux) auch.
Damit die Verankerung an der Zelle bleibt, muss die Position des Zeichnungsobjekts innerhalb der Zelle bleiben.
Soweit ganz einfach, aber ...
Es gibt schon einen Unterschied zwischen Zellenhöhe und Zeilenhöhe (mind. 1/100 mm). In einer ausgeblendeten Zeile ist die Zeilenhöhe 0, die Zellenhöhe aber 1. Noch spannender wird es, wenn man die Höhe eines Bereiches betrachtet.
Dazu habe ich mal in deine Datei ein Testmakro eingebuat, dass in einem Bereich die entsprechenden Größen anzeigt.
Vielleicht hilft es ja, einen sinnvollen Zusammehang herzustellen.
Dateianhänge
Layouten_mit_Calc.ods
(41.3 KiB) 107-mal heruntergeladen
Gruß,
mikeleb
Antworten