LabVIEWForum.de
Bedienelemente bündeln zum Auslösen eines Events - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Bedienelemente bündeln zum Auslösen eines Events (/Thread-Bedienelemente-buendeln-zum-Ausloesen-eines-Events)

Seiten: 1 2


Bedienelemente bündeln zum Auslösen eines Events - Marcusius - 27.08.2019 17:05

Hallo.

Ich habe in meinem Programm viele Bedienelemente (zum Einstellen von Parametern eine Messgerätes). Wenn der Nutzer einen Parameter ändern möchte, verstellt er ein Bedienelement und damit wird dann ein Parameter im angeschlossenen Messgerät verändert. Im Frontpanel sind die Bedienelemente nach Gruppen in einem Tabcontainter gruppiert. Eine Lösung dafür wäre pro Parameter (=Bedienelement) ein Event-Case zu erstellen und dann den entsprechenden Parameter an das Gerät zu senden. Bei 50 Parametern wird das mit den Event-Cases unübersichtlich.

Frage: Ist es möglich die Bedienelemente zu gruppieren (kein Cluster) und dann in einem Event-Case auf die Gruppe zu reagieren?
Oder ich reagiere auf Änderungen im Tabcontainer. Das habe ich bereits probiert. Allerdings weiß ich nicht, wie ich herausfinden soll, welches Element in dem entsprechenden Tab das Event ausgelöst bzw. wo der Nutzer konkret hingeklickt hat.

Ideal wäre, für alle Parameter ein Event zu haben. Das dann ein SubVI aufruft, welches den Parameter übergeben bekommt und weiter mit dem Messgerät kommuniziert.


Ich danke euch für Anregungen zur Lösung der Aufgabe.

Hinweis: meine derzeitige Lösung ist, dass ich immer für eine Hand voll Parameter ein Event-Case habe. Hinsichtlich Erweiterung und Wartung ist das etwas mühsam.


RE: Bedienelemente bündeln zum Auslösen eines Events - GerdW - 27.08.2019 19:56

Hallo Marcusius,

sammle dir die Referenzen auf deine Controls ein, z.B. über die Controls[]-Property des Frontpanels, und erstelle dir damit ein benutzerdefiniertes Event. Dann reicht ein einziger Eventcase für alle Controls aus…


RE: Bedienelemente bündeln zum Auslösen eines Events - IchSelbst - 28.08.2019 10:15

(27.08.2019 17:05 )Marcusius schrieb:  (kein Cluster)
Die Methode von GerdW funktioniert gut. Kann ich empfehlen.

Noch mehr empfehlen würde ich allerdings, es doch mit Cluster zu machen. Man kann im Event den Alten mit dem Neuen Wert vergleichen und so den Index innerhalb des Clusters finden. Mit dem Index im Cluster (wie auch im Referenz-Array) kann man dann spezifische Abläufe starten


RE: Bedienelemente bündeln zum Auslösen eines Events - GerdW - 28.08.2019 12:04

Hallo,

ich mache die "spezifischen Abläufe" über das Control-Label. Das bekommt man über die Control-Referenz…


RE: Bedienelemente bündeln zum Auslösen eines Events - Lucki - 28.08.2019 21:18

(27.08.2019 17:05 )Marcusius schrieb:  Ist es möglich die Bedienelemente zu gruppieren (kein Cluster) und dann in einem Event-Case auf die Gruppe zu reagieren?
Was hast Du eigentlich gegen Cluster? Wahrscheinlich stört es Dich, dass Du dann bei der Gestaltung des FP weinig Spielraum hast, weil die Controls sich dann alle in einem kleinen Recheck befinden. Das muß aber nicht so sein. Man kann das Cluster transparent machen, so dass man den Rahmen gar nicht mehr sieht, und außerdm kann man den Cluster so groß machen wie das ganze FP-Fenster, und in dieses Cluster-Fenster andere Elemene hineinplatzieren, die gar nicht zum Cluster gerhören. Die Freiheit des FP-Designs ist damit praktisch keinererlei Enschränkungen unterworfen.

Zitat:Oder ich reagiere auf Änderungen im Tabcontainer. Das habe ich bereits probiert.
Da müßte ich noch etwas dazu lernen, ich weiß nicht wie das geht oder wie Du das meinst.

Zitat: Allerdings weiß ich nicht, wie ich herausfinden soll, welches Element in dem entsprechenden Tab das Event ausgelöst bzw. wo der Nutzer konkret hingeklickt hat.
Ganz einfach: auf der linken Seite des Ereigniscases gibt es den Anschluß "Referenz". Dort schließt Du den Eigenschaftsknoten "Beschriftung" an - und schon weißt Du es.


RE: Bedienelemente bündeln zum Auslösen eines Events - Marcusius - 29.08.2019 16:46

Hallo.

Ich dachte ich hätte die Nutzung von benutzerdefinierten Events verstanden. Leider nein. Ich habe damit auch noch nie gearbeitet...

Beiligend mein VI-Entwurf in Screenshotform.

[attachment=60344]

[attachment=60345]

Wie kann ich direkt auf eine Bedienung eines Frontpanelelementes reagieren?
Im User-Event geht das zwar. Aber um dieses Event auszulösen, muss ich doch vorher etwas anderes auslösen, oder nicht? Im gezeigten Beispiel hier, mit dem Schalter "Keine Ahnung".
Wie komme ich auf das FP-Element, dass das Ereignis ausgelöst hat?

Hinweis: Das VI am Anfang sammelt alle FP-Elemente ein.

Ich bin leider etwas ratlos... Confused


RE: Bedienelemente bündeln zum Auslösen eines Events - GerdW - 29.08.2019 20:32

Lege doch das benutzerdefinierte Event als ValueChange an, wenn du darauf reagieren willst...


RE: Bedienelemente bündeln zum Auslösen eines Events - Marcusius - 30.08.2019 14:12

Bei User Event kann ich kein "Value change" einstellen.

[attachment=60351]


RE: Bedienelemente bündeln zum Auslösen eines Events - IchSelbst - 31.08.2019 10:01

(29.08.2019 20:32 )GerdW schrieb:  Lege doch das benutzerdefinierte Event als ValueChange an, wenn du darauf reagieren willst...
@GerdW:

Das verstehe ich nicht:
Was meinst du mit "als ValueChange anlegen"? Anlegen heißt ja Erstellen: Kann man denn einen Event als Quelle für ein benutzerdefiniertes Event verwenden? Ist mit nicht bekannt. Würde ich als sinnlos erachten: Wenn ein Event vorliegt, warum dann nochmals weiterleiten? Da kann man doch gleich dort reagieren, wo das Event auftritt.

Bisher arbeite ich nur mit LV bis Version 2017. Mag sein, dass es in 2019 was neueres gibt.

@Marcusuis:

Du möchtest ja (unbedingt) keine Cluster verwenden. Nun gut.

Einen Sachverhalt (spricht: ein Problem) hast du aber grundsätzlich immer: Für jedes einzelne Bedienelement brauchst du einen spezifischen Algorithmus, also entweder einen eigenen Sourcecode oder einen parametrierten Sourcecode, der dann für mehrere Bedienelemente brauchbar ist. Aufgabe: Wo steht der Sourcecode, wenn es sich um 50 Bedienelemente handelt?

Vorteilhaft ist es immer, so wenig wie möglich Sourcecode innerhalb eines VIs zu haben (=> SubVIs). Grundsätzlich geht das auch mit deinen Wünschen.

Sammle alle ValueChange-Events deiner 50 Bedienelemente in einem einzigen Eventcase. Dann hat du zwar sehr, sehr wenig Sourcecode - aber einen "Nachteil": die Liste der Eventcase-Auslöser wird sehr, sehr lang. Dem Compiler bzw. dem Runtime-System ist die Länge egal, nicht aber dem Programmierer. Beachte, dass dieses alles mit Clustern wesentlich einfacher wird.

In dem einen Eventcase bekommt du jetzt zwei relevante Daten: "Referenz" und "Neuer Wert". Beide gibst du jetzt in ein SubVI. Vorteil: Das VI, speziell diese Eventcase, bleibt klein und übersichtlich (Hinweis: Funktioniert auch mit Clustern).

Über die Referenz (=> Name und Typ des Bedienelementes) kannst du feststellen, welches Bedienelement verarbeitet werden soll und welchen Datentyp es hat. Beachte, dass der Typ von "Neuer Wert" Variant ist, wenn die Ereignisquellen unterschiedliche Typen haben.

In dem SubVI kann du nun per "Name von Eventquelle" mittels einer Case-Struktur Eventquellen-spezifische Sachen machen.

Ausblick:
Für Cluster gilt: "Neuen Wert" mit "Altem Wert" auf Gleichheit vergleichen. Erste False-Position im Vergleichsarray ergibt den neuen Wert und indirekt den Bedienelementnamen. Mit Bedienelementname und Wert so verfahren, wie bereits oben dargelegt.


RE: Bedienelemente bündeln zum Auslösen eines Events - GerdW - 31.08.2019 12:20

Hallo zusammen,

Entschuldigung für die nicht korrekte Ausdrucksweise: "dynamisch registrierte Events" anstatt "benutzerdefinierter Events":
[attachment=60355]