🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ 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 ✔] Ereignisgesteuerte Makros…

Alles zur Programmierung im LibreOffice.
Antworten
nitja
Beiträge: 190
Registriert: Di 20. Okt 2020, 15:55

[gelöst ✔] Ereignisgesteuerte Makros…

Beitrag von nitja » Di 23. Apr 2024, 21:07

Bisher habe ich mich davor gescheut/gedrückt, ein "echtes" listener-handler-Paar von Grund auf selbst zu bauen. Und nachdem mich tagelanges Lesen der Info, die ich dazu finde, bis jetzt auf keinen grüneren Zweig gebracht hat, hoffe ich, dass mir hier noch einmal jemand helfen kann.

Unter den von LO vorbereiteten (und einigermaßen geeignet erscheinenden) Tabellenereignissen funktioniert die Handhabung von "Doppelklick" ("OnDoubleClick") ganz gut. Und auch die Reaktion auf "Dokument aktivieren" ("OnFocus") führt trotz einiger unverstandener Merkwürdigkeiten letztlich zum gewünschten Ergebnis.
Versuche mit "Auswahl geändert" ("OnSelectChange"???) führten außer ins Chaos nirgendwo hin. (War ohnehin nicht meine erste bis neunundneunzigste Wahl, da ich erwarte, dass ich von zig solcher Ereignisse nur auf sehr wenige reagieren möchte.) … das Chaos hauptsächlich durch Versuche zu beobachten, was das Programm eigentlich dabei macht - also, wenn ich soweit gekommen wäre, auch zum debuggen.
Welches Ereignis mit "Inhalt geändert" überhaupt gemeint ist und worauf sich das dann bezieht, (Zelle, Tabelle, gespeicherte Version des "Dokuments", …) war und blieb mir schleierhaft.

Ich möchte bei Änderung der (per Tabellenfunktion in der Tabelle berechneten) Zahl ("value") in einer bestimmten Zelle ein Makro starten. Zur Not würde auch eine Prozedur helfen, die (während die bestimmte Tabelle "aktiv" ist (den Fokus hat)) alle paar Sekunden nachschaut, ob sich der Wert (durch Eingaben in anderen ("Vorgänger"-)Zellen geändert hat.
… aber mir gehen die (bisher ohnehin ungeeigneten) Ideen aus, wie ich das bewerkstelligen kann.
Zuletzt geändert von nitja am Do 25. Apr 2024, 20:03, insgesamt 2-mal geändert.
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: Ereignisgesteuerte Makros… kriege ich einfach nicht ausreichend in den Griff.

Beitrag von nitja » Mi 24. Apr 2024, 10:20

Zumindest eine Begriffsstutzigkeit hat sich aufgelöst:
nitja hat geschrieben:
Di 23. Apr 2024, 21:07
… "Auswahl geändert" ("OnSelect ̶C̶h̶a̶n̶g̶e̶"???) …
Welches Ereignis mit "Inhalt geändert" überhaupt gemeint ist und worauf sich das dann bezieht, (Zelle, Tabelle, gespeicherte Version des "Dokuments", …) …
Die Namen der Ereignisse kann man im "ScTableSheetObj" unter "Events»EventNames" finden.
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: Ereignisgesteuerte Makros… kriege ich einfach nicht ausreichend in den Griff.

Beitrag von nitja » Do 25. Apr 2024, 06:54

So langsam klärt sich eines nach dem anderen, scheint sich der "fog of war" mehr und mehr zu verziehen, …
nachdem ich endlich auf eigentlich naheliegende Verfahren gekommen bin, das Verhalten des Programms (außerhalb der IDE) zu beobachten. … und auch ("sogar" in der offiziellen, mit LO installierten Hilfe) ausführlichere Informationen (die ich sicher schon zig mal gelesen hatte) "wiedergefunden" hatte.
Merkwürdigkeiten bei onFocus-Ereignissen stammten z.T. von den Versuchen, die zu beobachten (und dabei eben häufig zwischen Tabellen-Fenster und IDE zu wechseln), zum anderen von unerwarteten "Vorbelegungen" von Modul-Variablen nach vermeintlicher "Beendigung" des Makros nach dem vorhergehenden Fensterwechsel, …
bei onSelect von der tatsächlichen Merkwürdigkeit, dass die Ereignisse sich bei Wechsel der Zelle per Tastatur wie erwartet verhalten, bei Maus-Klicks aber gleich vierfach ausgelöst werden: einmal onMouseDown und dreimal onMouseUp. Kein Wunder also, dass ich bei Beobachtung der letzten 2 Auslösungen durch Klicks nie die vorhergehende Zelle finden konnte.
Dazu das (immer noch nicht zu 100% ausgeräumte) Missverständnis bzgl. der Lebensdauer von Modul-Variablen, wann also das Makro wirklich beendet ist. (Ein Stop-Befehl im Code reicht z.B. dafür offensichtlich nicht aus.) Aber auch das klärt sich langsam mit der besseren Beobachtung.

Als Beispiel der aktuelle Code für onSelect:

Code: Alles auswählen

sub onSelect																' change by keys & onMouseDown ✔ (+ 3! calls ⚠❓🤔 onMouseUp)
	if sSelLog<>"" then sPrvSel=left(sSelLog,inStr(sSelLog,chr(10))-1)
	with thisComponent.CurrentSelection.RangeAddress
		sCurSel=.Sheet & "." & .EndColumn & "." & .EndRow
	end with
	if sPrvSel<>sCurSel then sSelLog=sCurSel & chr(10) & sSelLog			' the "if …" accounts for, i.e. ignores ⚠ + 3! calls onMouseUp ⚠
'	
	bDbg=true													' debug mode (writes logs to cells @ sheet outside of the work area)
	if bDbg then													' i.e. if previous line's not commented out
		if isNull(oSelLog) then setLogs
		if sCurSel="1.11.0" then
			oSelLog.string=""
		elseif sPrvSel<>sCurSel then									' accounts for, ignores the ⚠ + 3! calls onMouseUp ⚠
			oSelLog.string=sCurSel & chr(10) & oSelLog.string
		endif
	endif 'bDbg
end sub 'onSelect
in der Form, die für copy&paste in die IDE geeignet …

… und in der Form, die hier, vor Ort lesbarer ist:

Code: Alles auswählen

sub onSelect									' change by keys & onMouseDown ✔ (+ 3! calls ⚠❓🤔 onMouseUp)
	if sSelLog<>"" then sPrvSel=left(sSelLog,inStr(sSelLog,chr(10))-1)
	with thisComponent.CurrentSelection.RangeAddress
		sCurSel=.Sheet & "." & .EndColumn & "." & .EndRow
	end with
	if sPrvSel<>sCurSel then sSelLog=sCurSel & chr(10) & sSelLog		' the "if …" accounts for, i.e. ignores ⚠ + 3! calls onMouseUp ⚠
'	
	bDbg=true								' debug mode (writes logs to cells @ sheet outside of the work area
	if bDbg then								' i.e. if previous line's not commented out
		if isNull(oSelLog) then setLogs
		if sCurSel="1.11.0" then
			oSelLog.string=""
		elseif sPrvSel<>sCurSel then					' accounts for, ignores the ⚠ + 3! calls onMouseUp ⚠
			oSelLog.string=sCurSel & chr(10) & oSelLog.string
		endif
	endif 'bDbg
end sub 'onSelect
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: Ereignisgesteuerte Makros… kriege ich einfach nicht ausreichend in den Griff.

Beitrag von nitja » Do 25. Apr 2024, 20:02

nitja hat geschrieben:
Do 25. Apr 2024, 06:54
Merkwürdigkeiten … bei onSelect …, dass die Ereignisse sich bei Wechsel der Zelle per Tastatur wie erwartet verhalten, bei Maus-Klicks aber gleich vierfach ausgelöst werden: einmal onMouseDown und dreimal onMouseUp. …
Diese "Merkwürdigkeit" (und sie ist des Merkens würdig!) hat durchaus ihren Wert und ist tatsächlich viel differenzierter. Sie erlaubt …
… einen Klick per onSelect zu erkennen, auch wenn dieselbe Zelle schon vorher selektiert war.
… "Auswahländerungen" zu unterscheiden, wenn (etwa zur Markierung von Bereichen, auch per Tastatur) dabei "Modifikatortasten" (modifier keys) wie ⇧, Strg, … (Shift, Ctrl, …) gedrückt sind. (Erkennbar aus der Platzierung identischer Adressen in der Sequenz der ausgelösten onSelect-Ereignisse)

⇒ "the perceived quirk turns out to be a feature" …
das freilich mehr Code zur Behandlung verlangt, als das naive (Miss-)Verständnis von "Auswahl geändert" erwarten ließ.

Was ungelöst bleibt: …
Wie hätte ich diese Information in den Medien finden können, die sich einem LO-Anfänger erschließen? ¹⁾
Wie kann ich mein unvollständiges Verständnis von der Lebensdauer von Variablen verbessern?
Was ist wirklich "Start des Makros" und sein "Ende" (außer, bei Letzterem, die Re-Kompilierung bei einer Veränderung des Codes - und sei es ein angehängtes Leerzeichen in einem Kommentar)?
Und was ist dabei das "Makro"? (offensichtlich nicht eine einzelne Prozedur darin)

Für hilfreiche Kommentare zu diesen offenen Fragen bleibe ich natürlich dankbar, auch wenn ich das Thema im Sinne der Überschrift jetzt als "[gelöst ✔]" markiere.

p.s.: …
… zu ¹) Ich hatte seit letztem WE zig threads zu dem Thema in einschlägigen Foren gefunden, manche mit fast exakt der selben Fragestellung. Die meisten in verschiedenen OOo-Foren und/oder von vor 2020. Manche mit mehr als 10 Antworten, mindestens einer mit mehr als 20.
Kein einziger mit einer Lösung.
… zum "neu entdeckten" "feature": Damit lässt sich natürlich auch ein onClick-Ereignis nachbilden (wie es z.B. für Formular-Steuerelemente angeboten wird), von dem ich auch öfters gelesen habe, dass es Fragestellende (so wie ich) vermissten.
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: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: [gelöst ✔] Ereignisgesteuerte Makros…

Beitrag von mikele » Fr 26. Apr 2024, 17:29

Hallo,
Ich möchte bei Änderung der (per Tabellenfunktion in der Tabelle berechneten) Zahl ("value") in einer bestimmten Zelle ein Makro starten.
Anbei mal eine Variante es zu bewerkstelligen.
Beim Öffnen des Dokuments, wir der Wert der Zelle in einer (globalen) Variable abgelegt. Beim Tabellenereignis "Auswahl geändert" wird nun ein Makro gestartet, das prüft, ob sich der Wert geändert hat.
Dateianhänge
makro_tabellen_ereignis.ods
(10.92 KiB) 167-mal heruntergeladen
Gruß,
mikele

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

Re: [gelöst ✔] Ereignisgesteuerte Makros…

Beitrag von nitja » Fr 26. Apr 2024, 18:17

:) Ziemlich genau so hatte ich das auch angefangen, nachdem ich soweit war, dass onSelect, die Behandlung des "Auswahl geändert"-Ereignisses kein absolutes Chaos mehr angerichtet hatte.
Aber probiere mal irgendwo in die Tabelle zu klicken, während die MsgBox aktiv ist.
Meins ist mittlerweile so weit verfeinert, dass es Klicks erst verarbeitet, wenn die Serie der damit ausgelösten (4) Select-Ereignisse komplett eingetroffen ist.
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: 1930
Registriert: Mo 1. Aug 2011, 20:51

Re: [gelöst ✔] Ereignisgesteuerte Makros…

Beitrag von mikele » Fr 26. Apr 2024, 18:41

Hallo,
Aber probiere mal irgendwo in die Tabelle zu klicken, während die MsgBox aktiv ist.
Das geht nicht (wäre ja auch nicht der Sinn - oder?)
Gruß,
mikele

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

Re: [gelöst ✔] Ereignisgesteuerte Makros…

Beitrag von nitja » Fr 26. Apr 2024, 19:45

mikele hat geschrieben:
Fr 26. Apr 2024, 18:41
Das geht nicht (wäre ja auch nicht der Sinn - oder?)
Oh, bei mir geht das.¹⁾ OS-abhängig?
Und nein, ist nicht der Sinn.
Hat mir aber die Tabelle und den Code zerschossen, als ich beim Debuggen bei Haltepunkten in der IDE Werte kontrollieren wollte. Gelegentlich auch zum Komplettabsturz aller offenen LO-Fenster geführt.

¹) p.s.: um eine letzte mögliche Unklarheit zu beseitigen: Das geht auf meinem Rechner in Deiner "makro_tabellen_ereignis.ods".
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