LabVIEWForum.de - (viele) Bedienelemente deaktivieren / aktivieren

LabVIEWForum.de

Normale Version: (viele) Bedienelemente deaktivieren / aktivieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Um die Programmoberfläche für den Anwender übersichtlich zu gestalten, werden bestimmte Bedienelemente je nach Anforderung ausgegraut / eingeblendet bzw. aktiviert, außerdem werden Cluster, Tabs usw. genutzt. Da das de- aktivieren der Bedienelemente über Property Nodes viel Platz im Programmcode einnimmt, will ich das in ein Sub-VI auslagern.

Es wird schon seit einiger Zeit ein Sub-VI (Set Enable State on Multiple Controls) verwendet, aber die benötigten Referenzen benötigen nicht (viel) weniger Platz.

Die Referenzen in ein Array oder ein Cluster (Darstellung als Icon) zu packen, würde Platz sparen.
Das Erzeugen eines entsprechenden Arrays bzw. Cluster ist mir leider nicht gelungen.


Ein Sub-VI mit mehreren Szenarien in einer Case-Struktur könnte eine weitere Möglichkeit sein.

Die Zustände der Controls würde im Sub-VI in entsprechenden Cases (Szenarien) festgelegt werden und das Sub-VI im Hauptprogramm mit dem Szenarien-Namen aufgerufen werden.

Dazu müssten alle Controls auf dem Panel erfasst werden, die Referenzen und Labels in ein Array gepackt werden. Wenn die Labels auch noch in einem Cluster stehen würden, könnte man diese über Unbundle by Name auswählen und damit die Referenzen zuweisen.

Das Auslesen der Controls ist kein Problem, aber das mit den Labels in einem Cluster schon.


Von den Umsetzungsproblemen abgesehen, finde ich beide Möglichkeiten nicht ganz optimal.

Hat jemand eine bessere Idee oder sogar schon eine fertige Lösung im Einsatz?
Hallo Frank,

ich mache das so:
1. Ich sammle alle mich interessierenden Referenzen mittels eines subVIs ein:
[attachment=59387]
Hier muss man darauf achten, die nötige Rekursionstiefe bei der Suche nach Controls zu erreichen (TabContainer, Cluster).
Neuere LabVIEW-Versionen bringen dafür auch ein fertiges VI mit, aber ich habe das hier schon unter LV8 entwickelt…

2. Diese Referenzen werfe ich in eine FGV, die sich intern zu jeder Referenz einmal das Label des Controls holt und merkt:
[attachment=59388]
3. Wann immer es jetzt interessant wird, rufe ich diese FGV über einen Wrapper auf und sage nur noch, welches Control (anhand seines Labels!) en-/disabled werden soll:
[attachment=59389]

In diese FGV habe ich noch etwas "Logik" hineingepackt, damit mehrere Bedingungen für das En-/Disablen verwaltet werden. Damit erreiche ich, dass ich Controls an mehreren Stellen beeinflussen kann.
Beispiele:
- In der Konfigurationsdatei wird ein Mess- bzw. Ausgabekanal deaktiviert: die Routine, die die Konfiguration einliest, setzt hier schon alle deaktivierten Kanäle auf "disabled".
- In der Prüfstandssoftware wird ein Regelalgorithmus aktiviert: die zugehörige Routine setzt die entsprechenden Stellkanäle auf "disabled", da ja jetzt der Regler übernimmt.
- Es wird Regler A aktiviert, aber Regler B darf nicht gleichzeitig arbeiten: also setzt ReglerA den Einschalter von ReglerB auf "disabled"…
Gerd, das entspricht im Grunde meiner Idee.

zu 1. Habe ich mit TabContainer und Cluster schon umgesetzt (Weitere würden bei Bedarf folgen.). Deine Version ist etwas eleganter z.B. mit den Klassennamen.
Wo findet man das fertige VI der neueren LabVIEW-Versionen? Da ich das VI noch um weitere Möglichkeiten erweitern müsste, wäre das wahrscheinlich einfacher.

zu 2. Das Holen der Labels habe ich in 1. integriert. Das ist ja nur ein Property Node "Label.Text".

zu 3. Das wollte ich auch so machen, aber hier hänge ich an der Umsetzung.
Das mit der "Logik" entspricht wahrscheinlich meinen "Szenarien".
Wie klickst du die Logik zusammen? Ich wollte das über Cluster mit den Labels machen.

Könntest / würdest du deine VIs hier zur Verfügung stellen?
Hallo Frank,

Zitat:Zu 1. Wo findet man das fertige VI der neueren LabVIEW-Versionen?
Früher in den HiddenGems. (Schau mal in das PDF für LV2014.)
Immer noch: vi.lib\Utility\traverseref.llb

Zitat:zu 3. Das wollte ich auch so machen, aber hier hänge ich an der Umsetzung.
Ich merke mir zu jedem Control die "Caller" und deren En-/Disable-Wünsche. (Im letzten Bild oben fehlt noch ein String-Input an der Enable/Disable-Funktion, die den "Caller" angibt.)
Nein, die VIs kann ich hier nicht hochladen…

Zitat:Wie klickst du die Logik zusammen? Ich wollte das über Cluster mit den Labels machen.
Alles, was mit Key-Value-Paaren zusammenhängt, löse ich mit VariantAttributen.
Einfach den Control-Label als Attributnamen verwenden, im Attribut selbst ist dann die Datenstruktur zur Verwaltung des En-/Disable-Zustands gespeichert.
Referenz-URLs