Reihenfolge von Ereignissen

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

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Reihenfolge von Ereignissen

Beitrag von clag »

Hallo Kenner und Könner,

seit langem hege ich den Wunsch eine Art Fadenkreuz fur große Tabellen in Cal per Makro zu realisieren,
also von der jeweils aktuellen Cursor Position sollen Spalte und Zeile farblich hervorgehoben werden.
Eine ähnlich Anfrage hat mich noch einmal motiviert.
Eigentlich nicht so kompliziert dachte ich, wenn man das Tabellenereignis "Auswahl geändert" abgreift und auswertet.

Aber genau da hakt es, und ich habe nach wie vor ein Problem damit.
Denn wenn man die Auswahl sehr schnell über einen größeren Bereich verändert gerät AOO ins stottern,
die übergebenen Adressen sind nicht mehr in der Reihenfolge wie sie vom Cursor angesprochen wurden.
Das passiert sowohl bei Maus als auch Tastatur Bewegungen.
messy_input.png
messy_input.png (4.84 KiB) 8051 mal betrachtet
Ist das Makro zudem noch beschäftigt ist ist die letzte ubergebene Adresse völlig daneben
messy_input_busy.png
messy_input_busy.png (4.34 KiB) 8051 mal betrachtet
Kann das jemand erklären?
Noch besser wäre natürlich eine Idee wie man eine korrekte Reihenfolge erzeugen kann.

Code: Alles auswählen

REM  *****  BASIC  *****
Global testaddress as string

sub highlight(event)
 sN = event.absolutename
 wait 1000 ' simuliert aktivität
 testaddress = testaddress & chr(10) &sN
end sub

sub showtest
 msgbox testaddress
 testaddress = ""
end Sub
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Axel Richter
****
Beiträge: 159
Registriert: So, 17.10.2010 16:54

Re: Reihenfolge von Ereignissen

Beitrag von Axel Richter »

Hallo Clag,

das Problem für das Durcheinander ist, dass Dein

Code: Alles auswählen

 wait 1000 ' simuliert aktivität
genau das nicht tut. Es simuliert keine Aktivität, sondern pausiert die Prozedur an dieser Stelle für 1s. Da die Prozedur aber bei jeder Änderung der Selection aufgerufen wird, bedeutet das, dass sie innerhalb dieser 1s erneut aufgerufen werden kann, bevor sie den String testaddress geschrieben hat. Wenn dann die 1s abgelaufen sind, schreibt sie den String testaddress, der aber zwischenzeitlich von anderen Aufrufen bereits verändert sein kann.

In VBA würde man Aktivität simulieren, indem man in einer Schleife für 1s

Code: Alles auswählen

Application.DoEvents
laufen lassen würde. Starbasic und die OpenOffice API kennen aber kein DoEvents.

Aber selbst wenn Du das löst, gibt es ein viel größeres Problem mit den OpenOffice Event-Handlern für Selection-Change in Calc. Die werden nämlich immer dann, wenn die Selection-Änderung mehrere Zellen enthält, doppelt aufgerufen.

Und, wenn man innerhalb der Selection-Change Prozedur etwas tut, was die Selection verändert oder was nur solange dauert, dass sich in der Zeit die Selection verändert haben kann, kommen natürlich Endlos-Aufrufe zustande. Das würde man in VBA per

Code: Alles auswählen

Application.EnableEvents
steueren, was es aber in Starbasic und der OpenOffice API leider ebenfalls nicht gibt.

Ich würde deshalb Dein Vorhaben als sehr ambitioniert einstufen ;-).

viele Grüße

Axel
Zuletzt geändert von Axel Richter am So, 02.10.2016 11:20, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Reihenfolge von Ereignissen

Beitrag von Stephan »

Kann das jemand erklären?


ich kann das nur ausnahmsweise in Einzelfällen nachvollziehen wenn ich mit völlig praxisferner Geschwindigkeit die Auswahl ändere (z.B. wenn ich den Cursor rechts gegen den Programmfensterrand ziehe das die Erweiterung der Markierung zu flackern beginnt), beim normalen (auch schnellen) Ändern der Markierung kann ich nicht feststellen das etwas durcheinander kommt.

Allerdings leuchtet mir Dein Code auch nicht ein, denn das "Wait 1000" führt doch dazu das die aktuelle Instanz des Makros unterbrochen wird, mithin laufen dann dort etliche Instanzen des Makros gleichzeitig, was dann möglicherweise zu Problemen führt.
Theoretisch sollte es helfen bei Start des Makros die Zeit abzufragen, also z.B.:

Code: Alles auswählen

sub highlight(event)
 t = Now()
 sN = event.absolutename
 wait 1000 ' simuliert aktivität
 testaddress = testaddress & chr(10) & t & sN
end sub
dann könnte man den Inhalt von testaddress nach diesen Zeitstempeln sortieren. Andererseits dürften ja schon normalerweise die Abläuf nicht durcheinanderkommen, so das ich garnicht weiss ob der ZEitstempel zu klaren Ergebnissen führt.

(ich weiß auch garnicht ob NOW() genügend genaue Angaben ausgibt, Pi mal Daumen bräuchtest Du ja wohl mindestens 1/100 Sekunden)

insgesamt: Basic dürfte dafür im Zweifel zu langsam sein, wobei ich nochmal betonen das ich bei beliebig schneller, aber eben praxisrelevant-schneller, Markierungsänderung keine Probleme bekomme.


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

Re: Reihenfolge von Ereignissen

Beitrag von Stephan »

mmh, Axels Formulierung:
Wenn dann die 1s abgelaufen sind, schreibt sie den String testaddress, der aber zwischenzeitlich von anderen Aufrufen bereits verändert sein kann.
bringt mich auf eine Idee, schreibe den Code wie folgt:

Code: Alles auswählen

sub highlight(event)
 testaddress = testaddress & chr(10) & event.absolutename
 wait 1000 ' simuliert aktivität
end Sub

das könnte vielleicht zu einer Besserung führen, weil es quasi Basic so wenig als nur irgend möglich lässt in der eine zweite Instanz des Makros die Variable ändern könnte.
Die Zeit die trotzdem vergeht (also zwischen Start des Makros und Abschluss des Änderns der Variable) ist aber nicht Null, denn auch wenn das wohl mit Bordmitteln nicht messbar sein dürfte.


Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Reihenfolge von Ereignissen

Beitrag von clag »

hallo
danke das ihr euch meines Problems angenommen habt
das mit dem wait war auch nur eine Notlösung ursprünglich stand da der code der die Zeile und Spalte ermittelte,
aus einer globalen Variablen die alte Position ausliest und farblich zurücksetzt (alternative auch die gesamte Tabelle)
das hatte ich zwischenzeitlich derart vergurkt, mit Versuchen diese falschen Adressübergaben zu verhindern, das es nicht mehr funktionierte, dann hatte ich aufgegeben.

Nun wollte ich doch noch einmal beigehen und habe diesen Code nur erstellt um das Problem zu erklären.

Mit dem realen Code zum färben und wieder entfärben der Zeile / Spalte hat es sich auch so verhalten,
nur konnte man damals prima beobachten, wenn mann mit dem Curser ohne repeatdelay scrollte,
hingen die eingefäbten Zeilen/ Spalten immer hinter dem Cursour her und nach einigen Zeilen die noch ok waren,
ging es drunter und drüber und letzte gefärbte Zeile/Spalte war meist eine andere als die wo der Cursor stand :(

Ok dann muß ich mal versuchen das Ganze zu rekonstruieren und hier zu zeigen.

PS.
Und Stephan hat natürlich auch Recht, es war nur in extremen Fällen so,
ein einzelner Mausklick in eine andere Zelle hat immer sauber funktioniert,
oder auch bei zweimal Pfeiltaste.
Aber ein Pfeil runter und halten be null repeatdelay hat die Adressübergabe durcheinander gebracht.
Zuletzt geändert von clag am So, 02.10.2016 12:32, insgesamt 1-mal geändert.
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Axel Richter
****
Beiträge: 159
Registriert: So, 17.10.2010 16:54

Re: Reihenfolge von Ereignissen

Beitrag von Axel Richter »

Hallo Clag,

am wichtigsten ist meiner Meinung nach, das rekursive Aufrufen der Selection-Change-Prozedur zu verhindern, wenn ein Selection-Change-Ereignis auftritt, während diese vom vorherigen Ereignis noch läuft. Das wäre das, was

Code: Alles auswählen

Application.EnableEvents = False
...
Application.EnableEvents = True
in VBA machen würde. Das kann man mit einer globalen boolean Variable erweichen:

Code: Alles auswählen

global isRunningSelectionChange as boolean

sub OnSelectionChange(oXInterface)
 if isRunningSelectionChange then exit sub
 isRunningSelectionChange = true
 
 sAbsoluteName = oXInterface.AbsoluteName
 logSelectionChanges sAbsoluteName
 wait 1000
 
 isRunningSelectionChange = false
end sub

sub logSelectionChanges(sAddress as string)
 sFilename = "/home/axel/Dokumente/logSelectionChanges.txt"
 iFileNo = FreeFile              
 Open sFilename For Append As #iFileNo 
 Print #iFileNo, sAddress
 Close #iFileNo
end sub

sub openLogSelectionChanges()
 sURL = "file:///home/axel/Dokumente/logSelectionChanges.txt"
 StarDesktop.loadComponentFromURL(sUrl, "_blank", 0, array())
end sub
Neue Selection-Change-Ereignisse, die während der mindestens 1s (wait) auftreten, in denen die Prozedur läuft, werden so einfach nicht beachtet. Das ist aber immer noch besser, als das Durcheinander, welches durch das rekursive Aufrufen der Selection-Change-Prozedur entsteht, wenn man das nicht macht.

Btw. Ich habe die Sub- und Variablennamen mal etwas angepasst. Dein "event" war nämlich keins, da das Sheet-Event "Selection changed" kein Event-Objekt mehr übergibt, sondern die Zelle/n in denen es auftrat als Target, wie VBA es auch tut. Das ist meiner Meinung nach eine Verschlimmbesserung gewesen, da man mehr Einfluss (z.B. auf die Event propagation) nehmen könnte, wenn man tatsächlich das Event-Objekt hätte.

viele Grüße

Axel
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Reihenfolge von Ereignissen

Beitrag von clag »

Hallo zusammen,

habe mal eine ganz einfache Testdatei erzeugt mit 2 Varianten.
Da würde mich die Ausführungsgeschwindigkeit und ggf auftretende Fehler auf anderen Sytemen interessieren.
Stephan hatte oben gesagt er hätte da praktisch keine Probleme.
Vielleicht spielt bei dem eingangs von mir beschriebenen Problem die Leistungsfähigkeit des Rechner eine größere Rolle als sonst.
Also auf menem etwas betagten AMD ist es so:
in Test_1 klemmt es beim scrollen derart das nachträglich noch Zeilen/Spalten eingefärbt werden wenn man hastig mit dem Cursor die Auswahl verlegt,
in Test_2 hakt es etwas beim scrollen und am Ende sind Auswahl und farbige Zeilen/Spalten öfters nicht synchron,
und bitte auch mal Bereich markieren testen.
Fadenkreuz_2.ods
(10.45 KiB) 139-mal heruntergeladen
Bin auf gespannt wie es auf anderen Rechnern läuft
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Reihenfolge von Ereignissen

Beitrag von F3K Total »

Hallo clag,
Deine Makros funktionieren bei mir etwas flackerig. Ich hatte es auch schon mal mit Änderung der Zellhintergrundfarbe probiert.
Hat einen Nachteil, vorhandene Formatierungen werden ggf. überschrieben.
Auch ich habe mich mit dem Thema beschäftigt, versuche die normale Zellauswahl zu verwenden. Anbei meine aktuelle Beispieldatei.
Dank des Tipps von Axel läuft es, ohne Endlosschleife, aber:
Durch die Auswahl des Zellbereiches mit dem .CurrentController springt der Cursor dummerweise immer in die Spalte A und bleibt nicht bei der ausgewählten Zelle. Ich meine mich zu erinnern, das mikele mal ein Makro gepostet hat, das die Position des schwarzen Rechteckes festlegen kann. Ich kann es leider nicht mehr finden. Vielleicht kämen wir damit zum Ziel.
Kannst Du Dich vielleicht erinnern?

Gruß R
Dateianhänge
Fadenkreuz.ods
(9.37 KiB) 124-mal heruntergeladen
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Reihenfolge von Ereignissen

Beitrag von Stephan »

Bin auf gespannt wie es auf anderen Rechnern läuft
Beide Makros laufen bei mir hakelig, Test_1 noch schlechter als Test_2.

Intel Core 2 Duo E8500 3,16GHZ und 4 GB RAM, Windows 7


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

Re: Reihenfolge von Ereignissen

Beitrag von balu »

Hallo Leute,

ich bin mal so frei und gebe meine Beobachtung kund.

CPU:
AMD Phenom II X4 945 (4 Prozessoren)
3,01 GHz

RAM:
4 GB

Bildschirmauflösung: 1280 x 768 (ja ja! ich weiß! aber die Augen :? )


WinXP, AOO 4.1.2.

PC grad eben frisch gestartet.
Aktive sichtbare Programme: FireFox 49, IdoswinFree (Dateimanager), EditPad 3.5.1, und AOO.

So, und nun zur eigentlichen Datei.

*Test_1*

Gefällt überhaupt nicht.
clag hat geschrieben: in Test_1 klemmt es beim scrollen derart das nachträglich noch Zeilen/Spalten eingefärbt werden wenn man hastig mit dem Cursor die Auswahl verlegt,
Kann ich im groben bestätigen.


*Test_2*
Ist eigentlich ganz okay. Meine ich ernsthaft.
Ja okay, ein bischen hinkt das Fadenkreuz hinterher wenn ich zügig mit den Pfeiltasten navigiere. Mit zügig meine ich, das ich die Pfeiltaste nicht los lasse und schaue was das Fadenkreuz so macht. Hinterhinken ist je nach eingeschlagener Richtung maximal 2 Zellen. Das Fadenkreuz hat aber sehr schnell den Cursor eingeholt nach dem ich die Taste losgelassen habe.


So, und nun mal eine andere Betrachtungsweise.
Ihr alle habt wohl höchstwahrscheinlich die Datei bei einem Zomm von 100% getestet. Macht das gleiche mal mit dem kleinsten Zoom Wert, so ca. 20%.
Dadurch wird die folgende Aussage von mir bestätigt, oder unterstüzt.

Da OO den sichtbaren Bildschirmausschnitt ja andauernd neu Berechnen und auswerten muss, wird sich eine sichtbare Verzögerung des Fadenkreuzes einfach nicht vermeiden lassen. Und je kleiner der Zoom-Wert ist, um so mehr muss OO Arbeiten. Es müssen ja Großflächig jede einzelne Zelle überprüft und Formatiert werden, und das braucht seine Zeit. Und wenn dann noch etwas umfangreichere Formeln in den Zellen stehen, dann möchter ich nicht wissen wie sich das dann bermerkbar macht, habe ich jetzt aber nicht getestet.l


Genau so wenig habe ich jetzt getestet, was passiert wenn man die Bildschirmaktualisierung ausschalten würde. Aber höchstwahrscheinlich wäre das wohl gegen dem Sinn des Fadenkreuzes.
Einzig wäre eventuell die Idee die Neuberechnung auszuschalten. Aber da weiß ich jetzt nicht ob dies das gleiche wäre wie Bildschirmaktualisierung auszuschalten.

Das wars erstmal.



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
Andromeda_104
**
Beiträge: 26
Registriert: Di, 12.03.2013 12:46

Re: Reihenfolge von Ereignissen

Beitrag von Andromeda_104 »

Hallo clag,

ich bin zwar in Sachen Makro-Programmierung nicht so firm wie viele der Spezis hier, aber vielleicht hilft dir ein einfacher Gedankenansatz meinerseits - als blutiger Anfänger - weiter, dein Vorhaben des verlässlichen Positionskreuzes doch noch umzusetzen.

Wenn ich es recht verstanden habe, dann liegt das Hauptproblem darin, dass die "aktuellen" Zellenpositionen bei einem schnellen Durchwandern des Tabellenbereiches nicht so schnell berechnet werden können und es ab einer gewissen Geschwindigkeit immer größeres Fehlerpotential gibt. Die Positionsberechnung hinkt also dem Durchwandern hinterher.

Ich weiß zwar nicht, wie man es per Makro-Code umsetzt, aber eine Lösung dieser Problematik könnte es sein, dass man nicht das eigentliche Durchwandern der Tabelle schon abbildet, sondern erst dann mit der Fadenkreuzberechnung beginnt, wenn das Durchwandern für Zeitraum X sich verzögert hat oder zum Stillstand gekommen ist; beispielsweise für eine halbe Sekunde.

Es müsste quasi eine Art Abfrage des Ruhezustandes der aktuellen Position erfolgen.

Viele Grüße von Andromeda_104
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Reihenfolge von Ereignissen

Beitrag von clag »

Hallo zusammen,

Danke an alle für die Rückmeldungen.

Also mit dem Tabellenereignis "Auswahl geändert" hatte ich wohl auf das falsche Pferd gesetzt und es kann so nicht funktionieren.
Eigentlich wollte ich damit verhindern, das ein Makro permanent im Hintergrund läuft, aber nun ja s.o..
Habe es nun doch mit einem permant laufenden Makro getestet und es scheint doch brauchbar zu funktionieren.
Habe noch einen Start/Stop Button eingebaut, dann kann mann es bei Bedarf starten und auch beenden.
Nichts für Tabellen die schon bunt sind, denn das wird zurückgesetzt.
Aber in einfachen Tabellen mit viel Inhalt kann es möglicherweise doch helfen den Überblick zu behalten.
Fadenkreuz_3.ods
(11.1 KiB) 145-mal heruntergeladen
Ich glaube, hoffe es ist nun auch ausreichend flüssig !?

Viel Spaß
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Reihenfolge von Ereignissen

Beitrag von F3K Total »

Hallo zusammen,
dank dieses Beitrages von Hanya, ist es gelungen, den Fokus nach der Auswahl des Zellbereiches mit dem .CurrentController wieder von der Spalte A auf die ausgewählte Zelle zu legen.
Anbei die Datei.
Das Fadenkreuz wird durch die normale Auswahlmarkierung der entsprechenden Zeile und Spalte gebildet, es verändert keine Farben.

Gruß R
Dateianhänge
Fadenkreuz.ods
(10.17 KiB) 125-mal heruntergeladen
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Reihenfolge von Ereignissen

Beitrag von clag »

Hallo F3K Total,

eigentlich ein schicke Idee so wie du es angegangen bist,
ABER so hat es doch auch einige Nachteile, die wie ich finde gravierender sind wie eine farblose Tabelle.

Da es sich bei dieser Art Markierung tatsächlich um eine aktive Auswahl handelt:
ist es praktisch nicht möglich eine andere Selektion vorzunehmen,
sind jegliche Mausziehfunktionen oder Tastatursprünge zb ctrl + runter nicht mehr möglich,
ist ein versehenliches Backspace der Killer für den Inhalt aller Zellen die im Fadenkreuz liegen,
kopieren/einfügen von Inhalten ist so nich möglich.

Entschuldige bitte das ich meine Kritik so deutlich schreibe :roll: ist rein sachlich.
Du bist ja sonst einer derer, in dessen Posts man einwandfreien Basic Code findet,
der mir meist hilft und den ich dann auch oft gern abschreibe :) .
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Reihenfolge von Ereignissen

Beitrag von F3K Total »

Hallo clag,
clag hat geschrieben:ist es praktisch nicht möglich eine andere Selektion vorzunehmen
Doch geht, wenn man den Mittelpunkt des Fadenkreuzes ein zweites Mal anklickt und die Maustaste dann gedrückt hält.
clag hat geschrieben:Tastatursprünge zb ctrl + runter
Geht bei mir, CTRL und rechts geht nicht
clag hat geschrieben:versehenliches Backspace der Killer für den Inhalt aller Zellen die im Fadenkreuz liegen,
Da hast du Recht, mit CTRL+Z kann man es aber bei einem Versehen noch retten
clag hat geschrieben:kopieren/einfügen von Inhalten ist so nich möglich.
Stimmt! Aber da mache ich es mir so einfach wie Du, schalte das Fadenkreuz einfach aus. :D Siehe Anlage.
Grundsätzlich hast du Recht, es ist alles etwas holperig.
Wer es nutzen möchte, kann es versuchen, vielleicht gewöhnt man sich dran, wenn denn das Fadenkreuz so wichtig ist.

Für mich sind die eingebauten Features, also, dass Zeile und Spalte markiert werden, sowie die Möglichkeit des Teiles/Fixierens des Fensters, völlig ausreichend, ich benötige überhaupt kein Fadenkeuz.

Gruß R
PS: Rettet den Genitiv :wink:
Dateianhänge
Fadenkreuz.ods
(11.61 KiB) 140-mal heruntergeladen
Antworten