Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: - 01 Maggio 2008, 00:13:57

Titolo: Embedder
Inserito da: - 01 Maggio 2008, 00:13:57
Ciao

Siccome vedo il forum langue di nuovi post ci penso io  :-D

Ho un Embedder ( la funzione che mi permette di inglobare una finestra qualsiasi del mio desktop in un progetto gambas ).

Lo faccio funzionare così :

DIM ihandle AS NEW Pointer[]
DIM ahandle AS Integer

SHELL "rxvt"  ' parte l'applicazione
WAIT 0.2      ' se non lo metto le fasi successive crashano, se metto 0.1 certe volte va certe no

ihandle = Desktop.Find("rxvt") 'trovo l'id (si dice così ?)
ahandle = ihandle[0]           'prendo il 1° ris del Find della riga sopra
Embedder1.Embed(ahandle)       'embeddo

Lui funziona , ma a causa probabilmente del WAIT 0.2 ( e comunque per un istante lo vedrei ugualmente suppongo ) vedo apparire la finestra che poi và a spostarsi dove deve.

Obrobrioso !

Esiste la possibilità d'agire in maniera diversa e eliminare questo problema ( lo so son troppo pignolo, ma nn ci posso far niente ) ?? Dagli esempi mi son recuperato quanto sopra ... però ...
Titolo: Re: Embedder
Inserito da: fsurfing - 01 Maggio 2008, 20:33:27
l' unica cosa che mi viene in mente è questa:


Codice: [Seleziona]

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
Titolo: Re: Embedder
Inserito da: g.paolo - 02 Maggio 2008, 13:22:04
Visto che hai sollevato il problema e quindi ritengo tu ne sappia molto più di me, desidero chiederti:
L'embedder dici, è la funzione che permette di inglobare una finestra qualsiasi del desktop in un progetto gambas.
Ma cosa intendi con il termine "inglobare"?
Se è un'istantanea del desktop che serve, perchè non memorizzarla in un file immagine e poi richiamarla?
Se non è questo lo scopo, allora proprio non capisco a cosa potrebbe servire.
Titolo: Re: Embedder
Inserito da: md9327 - 02 Maggio 2008, 14:25:48
In realtà serve per inglobare, ossia gestire, un'applicazione esterna a Gambas da un'applicazione Gambas. Una specie di come Explorer o Firefox fà vedere un documento pdf, attraverso l'interfaccia adobe, all'interno della stessa finestra del browser, con tutti i menu e i comandi contenuti nella finestra di adobe.
In altre parole, crea un link con un altro processo X11 (applicazione su desktop), e ne gestisce la comunicazione, in modo da poterla controllare all'interno del tuo programma Gambas.
Titolo: Re: Embedder
Inserito da: leo72 - 02 Maggio 2008, 16:47:15
Ti consiglio di contattare Pixel, se non sta seguendo questa discussione perché oberato dal lavoro... tempo fa mi parlò di esperimenti condotti proprio con l'esempio Embedder di Gambas: magari può darti una mano.
Titolo: Re: Embedder
Inserito da: g.paolo - 02 Maggio 2008, 17:56:51
@md9327
 Molto chiaro il concetto, grazie!
@leo72
Al momento non ho l'esigenza di usarlo, ma quando ho una pulce è meglio che la levi subito. In tal modo se dovessi averne bisogno in futuro, mi sarà più facile ricordare che il tema è stato trattato adeguatamente e ne ho capito il significato.
Titolo: Re: Embedder
Inserito da: Pixel - 02 Maggio 2008, 18:03:07
E' vero alcuni mesi fa' ho fatto degli esperimenti con l'oggetto in questione.
Personalmente li ho poi abbandonati perchè "rischiosi", probabilmente è perchè non ho approfondito a sufficienza ed è probabile che usando Gnome ci sia un qualche conflitto.
In pratica è possibile inglobare TUTTO Gnome in una finestra ma poi non sono mai riuscito a "rilasciarlo" e non vi dico.
Non so'.. non ne vedo un gran utilizzo nelle applicazioni normali.
Ciao
Titolo: Re: Embedder
Inserito da: fsurfing - 02 Maggio 2008, 19:25:40
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:

Codice: [Seleziona]


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
Titolo: Re: Embedder
Inserito da: - 02 Maggio 2008, 21:24:46
Ciao

E' migliorato alquanto con il tuo aggiustamento, fsurfing .... adesso la cosa si è limitata ad un flash ..... grazie, così è accettabile .

Io sto usando l'embedder per inglobarmi nel file manager che mi sto facendo ( ne avete avuto a che fare un po tutti  :-) ) la console : utilizzavo quella degli esempi ma aveva un sacco di pecche ( non cera l'autocompletamento, certe informazioni non le visualizzava correttamente ecc ecc ) .....


Sono d'accordo con darth13 , in molti casi è utile approfondire l'argomento, per renderlo disponibile a ricerche future. Mi è tornato utilissimo per esempio un topic riguardante i menu e il menu editor le cui funzioni ignoravo assolutamente ....
Titolo: Re: Embedder
Inserito da: fsurfing - 03 Maggio 2008, 00:09:23
anche per la tua console ti conviene utilizzare l' implementazione di un processso  altrimenti ogni volta che il tuo proramma avvia la console  avrai in memoria una copia di rxvt che si aggiunge ai processi gia presenti sul pc.
questo lo puoi verificare tramite il monitor di sistema nella scheda processi
Titolo: Re: Embedder
Inserito da: - 03 Maggio 2008, 11:37:29
Si, avevo omesso di riportarlo .... ottimo consiglio grazie .....
Titolo: Re: Embedder
Inserito da: - 03 Maggio 2008, 12:51:28
Piccola modifica al tuo codice :

Ho visto che con un programma che ci mette un pò di più a partire (la console precedente ma con i tab, quindi millesimi di secondo) mi si creava un loop che mi impegnava il processore alla grande, l'embeddatura avveniva in media dopo 30 secondi ( nonostante il programma puro sia istantaneo).
Probabilmente gambas non riusciva a completare il find che gli si riproponeva il comando.

ho ovviato aggiungendo un seplice sleep di 0.01 sec è adesso funziona.




Ho notato che serve il process.kill .... nelle prove non lo avevo messo mi son trovato con 30 rxvt in backgranund .....
Titolo: Re: Embedder
Inserito da: - 18 Maggio 2008, 23:01:53
2 piccole cose ....

1° come potrei fare per killare in chiusura il processo ? Se non è aperto dà errore ....

2° Embeddando mi perde il "focus" sul form aperto ( passa in 2do piano ) come si fà a riprenderlo ?
Titolo: Re: Embedder
Inserito da: giulio - 19 Maggio 2008, 10:11:14
1) per non ricevere l'errore usa TRY, cioè
TRY _il_comando_per_killare_

2) dovrebbe essere Form.Show o Form.Raise o Form.SetFocus
a seconda del caso e di quello che stai facendo o del tipo di form che ti sottrare il focus.
Provali e vedi quale funziona. Ciao.
Titolo: Re: Embedder
Inserito da: - 19 Maggio 2008, 19:42:48
Il TRY funziona .... non crasha più .... però mi dice che il programma è uscito col il valore 1 ... come la elimino questa segnalazione ???


Show .... raise ecc ecc li avevo già provati ....

Il problema probabilmente è che faccio partire l'applicazione nel "windows manager" ( xfce ) quindi il focus esce da gambas ( che perde il focus proprio a livello "linux" ) e non lo riprende più .....

EDIT :
Mi si è accesa una lampadina :
 fmain.Hide
  fmain.Show
  fmain.Embedder1.SetFocus

Poco elegante ma funziona ..... come al mio solito  :-D
Titolo: Re: Embedder
Inserito da: fsurfing - 19 Maggio 2008, 19:59:30
esattissimo


per " killare" in form_close()

Codice: [Seleziona]



PUBLIC SUB form1_close()


 TRY hprocess.kill

   IF NOT ERROR THEN
      hprocess.kill
   ENDIF

END

 
Titolo: Re: Embedder
Inserito da: giulio - 19 Maggio 2008, 20:02:39
Nella guida di gambas, sotto "error messages" il #1 è "out of memory".
Non ho capito però se è il tuo programma che va out of memory o qualche altro
lanciato dal tuo programma.
Titolo: Re: Embedder
Inserito da: giulio - 19 Maggio 2008, 20:11:38
Citazione

fsurfing ha scritto:
esattissimo


per " killare" in form_close()

Codice: [Seleziona]



PUBLIC SUB form1_close()


 TRY hprocess.kill

   IF NOT ERROR THEN
      hprocess.kill
   ENDIF

END

 


mi permetto di correggerti. TRY esegue già l'operazione. la seconda parte è inutile
a meno che non si voglia fare un debug.
Titolo: Re: Embedder
Inserito da: - 19 Maggio 2008, 20:55:55
Se trova il processo aperto da killare lo killa e mi dice mi dice "valore d'uscita 1 " se non trova niente da killare non dice niente .....
Titolo: Re: Embedder
Inserito da: giulio - 19 Maggio 2008, 23:22:07
Ok, detto così sembra che il processo killato scriva sullo standard output
il codice d'errore.

puoi provare ad aggiungere questo alla fine del comando che stai eseguendo:

 2>/dev/null

ad esempio prova in un terminale:

ls cartellafarlocca

e

ls cartellafarlocca 2>/dev/null


in pratica "2>/dev/null" sopprime i messaggi d'errore. tuttavia non sapendo
come è strutturato il tuo programma questa è solo una possibile soluzione.

saluti
Titolo: Re: Embedder
Inserito da: ira83 - 06 Settembre 2009, 17:13:40
ho provato, leggendo questo topic, per imparare qualcosa sull embedder... ma...

Codice: [Seleziona]

' 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?
Titolo: Re: Embedder
Inserito da: - 06 Settembre 2009, 17:31:33
devi aggiungere il componente desktop sulle proprietà del progetto ( Menu progetto > Proprietà > Componenti

Ovviamente devi utilizzare "rxvt" solamente se vuoi utilizzare rxvt ..... se utilizzerai xterm o qualcos'altro .....

Poi la ricerca viene effettuata a livello del titolo che esce sulla barra del wm dell'applicazione ... quindi occhio ....

per compredere bene ti conviene fare qualche prova con l'esempio embedder .
Titolo: Re: Embedder
Inserito da: Ceskho - 06 Settembre 2009, 17:53:02
Un consiglio; evita il goto....è una delle peggiori istruzioni del mondo!!!!
Titolo: Re: Embedder
Inserito da: ira83 - 06 Settembre 2009, 22:37:05
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:

Codice: [Seleziona]


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

Titolo: Re: Embedder
Inserito da: - 06 Settembre 2009, 23:07:55
per evitare il GOTO (che in dialetto veneto vuol dire bicchiere) penso tu possa utilizzare WHILE .... ma non credo tu possa ottenere qualche miglioria su questo pezzettino di codice  :-x

che ti lanci 2 istanze di programma mi sembra strano .... se lo fai partire da console ne apre due o una ? Se provi con altri programmi ?
Titolo: Re: Embedder
Inserito da: ira83 - 06 Settembre 2009, 23:10:33
Sempre doppi... tutti i programmi.. è quello che non capisco...

per il GOTO molto interessante questo http://vec.wikipedia.org/wiki/Vin  :-)
Titolo: Re: Embedder
Inserito da: fsurfing - 06 Settembre 2009, 23:12:46
un metodo può essere anche il seguente:

l' anci l' applicazione tramite shell controllato da hprocess (vedi il tuo post in cui ti ho messo l' esempio)

tramite hprocess ricavi l' id del programma (se è un comando da terminale l' id sarà uguale a quello indicato da hprocess, se è un programma sarà aumentato di 1
Titolo: Re: Embedder
Inserito da: ira83 - 06 Settembre 2009, 23:19:17
Mi piacerebbe continuare sulla falsa riga dell'ultimo codice che ho postato dato che è anche l'unico che ho capito :)

non capisco il perchè mi apra due applicazioni.. apparte quello funziona..


--------


post edit

risolto :)

-------------

post post edit


ma per chiudere cio che è in Embedder1 come faccio?
Titolo: Re: Embedder
Inserito da: Ceskho - 07 Settembre 2009, 00:49:21
[Nettamente Off Topic]

Citazione

giac_fab ha scritto:
ma non credo tu possa ottenere qualche miglioria su questo pezzettino di codice  :-x


Allora...chiarisco subito così non se ne parla più!!!!
Il problema non è se il GOTO è più prestante o meno in questo codice; la questione fondamentale è che siccome ilnostro amico sta appena iniziando è meglio portarlo ora sulla retta via che non dover cambiare le sua bitudini dopo poichè risulterebbe più difficile.

Con questo spero di aver spiegato una volta per tutte il perchè scrivo cose che possono sembrare da professore pazzo! Io a 20 anni non voglio inseganre niente a nessuno ma solo aiutare!

[chiuso il netto off topic]
Titolo: Re: Embedder
Inserito da: ira83 - 07 Settembre 2009, 21:11:28
mmmmmmmmmm non ci saimo... ehhe

form 2:
Codice: [Seleziona]

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:
Codice: [Seleziona]

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:
Codice: [Seleziona]

PUBLIC ihandle AS NEW Pointer[]
PUBLIC ahandle AS Integer








infine, con che comando chiudo un programma in embedder?
Titolo: Re: Embedder
Inserito da: ira83 - 09 Settembre 2009, 19:23:59
nessun consiglio?
Titolo: Re: Embedder
Inserito da: - 09 Settembre 2009, 22:59:36
anche io uso un modulo VAR dove metto dentro tutte le variabili quando il progetto è bello grosso ....  :amici: siamo in contatto telepatico

per de-embeddare la finestra fai embEmbedder.Discard e penso poi l'unica sia affidarsi alla shell per chiuderlo con le buone o far un process.kill direttamente da gambas .... googla per la 1° soluzione o fai
processo (dichiarandolo prima ovviamente) = SHELL ecc ecc per la 2°

Per il problema che non riesci a far partire l'embeddere dal 1° form prova ad invertire i comandi : prima fai partire il 2° form e poi chiudi il principale ... ma sto andando ad intuito
Titolo: Re: Embedder
Inserito da: Ceskho - 10 Settembre 2009, 01:12:30
Se chiudi il primo form (che penso sia FMain) poi chiudi tutto il progetto. Al massimo lo nascondi.
Titolo: Re: Embedder
Inserito da: ira83 - 10 Settembre 2009, 22:07:01
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:

Codice: [Seleziona]

' 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...
Titolo: Re: Embedder
Inserito da: fsurfing - 10 Settembre 2009, 22:49:45
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:

Codice: [Seleziona]

' 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!
Titolo: Re: Embedder
Inserito da: Ceskho - 11 Settembre 2009, 00:52:12
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:

Codice: [Seleziona]

SHELL "$HOME/script_download"
Titolo: Re: Embedder
Inserito da: Ceskho - 03 Ottobre 2009, 02:34:13
Ho un grande problema con l'embrdedder. In pratica quando faccio un embed e poi un discard non posso più embeddare nulla nello stesso embedder...come mai?

Ho provato a liberare il puntatore aHandler[0] con free ma niente....
Titolo: Re: Embedder
Inserito da: Ceskho - 12 Ottobre 2009, 19:14:39
Nuovo problema...ho una finestra che viene embeddata soo che questa dopo un tempo variabile si chiude da sola (quindi si libera dall'embedder) e fa aprire un'altra finestra uguale..come faccio ad inglobare questa nuova finestra automaticamente quando la vecchia si chiude?
Titolo: Re: Embedder
Inserito da: Ceskho - 15 Ottobre 2009, 16:35:53
Suvvia non fatemi aspettare che arrivi giulio per aiutarmi....non ne vengo a capo....
Titolo: Re: Embedder
Inserito da: fsurfing - 15 Ottobre 2009, 19:24:09
qualche informazione in + non guasterebbe, in alternativa aspetta che arrivi giulio :)
Titolo: Re: Embedder
Inserito da: Ceskho - 16 Ottobre 2009, 15:39:33
In pratica ho un programma A che viene embeddato nel mio software B...dopo un tempo indefinito A si chiude per aprire automaticamente se stesso A1 e quindi si scollegare dall'embedder. Quando però si apre A1 vorei che venisse embedderato automaticamente. E' possibile?

Tutto questo processo succede una sola volta...cioè una volta che A si chiude per fare spazio ad A1 poi non c'è più bisogno di tutto questo processo perchè A1 lo chiudo io....
Titolo: Re: Embedder
Inserito da: fsurfing - 16 Ottobre 2009, 19:48:37
controlli con process quando si chiude il prog A , quindi liberi l' embledder(prob si liberaq da solo) poi se sai come si chiama il prog A1 ne cerchi l' indice e embeddi A1
Titolo: Re: Embedder
Inserito da: vuott - 12 Gennaio 2012, 23:05:20
Propongo la lettura anche di questi collegamenti:

http://www.gambas-it.org/wiki/index.php/Embedder

http://www.gambas-it.org/smf/index.php?topic=1923.0

http://www.gambas-it.org/smf/index.php?topic=1822.0

Titolo: Re: Embedder
Inserito da: fsurfing - 13 Gennaio 2012, 11:07:48
hei hai tirato fuori una discussione in cui cesko era un pivellino !!!!!!!!!!!!!!!!! :rotfl: :rotfl: :rotfl: :rotfl:
se la vede mi sa che la elimina! :rotfl:
Titolo: Re: Embedder
Inserito da: Ceskho - 13 Gennaio 2012, 11:42:47
hei hai tirato fuori una discussione in cui cesko era un pivellino !!!!!!!!!!!!!!!!! :rotfl: :rotfl: :rotfl: :rotfl:
se la vede mi sa che la elimina! :rotfl:

La cosa preoccupante è che ora sono molto più schiappa di prima.... :rotfl: