LabVIEWForum.de
Array Scrollbalken abfragen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Array Scrollbalken abfragen (/Thread-Array-Scrollbalken-abfragen)



Array Scrollbalken abfragen - Novgorod - 08.10.2012 03:38

Ich stecke gerade ein wenig bei einem "Schönheitsfehler" fest...
Es geht um eine eigentlich simple Sache: Wenn der User ein 2D-Array manuell scrollt, sollen 1D-Arrays (als Zeilen- und Spaltenheader des 2D-Arrays gedacht) automatisch mitscrollen, siehe Anhang.

Da es offenbar kein Scroll- oder "Index-changed"-Event für Arrays gibt, ist die übliche Behelfslösung Maus-Events abzufragen (Mouse Down, Mouse Move etc.). Nun hat Windows aber die "Komfortfunktion", dass man den Scrollbalken mit der Maus "festhalten" kann, dabei die Maus aber komplett vom Array und sogar aus dem Programmfenster rausbewegen kann, während in der anderen Dimension weiterhin gescrollt werden kann.
Wenn man also Maus-Events nur auf dem entsprechenden Array abfragt, deckt man nicht alle Fälle ab - wenn die Maus beim Scrollen das Array verlässt, gibts kein Event, obwohl weitergescrollt werden kann (und er Index sich ändert). Man kann sich hier auch noch relativ einfach Abhilfe schaffen, indem man Maus-Events auf dem Pane abfragt - mit einem Klick auf dem Array wird ein "Scrollvorgang" gestartet und dann werden die Maus-Events auf dem Pane registriert und verarbeitet und bei "Mouse Up" wieder beendet (siehe Anhang).

Was ist aber, wenn die Maus beim Scrollen nicht nur das Array, sondern das vi-Fenster (Pane) verlässt? Das Scrollen geht dann immernoch (s.o., Windows-Feature), man kann aber keine Maus-Events mehr abfragen, weil die Maus ja garnicht mehr auf dem Pane ist...
Weiß jemand eine elegante Lösung, wie man z.B. trotzdem noch Maus-Events bekommt? Es würde auch reichen, wenn man den Scrollvorgang programmatisch einfach abbrechen könnte, sobald die Maus das Pane verlässt (also sowas wie ein "Mouse Up" Event an Windows schicken).
Eine brachiale Methode wäre es einfach permanent den Array-Index abzufragen, aber das ist eine unnötige Performanceverschwendung, daher sollte das schon irgendwie erst durch ein Event ausgelöst werden...


RE: Array Scrollbalken abfragen - NWOmason - 08.10.2012 06:04

(08.10.2012 03:38 )Novgorod schrieb:  Eine brachiale Methode wäre es einfach permanent den Array-Index abzufragen, aber das ist eine unnötige Performanceverschwendung.


Wenn du dies in den Timeout-Case hängst und diesen nur all 250ms aufrufst, sollte die Performance nicht sonderlich darunter leiden. Wichtig ist ja nur, das in diesem einen Fall, die Indizes der Row/Header-Arrays nachgezogen werden, sollte der User wirklich so interagieren.


Als alternative könntest du auch eine Tabelle nutzen, da kann man direkt die Row/Header-Arrays eintragen und das scrollen funktioniert dann automatisch Smile



Beste Grüße,
NWO


RE: Array Scrollbalken abfragen - Novgorod - 08.10.2012 18:45

Moin,

eine Tabelle ist für den Zweck eher schlecht geeignet, da ich in den Headern numerische Controls (mit data entry limits, increment/decrement, display format etc.) und keine Strings haben will und eine ordentliche Konvertierung recht aufwendig wäre. Außerdem sind die Möglichkeiten, die Header grafisch vom Tabelleninhalt abzutrennen, sehr beschränkt.

Im Timeout-Case habe ich schon andere Sachen drin, die alle 50ms ausgeführt werden. Es würde auch dann noch sicher keinen spürbaren Einfluss auf die Performance haben, aber man ist ja geneigt so wenig wie möglich zu pfuschen Wink...

Jedenfalls habe ich jetzt eine "Hybridlösung". Unter "Connectivity -> Input Device Control" kann man den Maus-Status abfragen, egal wo der Cursor ist. Nun kann man mit einem Klick auf das Array den "Scrollvorgang" starten und im Timeout-Case permanent den Array-Index synchronisieren und gleichzeitig die Maus abfragen, ob die Maustaste noch gedrückt ist. Lässt man die Maustaste los, beendet dies den Scrollvorgang (nach der Timeoutzeit natürlich). Das ist zwar keine echte Event-Lösung, aber den Performance-Pfusch gibts dann zumindest nur solange man die Maustaste gedrückt hält, was normalerweise nicht sehr lang ist...