Differenze tra le versioni di "Attivare un Componente dinamicamente da codice"
Riga 152: | Riga 152: | ||
obmc["uri"] = Object.Call(clMD, "Url", ["<FONT Color=gray>''/percorso/del/file/multimediale''</font>"]) | obmc["uri"] = Object.Call(clMD, "Url", ["<FONT Color=gray>''/percorso/del/file/multimediale''</font>"]) | ||
− | Object.Call(obPL, " | + | Object.Call(obPL, "Play", Null) |
<FONT Color=gray>' ''Consente l'esecuzione del file audio sino a quando, aprendo la Console/terminale, si premerà il tasto "Invio" sulla tastiera:''</font> | <FONT Color=gray>' ''Consente l'esecuzione del file audio sino a quando, aprendo la Console/terminale, si premerà il tasto "Invio" sulla tastiera:''</font> |
Versione delle 17:37, 18 mag 2021
Come è noto, un Componente di Gambas viene di norma attivato dall'IDE seguendo la seguente procedura:
Progetto-->Proprietà-->Componenti
e quindi nell'apposita finestra si attiva il Componente prescelto cliccando sul suo riferimento.
E' possibile, però, attivare un Componente anche successivamente, in modo dinamico, da codice. Per poter fare ciò, si dovrà fare uso del metodo .Load() della proprietà .Component:
Component.Load("gb.nome_del_componente")
Si faccia, infatti, questo esempio, nel quale si dovrà far aprire un file con il suo programma di default mediante il metodo .Open() della Classe Desktop. L'applicativo nell'esempio non ha attivato il componente gb.desktop, indispensabile per poter utilizzare il predetto comando: Desktop.Open("/percorso/del/file/da/aprire") previsto dall'applicativo medesimo.
Si proverà a verificare cosa succede cliccando prima sul tasto Button1, e successivamente sul tasto Button2:
Public Sub Form_Open() End Public Sub Button1_Click() ' Si effettua il tentativo di apertura di un file qualsiasi senza alcun tipo di attivazione del componente "gb.desktop": Desktop.Open("/percorso/del/file/da/aprire") End Public Sub Button2_Click() ' Si procede ad attivare il componente Gambas "gb.desktop", per poter utilizzare la funzione "Desktop.Open()". ' Inoltre si verificherà il suo nome, e se esso è stato effettivamente caricato: Print "Componente \""; Component.Load("gb.desktop").Name; "\" caricato: "; Component.IsLoaded("gb.desktop") ' Quindi si effettua il tentativo di apertura di un file qualsiasi: Desktop.Open("/percorso/del/file/da/aprire") End
In quest'altro caso, dopo aver attivato un Componente, sarannno utilizzati due suoi metodi:
Public Sub Main() Dim cl As Class Dim symb As String Dim ob As Object ' Viene attivato, ad esempio, il Componente "gb.sdl2.audio": Component.Load("gb.sdl2.audio") ' Viene presa in considerazione la Classe "Sound" del Componente "gb.sdl2.audio": cl = Class.Load("Sound") ' Pro memoria vengono mostrate tutte le risorse appartenenti alla Classe "Sound" del Componente "gb.sdl2.audio": For Each symb In cl.Symbols Print symb Next ' Viene richiamato il metodo ".Load()" della Classe "Sound" per caricare un file audio di formato WAV: ob = Object.Call(cl, cl.Symbols[0], ["/percorso/del/file.wav"]) ' Si usa la varibile di tipo "Oggetto", restituita dal precedente metodo "Object.Call()", ' per richiamare il metodo ".Play()" della Classe "Sound", al fine di eseguire il file audio WAV caricato: ob.play() End
oppure anche così (in questo caso usiamo la Classe "Music" del Componente "gb.sdl2.audio"):
Public Sub Main() Dim cl As Class Dim symb As String ' Viene attivato, ad esempio, il Componente "gb.sdl2.audio": Component.Load("gb.sdl2.audio") ' Viene presa in considerazione la Classe "Music" del Componente "gb.sdl2.audio": cl = Class.Load("Music") ' Pro memoria vengono mostrate tutte le risorse appartenenti alla Classe "Music" del Componente "gb.sdl2.audio": For Each symb In cl.Symbols Print symb Next ' Viene richiamato il metodo ".Load()" della Classe "Music" per caricare un file audio di formato WAV: Object.Call(cl, cl.Symbols[1], ["/percorso/del/file.wav"]) ' Viene ora invocato il Metodo ".Play()" per l'esecuzione del file audio WAV caricato: Object.Call(cl, cl.Symbols[2], Null) Do Sleep 0.01 Loop End
Gestione delle Proprietà possedute da una Classe di Componente
Con il Metodo Object.Call( ) è possibile gestire nel suo secondo parametro soltanto i Metodi posseduti dalle Classi del Componente impostato.
Per poter gestire anche le Proprietà, è necessario utilizzare i Metodi ".GetProperty( )" e ".SetProperty( )" della Classe "Object", assegnando al primo argomento di tale Metodo la variabile che si riferisce alla Classe prescelta del Componente richiamato.
Mostriamo un semplice esempio:
Public Sub Main() ' Viene attivato il Componente "gb.sdl2.audio": Component.Load("gb.sdl2.audio") ' Viene presa in considerazione la Classe "Music" del Componente "gb.sdl2.audio": cl = Class.Load("Music") ' Viene richiamato il metodo ".Load()" della Classe "Music" per caricare un file audio o Midi: Object.Call(cl, cl.Symbols[1], ["/percorso/del/file"]) ' Viene ora invocato il Metodo ".Play()" per l'esecuzione del file audio o Midi caricato Object.Call(cl, cl.Symbols[2], Null) ' Per utilizzare alcune "Proprietà" della Classe "Music", viene usato il Metodo "Object.GetProperty()", ' assegnando al suo primo argomento direttamente la variabile che si riferisce alla Classe "Music": While Object.GetProperty(cl, "State") == Object.GetProperty(cl, "Playing") ' Mostra il tempo trascorso dall'inizio dell'esecuzione: Write CStr(Time(0, 0, 0, Object.GetProperty(cl, "Pos") * 1000)) & "\r" Wend Print "Esecuzione terminata !" End
Differenza fra l'uso di Classi "Statiche" e l'uso di Classi "Creabili"
Negli esempi precedenti abbiamo visto come operare richiamando da codice un Componente e una o più sue Classi "Statiche".
Nel presente paragrafo, invece, vedremo come operare volendo utilizzare anche Classi "Creabili" di un Componente richiamato da codice.
Va detto che nel caso di uso di Classi "Creabili", sarà necessario creare appunto una "Istanza", un "Oggetto" di tali Classi, altrimenti verrà sollevato un errore proprio attinente all'impossibilità di utilizzare una risorsa della Classe "Creabile", direttamente passando come argomento la correlata variabile di tipo "Class".
Mostriamo un esempio, nel quale verranno richiamate alcune Classi "creabili" e una Classe "statica" del Componente "gb.media":
Public Sub Main() Dim clMP, clMD, clMC As Class Dim obPL, obMC As Object Dim s As String Component.Load("gb.media") clMP = Class.Load("MediaPipeline") ' Classe "Creabile" clMC = Class.Load("MediaControl") ' Classe "Creabile" clMD = Class.Load("Media") ' Classe "Statica" ' Poiché la Classe "MediaPipeline" è creabile, non può essere utilizzata in modalità "Statica"; e pertanto dovrà essere creata una sua istanza. In tale caso si dovrà usare il Metodo ".New()" della Classe "Class" e non il Metodo "Object.New()", altrimenti non sarà possibile. obPL = clMP.New(Null) ' Identico discorso anche per la Classe "MediaControl". In questo caso si dovranno impostare il "Genitore" e il "Tipo". obMC = clMC.New([obPL, "playbin"]) ' Richiama il Metodo "Url()" della Classe "Media". Qui è possibile usare direttamente la variabile di tipo "Class", poiché la Classe "Media" è "Statica". obmc["uri"] = Object.Call(clMD, "Url", ["/percorso/del/file/multimediale"]) Object.Call(obPL, "Play", Null) ' Consente l'esecuzione del file audio sino a quando, aprendo la Console/terminale, si premerà il tasto "Invio" sulla tastiera: Input s Object.Call(obPL, "Stop", Null) Object.Call(obPL, "Close", Null) End