l' unica cosa che mi viene in mente è questa:
DIM ihandle AS NEW Pointer[]
DIM ahandle AS Integer
SHELL "rxvt" ' parte l'applicazione
riprova:
ihandle = Desktop.Find("rxvt") 'trovo l'id (si dice così ?)
if ihandle.count=0 then goto riprova
ahandle = ihandle[0] 'prendo il 1° ris del Find della riga sopra
Embedder1.Embed(ahandle) 'embeddo
io lo utilizzato per realizzare un programmino per vedere la tv digitale terrestre
in pratica inglobavo nel mio form la finestra video di mplayer lanciato con comando exec.
ps @ giac_fab
se utilizzi exec o shell per avviare un programma (ad esempio rxvt) ti conviene controllare l' applicazione tramite un processo altrimenti chiudendo la tua applicazione il programma lanciato rimarrà in memoria e non verrà terminato, questo in alcuni casi puo essere problematico.
ovvero ti conviene modificare il codice in questo modo:
PRIVATE hpro as process ' questa la devi dichiarare all' inizio del programma
DIM ihandle AS NEW Pointer[]
DIM ahandle AS Integer
hpro=exec ["rxvt"] ' parte l'applicazione
riprova:
ihandle = Desktop.Find("rxvt") 'trovo l'id (si dice così ?)
if ihandle.count=0 then goto riprova
ahandle = ihandle[0] 'prendo il 1° ris del Find della riga sopra
Embedder1.Embed(ahandle) 'embeddo
in questo modo potrai terminare l' applicazione lanciata con un semplice
hpro.kill
esattissimo
per " killare" in form_close()
PUBLIC SUB form1_close()
TRY hprocess.kill
IF NOT ERROR THEN
hprocess.kill
ENDIF
END
ho provato, leggendo questo topic, per imparare qualcosa sull embedder... ma...
' Gambas class file
PRIVATE hpro AS process
PUBLIC SUB _new()
iniziale.Title = "prova embedder"
END
PUBLIC SUB Form_Open()
DIM ihandle AS NEW Pointer[]
DIM ahandle AS Integer
hpro = EXEC ["rxvt"] ' parte l'applicazione
riprova:
ihandle = Desktop.Find("rxvt") 'trovo l'id (si dice così ?)
IF ihandle.count = 0 THEN GOTO riprova
ahandle = ihandle[0] 'prendo il 1° ris del Find della riga sopra
Embedder1.Embed(ahandle) 'embeddo
END
PUBLIC SUB Exit_Click()
iniziale.Close
END
è uguale a qualche post fa, mi da il seguente errore a me:
UNknown symbol find in class desktop
è risolvibile?
1) senza goto come faccio? senza il goto ottengo prestazioni migliori?
2) sono riuscito, ma ad esempio se voglio inglobare KOLF, me lo ingloba, ma mi apre anche una finestra KOLF, quindi mi ritrovo con 2 KOLF, uno nel mio form e uno x gli affari suoi come se fosse lanciato normalmente.. consigli per risolverlo?
allego il codice che ho usato:
PUBLIC SUB _new()
iniziale.Title = "prova embedder"
END
PUBLIC SUB Form_Open()
DIM ihandle AS NEW Pointer[]
DIM ahandle AS Integer
SHELL "kolf" ' parte l'applicazione
WAIT 0.1 ' se non lo metto le fasi successive crashano, se metto 0.1 certe volte va certe no
ihandle = Desktop.Find("Kolf") 'trovo l'id (si dice così ?)
ahandle = ihandle[0] 'prendo il 1° ris del Find della riga sopra
anna1.Embed(ahandle) 'embeddo
END
PUBLIC SUB Exit_Click()
iniziale.Close
END
mmmmmmmmmm non ci saimo... ehhe
form 2:
PUBLIC SUB Form_Open()
SHELL "kolf" ' parte l'applicazione
WAIT 0.2 ' se non lo metto le fasi successive crashano, se metto 0.1 certe volte va certe no
var.ihandle = Desktop.Find("Kolf") 'trovo l'id (si dice così ?)
var.ahandle = var.ihandle[0] 'prendo il 1° ris del Find della riga sopra
anna1.Embed(var.ahandle)
END
form 1:
PUBLIC SUB kolf_Click()
iniziale.Close
from2.Show
END
se faccio partire il programma da form2, l'embedder funziona a dovere, se lo faccio partire da form1 no!!!
inoltre ho messo le variabili in un modulo ho fatto bene?
var:
PUBLIC ihandle AS NEW Pointer[]
PUBLIC ahandle AS Integer
infine, con che comando chiudo un programma in embedder?
i casi son 2:
1- o io anziche far progressi torno indietro
2- gambas si prende gioco di me
:-D :-D :-D :-D
il discorso dei vari form ci lavoro nel fine settimana, ma se ora scrivo in un unico form:
' Gambas class file
PUBLIC ihandle AS NEW Pointer[]
PUBLIC ahandle AS Integer
PUBLIC SUB _new()
END
PUBLIC SUB Form_Open()
SHELL "konsole -e $HOME/script_download"
WAIT 0.2
ihandle = Desktop.Find("konsole") 'trovo l'id (si dice così ?)
ahandle = ihandle[0] 'prendo il 1° ris del Find della riga sopra
Embedder1.Embed(ahandle)
END
e lo lancio mi da lerrore: out of bounds
che non so che significhi...
in pratica non trovando nessuna finestra di titolo Konsole gambas da errore perche la variabile array ihandle ha come count 0 quindi non puoi indirizzarla con ihandle[0] perchè l' indice 0 non esiste.
potresti modificare con:
' Gambas class file
PUBLIC ihandle AS NEW Pointer[]
PUBLIC ahandle AS Integer
PUBLIC SUB _new()
END
PUBLIC SUB Form_Open()
SHELL "konsole -e $HOME/script_download"
WAIT 0.2
ihandle = Desktop.Find("konsole") 'trovo l'id (si dice così ?)
if ihandle.count <>0 then
ahandle = ihandle[0] 'prendo il 1° ris del Find della riga sopra
Embedder1.Embed(ahandle)
else
message.errore("finestra non trovata","oK")
endif
END
dovrebbe funzionare
mi fa strano però che tramite schell lanci konsol che lancia uno script.. credo si possa fare di meglio.
cmq controlla che effettivamente la finestra da inglobare si chiami konsole e non qualcosa d' altro , ricorda che sono importanti anche le maiuscole!
Comunque fsurfing ha ragione...è inutile richiamare un terminale col comando SHELL poichè lo stesso comando simula già una console. Puoi lanciare direttamente lo script con:
SHELL "$HOME/script_download"