Un "widget" può essere convertito in una classe?Questa discussione e gli script allegati sono stati istigati da:
Ho votato per il desiderio di Vince di a TextEditBox autocompletatore poiché era simile al mio "desiderio" per un built-in ListBox filtro. Avevo programmato specifiche interfacce utente (finestre di dialogo / finestre) ottenendo funzionalità simili per entrambi gli elementi. Tuttavia, ho deciso di provare a creare una funzione per creare automaticamente questi "widget" e, una volta completata con successo, determinare se a Classe può essere definito per prendere il posto di una funzione.
Ci sono 3 script allegati:
- TEB_LB_Widget.jsl - Questo script definisce le funzioni di supporto e due funzioni principali per creare questi widget: MakeLBFilter () e MakeTEBSelector () .
- TestMakeLBFilter.js l - Questo script include lo script sopra (dovrai cambiare il percorso per la posizione di quello script), quindi costruisce una semplice finestra con due diverse caselle di elenco, quindi crea un filtro listbox per ciascuno. Nota che lo script ha dichiarazioni di attesa, solo per dimostrazione. Ci sono diversi test case nella parte inferiore dello script. (Snippet di codice e display mostrati sotto.)
- TestTEBSelector.jsl - Questo è simile allo script 2. Controlla il percorso escluso. Questo widget è meno sviluppato.
Entrambi i widget potrebbero aggiungere funzionalità aggiuntive, ma ho deciso di perseguire la questione se ogni widget e le sue funzionalità possano essere create come istanze di una classe definita dall'utente.
Ho letto la discussione Esempi JSL orientati agli oggetti 2016/08/18. La sintassi non è ancora stata "cliccata" con me e sto cercando indicazioni su:
- È possibile utilizzare una classe JMP per definire un oggetto widget? In questo caso, la classe ha bisogno di un oggetto esistente (e probabilmente del suo contenitore) e una funzione per aggiungere un nuovo oggetto, e in ogni caso una lista.
- Se sì, una classe è un modo migliore per andare, e qualcuno ha un semplice esempio o un link alla documentazione diverso da quello incluso nel collegamento 2016, lo apprezzerei. Quindi cercherò la conversione. Aggiungo nomi, dalla discussione del 2016: @drewfoglia , @Phil_Brown , @msharp
@vince_faller , Sono d'accordo con la tua lista dei desideri, un built-in sarebbe il migliore. Tuttavia, sarebbe bello sapere come prototipare nuovi esempi.
Names Default to Here(1);
Include("C:\temp\TEB_LB_Widget.jsl");
myList1 = {"cat", "dog", "head", "cow", "heel", "help"};
dt = Open("$sample_data/semiconductor capability.jmp",Invisible);
myList2 = dt << get column names("Continuous", "string");
nw = New Window( "Example ListBox Filter",
HListBox(
VlistBox(
lb1 = ListBox(mylist1,
<<SET size=""></SET>
Nessun testo - elenco completo visualizzato
Sinistra utilizza "Contiene", a destra utilizza "Inizia con"
Ri: Un "widget" può essere convertito in una classe?Aggiornamento: la sintassi ha finalmente un senso e ho creato istanze di oggetti di classe. Quindi ho risposto alla mia domanda; la risposta è si.
Aggiornerò questo post per definire e utilizzare classi chiamate LBFilter e TEBSelector, una volta che le funzioni e i metodi sono stati programmati. Trovo la sintassi della classe JMP14 più facile da usare.
Ri: Un "widget" può essere convertito in una classe?Non ho tempo per approfondire questo argomento, ma dal momento di quella conversazione nel 2016, JMP 14 ha introdotto OOP in JSL con le lezioni. In precedenza raccomandavo di non implementare OOP in JSL e i metodi suggeriti in quel vecchio post erano molto hacky. A mio parere, erano più un esercizio nel determinare se si potesse fare piuttosto che un esercizio nella creazione di codice a livello di produzione. Voglio solo ufficialmente ritrattare quell'opinione ora che JMP 14 supporta classi e OOP e che i metodi incorporati saranno migliori da usare. Sembra che tu l'abbia già capito. OOP dovrebbe essere una grande metodologia per creare widget definiti dall'utente. Sono interessato a vedere il tuo prodotto finale.
Ri: Un "widget" può essere convertito in una classe?@gzmorgan,
Quando hai finito di capirlo, se puoi aggiornarmi e taggarmi sull'aggiornamento. Lo apprezzerei molto. Mi piacerebbe sicuramente lezioni di levrage con JSL e mi piacerebbe poter imparare dal tuo esercizio di apprendimento.
Ri: Un "widget" può essere convertito in una classe?Quindi continuo a pensare che le classi abbiano bisogno di un po 'di lavoro. La sottoclasse / l'ereditarietà sembra essere un po 'fastidiosa. Non c'è auto riferimento nativo nella classe, quindi i metodi che usano le finestre di visualizzazione non possono avere le loro funzioni che usano qualcosa degli attributi di classe. Ma ci sono dei problemi attorno a ciò @Justin_Chilton ha mostrato Qui . Sulla base di ciò ho realizzato un autocompletatore.
Ma l'ho fatto anche funzionalmente usando completer_box.jsl. E secondo Questo , i namespace speciali permetteranno le chiamate nello spazio dei nomi, quindi l'ho creato anche con il riquadro di contesto. Personalmente adesso, mi piace il metodo della casella di contesto, il migliore per questo.
Ri: Un "widget" può essere convertito in una classe? @vince_faller , lo script AutoCompleter che utilizzava le classi JMP era molto istruttivo. Non ho avuto il tempo di lavorare sulla mia sceneggiatura fino a circa un'ora fa e ho colpito immediatamente un muro. Ho deciso di fare riferimento ai link suggeriti e ho visto la tua risposta. Il pezzo chiave del tuo codice per farmi uscire dal mio angolo era usare self e obj = Expr (self).
<<SET text="" changed=""></SET>
Non ero sicuro di come fare riferimento alla classe del proprietario per << Set Text Changed (). Molto bella!
E ho trovato questo Guida agli script di JMP blurb riguardo all'oggetto JMP Class piuttosto confuso (pagina 293):
Gli appunti:
• Tutti i metodi, le variabili membro e le funzioni sono pubblici.
• Le funzioni definite all'interno di una classe non possono accedere alle variabili o ai metodi del metodo all'interno
classe.
Penso che sarei rimasto bloccato per molto tempo senza il tuo esempio. Questo vale 5 complimenti!