❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst ✔] Zugriff auf und Manipulation von Diagrammen (charts) (in Calc)

Alles zur Programmierung im LibreOffice.
mikele
* LO-Experte *
Beiträge: 1947
Registriert: Mo 1. Aug 2011, 20:51

Re: Zugriff auf und Manipulation von Diagrammen (charts) (in Calc)

Beitrag von mikele » Mo 6. Mai 2024, 22:23

Hallo,
dem Tabellenereignis "Auswahl geändert" ist das Makro Chart.onSelect zugeordnet. Dieses zerschießt die Funktionalität "meines" Makros, da darin ja die Auswahl geändert wird (womit das Ereignis ausgelöst wird). Ich habe auch noch nicht verstanden, was du mit den Ereignissen bewirken willst.
Aus irgendwelchen Gründen werden die Daten in dem kopierten Diagramm aber nicht angezeigt :evil:
Gruß,
mikele

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Zugriff auf und Manipulation von Diagrammen (charts) (in Calc)

Beitrag von nitja » Di 7. Mai 2024, 06:28

mikele hat geschrieben:
Mo 6. Mai 2024, 22:23
Hallo,
dem Tabellenereignis "Auswahl geändert" ist das Makro Chart.onSelect zugeordnet. Dieses zerschießt die Funktionalität "meines" Makros, da darin ja die Auswahl geändert wird (womit das Ereignis ausgelöst wird). Ich habe auch noch nicht verstanden, was du mit den Ereignissen bewirken willst.
Aus irgendwelchen Gründen werden die Daten in dem kopierten Diagramm aber nicht angezeigt :evil:
Die Prozeduren, die den Tabellenereignissen zugeordnet sind, interferieren nicht mit denen, die das Diagramm betreffen - onFocus stößt zwar AdjChart an (~ "Diagramm anpassen"), übergibt auch die dem Diagramm entsprechende Objektvariable, interagiert aber nicht weiter damit.
onSelect "bewirkt" die Erkennung von Klick-Ereignissen (4 Auslösungen für dieselbe Auswahl rufen dann onClick auf) und erlaubt "per Klick" (auf die Zelle K1 (und im "debug mode" L1 oder M1) die Anzeige der Information für die Seiten (in den Spalten K und L) umzuschalten. In dem Sinne ändert "Dein" Makro die Auswahl nirgends. ("Auswahl geändert" ist ohnehin eine eher unglückliche Übersetzung von onSelect.)

Code: Alles auswählen

sub test2
	odoc=ThisComponent
	otab=oDoc.Sheets.getByName("Grafik")
	oDp=otab.Drawpage

' finde das shape mit dem Diagramm für den Vormonat - hier mit dem Index 0:
	for i=0 to oDp.Count-1
		if oDp.getByIndex(i).name="Diagramm24·03" then
			oShape=oDp.getByIndex(i)
		end if
	next

' kopiere das shape ...:
	oCtrl = oDoc.CurrentController
	theFr = oCtrl.Frame
	dispH = createUnoService("com.sun.star.frame.DispatchHelper")
	oCtrl.select(oshape) ' löst möglicherweise ein einzelnes onSelect-Ergeignis (ohne weitere Konsequenz) aus
	dispH.executeDispatch(theFr, ".uno:Copy", "", 0, Array())
	oCtrl.setActiveSheet(otab) ' löst möglicherweise ein onFocus-Ereignis aus (das könnte wiederum ander Przeduren anstoßen)
	oZiel=otab.getcellrangebyname("H35")

' füge das kopierte shape auf der Seite für den Monat ein:
	dispH.executeDispatch(theFr, ".uno:Paste", "", 0, Array())
	newSh = oDoc.CurrentSelection(0)
' ... und benenne es:
	newSh.name="Diagramm24·04"
	pos=oziel.position
	pos.x=pos.x+oshape.size.height
	pos.y=pos.y+220
	newsh.setPosition(pos)

' Bis hier wird das alles mit AddNewPage in "Beispiel für LO-Forum v.44w.ods" erledigt.
' Die Variablen für die kopierten und eingefügten (und jeweils eingebetteten) Objekte 
' und ihre Komponenten sehen in der IDE (nach Namen, Eigenschaften, Hierarchie usw.) genauso aus.


' Was folgt soll in "Beispiel für LO-Forum v.44w.ods" in AdjChart, bzw. AdjChartX passieren
'
	odia=newsh.embeddedobject.component ' heißt im Beispiel oChart
	odia.title.string=newSh.name ' funktioniert im Beispiel nicht
' stattdessen funktioniert:
'	oChart.embeddedObject.TitleObject.text(0).string
' aber oChart ist ein "com.sun.star.comp.chart2.ChartModel", kein shape
'
	odia_alt=otab.charts.getbyname(oShape.EmbeddedObject.EntryName)
' wird im Beispiel in sub getPages gelesen und in sPgInfo hinterlegt (im debug mode in Spalte L auch gezeigt)
'	oPgChrt(i)=oSheet.charts.getByName(.EntryName) ' ◄◄◄
'	sPgInfo(i,7)=.EntryName
'	sPgInfo(i,8)=sRanges(oPgChrt(i).getRanges)
	daten=odia_alt.getRanges

' finde das (Daten-)Tabellenblatt für den neuen Monat hier mit Index 1
	nr_DatenTab=oDoc.Sheets.getByName("24·04").RangeAddress.Sheet
	for i=0 to ubound(daten)
		daten(i).sheet=nr_DatenTab
	next
'	with oChart
'		oRanges=.getRanges ' getRanges gets oChart.Ranges - but oChart has .RelatedCellRanges, too
'		iSht=oRanges(0).sheet-1
'		for i=0 to UBound(oRanges) : oRanges(i).sheet=iSht : next
'	end with
'
' ... und die Ergebnisse sehen bis hier perfekt aus ...

	odia_neu=otab.charts.getbyname(newSh.EmbeddedObject.EntryName) ' ◄◄◄
' aber setRanges produziert Müll
	odia_neu.setRanges(daten)
' diese, neuen, missratenen, ranges des per copy&paste produzierten Diagramms 
Was ich meine aus dem Beispiel gelernt zu haben:
Die sichere Identifikation des jeweiligen Diagramms ist nur über die Form möglich, in die es eingebettet ist und die durch ihren Anker mit dem Tabellenblatt verbunden ist.

Die Lösung für die Anpassung der Datenbereiche fehlt mir aber nach wie vor.
Es scheint mir auch, dass die in "Ranges" enthaltenen Daten viel zu sparsam sind um darin die Funktionalität des Diagramms abzubilden. Erheblich mehr ist in den "RelatedCellRanges" zu finden. Mir fehlt aber jeder Ansatz, wie ich die aus dem "alten" Diagramm auslesen und angepasst in das "neue" Diagramm füttern sollte (also die entsprechende Analogie zu setRanges).
(Die Anpassung der Daten in RelatedCellRanges wäre nicht das Problem.)

Übrigens, der beobachtete Effekt, dass der setRanges-Befehl die Daten aus beiden Diagrammen gleichzeitig löschte, kam von einer versehentlich falschen Einstellung des "Ziehmodus" (auf "hyperlink"). Keine Ahnung, wie das da rein gerutscht ist - aber copyRange scheint die jeweilige Einstellung zu übernehmen.
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

mikele
* LO-Experte *
Beiträge: 1947
Registriert: Mo 1. Aug 2011, 20:51

Re: Zugriff auf und Manipulation von Diagrammen (charts) (in Calc)

Beitrag von mikele » Di 7. Mai 2024, 22:50

Hallo,
wahrscheinlich ist dein Diagramm zu komplex (mehrere Datenreihen) um einfach mit .setRanges zum Ziel zu kommen. Hier https://forum.openoffice.org/en/forum/v ... php?t=8991 hat hanya ein Makro gepostet, mit dem neue Datenreihen im Diagramm angelegt werden können.
Die Prozeduren, die den Tabellenereignissen zugeordnet sind, interferieren nicht mit denen, die das Diagramm betreffen
Doch schon, da durch die Zeile

Code: Alles auswählen

oCtrl.select(oshape)
das Ereignis ausgelöst wird. Dadurch kommt es dann zu einer Kollision der zwei verschiedenen Deklarationen der Variable oShape.
Gruß,
mikele

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Zugriff auf und Manipulation von Diagrammen (charts) (in Calc)

Beitrag von nitja » Mi 8. Mai 2024, 00:08

mikele hat geschrieben:
Di 7. Mai 2024, 22:50
… da durch die Zeile oCtrl.select(oshape) das Ereignis ausgelöst wird … kommt es dann zu einer Kollision der zwei verschiedenen Deklarationen der Variable oShape.
In onSelect wird oShape nicht verwendet.
Ich hatte durchaus schon getestet, welches Ergebnis der setRanges-Befehl produziert, wenn die Behandlung der Tabellenereignisse aus der Tabelle gelöscht wird (Menü Tabelle»Ereignisse…): Kein Unterschied. Im angehängten Beispiel kann man im Diagramm (Rechtsklick»Bearbeiten, dann im Menü Format»Datenbereiche) nachschauen, was da passiert ist.
Unter dem Reiter Datenbereich ist alles gelöscht, aber die Option "Erste Spalte als Beschriftung" fälschlicher Weise aktiviert.
Vielleicht kommt schon daher das Chaos unter dem Reiter Datenreihen.
Es ist übrigens auch sehr schwierig, die Einträge manuell zu ändern:
Wenn nicht alle Einträge in der richtigen Weise korrigiert sind, bevor man auf OK klickt, gehen mit dem Klick alle Änderungen verloren. (Auch die Reihenfolge der Korrekturen scheint da eine Rolle zu spielen.)
mikele hat geschrieben:
Di 7. Mai 2024, 22:50
… wahrscheinlich ist dein Diagramm zu komplex (mehrere Datenreihen) um einfach mit .setRanges zum Ziel zu kommen. …
Hattest Du die Aktualisierung des Diagramms auf die Daten der geänderten Datentabelle nicht vor Deinem Post am 13.04.2024, 15:03 beobachtet?

Für das Makro von "hanya" werde ich einige Zeit brauchen - in der Hoffnung, dass die 16 Jahre alten Informationen darin heute wirklich noch zutreffen. (Meine Erfahrung mit LO war, dass sich das dafür viel zu dynamisch entwickelt, dass Dinge, die vor viel weniger Jahren noch auf eine bestimmte Weise funktionierten mit neuen Versionen anders, oft viel einfacher, zu behandeln waren - mit gut 90%iger Rückwärtskompatibilität.)
Dateianhänge
Beispiel für LO-Forum v.44w ohne onSelect.ods
(73.07 KiB) 150-mal heruntergeladen
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO

nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

Re: Zugriff auf und Manipulation von Diagrammen (charts) (in Calc)

Beitrag von nitja » Mo 20. Mai 2024, 22:45

In den vergangenen 2 Wochen habe ich mit einen ganz neuen Ansatz das eigentliche Projekt quasi "from scratch" neu aufgesetzt - und nachdem ich über das verlängerte WE die "letzten" kleinen Stolpersteine aus dem Weg geräumt habe, läuft es fehlerlos, sehr viel einfacher und automatischer, als ich mir hatte träumen lassen.

Die wesentlichen Erkenntnisse zu "Zugriff … Manipulation":
  • Der Zugriff auf ein bestimmtes chart (und das ist seinerseits "nur" Behälter/wrapper für das eigentliche chart-document) geht (eindeutig/sicher) nur durch seine "Hülle" - das shape, in das es eingebettet ist.
  • Kopieren & Einfügen funktioniert - ganz ohne Dispatcher - reibungslos via CopyRange, wenn der betreffende Bereich das shape komplett einschließt. (Vielleicht würde da auch der Anker reichen.)
    ·
  • get/setRanges funktioniert, wenn überhaupt, nur bei extrem einfachen Tabellen/Diagrammen und ist sowieso komplett überflüssig. (Die 3 Wochen erschöpfenden Kampf auf dieser Fährte hätte ich mir sparen können, wäre ich vorher schlauer gewesen.)
  • Die Anpassung der referenzierten Daten erledigt LO vollautomatisch ohne weitere Manipulation durch das Makro.
Dass hier auch niemand auf Alternativen zur Anpassung der Datenbezüge per Makro kam, "tröstet" mich darüber (im Nachhinein: so dumm gewesen zu sein) mich so lange auf falschen Fährten abgemüht zu haben.
LO 24.2.0.3 (X86_64) auf Linux 6.6.26-1-MANJARO, gnome 45.4, (gtk 4) gtk3 für LO


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten