Sicuramente ti sarai trovato nella situazione in cui il tuo front panel sta esplodendo per i troppi controlli.
La via più comoda e veloce (e sai che se dico più comoda probabilmente non significa che è la migliore o la più efficiente) è il TAB Control, un controllo che permette di enumerare pagine, su cui vengono posizionati controlli in modo da razionalizzare e organizzare al meglio i controlli suddividendoli in viste.


TAB Control: Semplice ma attenzione.
Implementare un controllo a schede o TAB è molto semplice e intuitivo, basta posizionarlo e trascinare i controlli sulle pagine attive.
Il problema è che potresti abusare del fatto che il tuo pannello si stia effettivamente razionalizzando, inizia a prendere una organizzazione e i controlli sono visualizzati solo quando esponi la pagina che li deve mostrare.
Ma nel diagramma i controlli ci sono e li devi gestire, inoltre facilmente si inizia a creare 10 pagine con 10 controlli ciascuno, cosa???? 100 controlli in una UI, gestiti dal tuo diagramma?
Altra cosa più avanzata è che non è scalabile, immagina se devi fare qualche modifica pesante devi probabilmente ridisegnare la UI e rifare una o più tab.
Quando usare i controlli TAB?
Una regola è di usare questa opzione, quando ci sono pochi controlli da organizzare, sono di tipo Fittabile(vedi sotto) magari e sai che non dovrai apportare grandi modifiche al vi in seguito.
Controlli Fittabili
Non sono sicuro che sia un termine riconosciuto dalla nostra community di sviluppatori labVIEW ma è iniziato ad emergere con splitbar e pannelli per creare interfacce ridimensionabili.
I controlli fittabili sono Chart e tutti i grafici, le ListBox e Multilistbox e le Tables e anche i TAB lo sono purchè si usino solo controlli fittabili al loro interno. In pratica sono contenuti in un contenitore proprio che impostandolo a Fit to Pane si auto ridimensiona sul pannello in cui è stato inserito.
I controlli invece che si posizioniano insieme ad altri per esempio Stringhe, Digital e altri prederebbero dimensioni abominevoli oppure all’interno di una TAB che si ridimensiona, rischiano di andarsene a spasso se non gli metti un pò di codice che li riallinei.
Un esempio veloce per implementare un TAB Control
Un esempio veramente veloce, è stato accellerato a 4x 🙂 solo per farti vedere quanto puoi fare riorgaizzando le tab con sopra dei grafici e una listbox che usi come menu per farti girare tra le pagine.
SubPanel: Complessi ma Versatili
SubPanel offrono una soluzione più complessa ma versatile. Vengono caricati in memoria solo quando richiesti, consentendo architetture a plugin, modularità e separazione efficace delle GUI dal codice principale attraverso l’astrazione.
Questa flessibilità, tuttavia, introduce una maggiore complessità e la necessità di comunicazioni interprocesso.
Un esempio veloce, cerchiamo di fare qualcosa di simile al precedente esempio, ma sfruttando i subPanel.
Prima parte difficile devo caricare dinamicamente dei vi esterni al nostro Main.
Occorre quindi avere dimestichezza con chiamate dinamiche dei vi, metodi asincroni per passare i dati tra i vi chiamati.
Meglio conoscere anche le proprietà di rientranza che permettono ad un vi di lanciare un istanza di se stesso completamente autonoma.
Il metodo che preferisco ma non lo ritengo assoluto, per passare i dati, sono gli User Event.
Il video accellerato lo trovi qui
Dopo tutta questa fatica, quale è il vantaggio?
Lo so vedi più fatica che vantaggi, ma guardiamo bene:
Hai creato un vi SubPanel.vi che ha un Chart ridimensionabile (lo so si poteva fare più bellino, ma concentrati sul fatto che ha un oggetto solo fittabile, ma ancora meglio il vi è rientrante ovvero ogni chiamata che fai a quel vi crei una copia completamente indipendente del vi.
Quindi significa he se avessi avuto più fantasia, lo chiamavo Chart.vi e mi ero creato un vi che riutilizzo tutte le volte che voglio mettere un chart nel mio subPanel (ed è già fittato sul contenitore del subpanel e di conseguenza al panel che lo ospita. Già meglio no?
Ora tu mi dirai ma come gli passo i dati o meglio come lo controllo?
E’ il motivo per cui preferisco usare gli eventi per fare una comunicazione e controllo tra VI’s dinamici.
Se crei un user event Global STop booleano, e uno user event Data, e nel Chart.vi metti come terminali le loro reference e li registri alla stuttura ad eventi, ecco che ti sei creato un evento che riceve i dati e uno che riceve un eventuale stop per terminare il vi dinamico.
Ora il problema è come esporre i terminali del vi visto che chiamato dinamicamente non so come fare?
Usiamo il metodo Call and Forget, per far questo dobbiamo aprire il vi ma prendendone il Type Specifier, questo fa si che i terminali sono esposti nello Start Asycronous Task.

Questo esempio è solo velocemente una rappresentazione per i subPanel, ho lanciato tutte le istanze di grafico che ho messo in menu in modo che l’evento valuechange del menu, potesse estrarmi la Ref del vi o meglio dire del Chart in quella posizione.
In TimeOut gli passo i dati ma potrei passarglieli anche in modo diverso (per esempio potevo ceare un evento datastream per ciascun clone e così potevamo passare i dati con un indice corrsipondente al plot desiderato.

Quale scelta?
La decisione tra Tabs, SubPanel in LabVIEW dipende dalla complessità del progetto e dalle specifiche esigenze.
Entrambe le opzioni offrono vantaggi unici, e la scelta oculata contribuirà a ottimizzare l’efficienza e le prestazioni del sistema.
Se ci sono pochi controlli da gestire e non si hanno necessità particolari, la Tab è una valida soluzione.
Quando il numero di controlli diventa grande e quando si ha bisogno di Modularità e Scalabilità, i SubPanel sono una valida soluzione.