....Io guarerei le potenzialità di Sendkey (http://www.gambasdoc.org/help/comp/gb.desktop/desktop/sendkeys)....
Ringrazio gli intervenuti.
Il suggerimento di "Berserker79" è affascinante, ma, anche leggendo i dubbi di "Ceskho" al riguardo, ho cominciato con quello che mi sembrava a prima vista più abbordabile per me. E' stata la mia "prima volta" con la funzione "desktop.sendkeys", pertanto ho dovuto guardarmi le spiegazioni, fare prove, sbagliare, riprovare, bestemmiare, e tutto il resto normalmente annesso....
Ad ogni modo, ho ottenuto quello che volevo: far scrivere una semplice stringa in un altro editor di testo premendo un tasto dal mio programmino Gambas. Vi allego il brevissimo codice sperimentale ed esemplificativo e vi dico i due problemi che ho incontrato e come li ho risolti ....probabilmente non in modo elegante, ma mi pare di averli risolti:
' Gambas class file
PUBLIC SUB Form_Open()
SHELL "gedit" ' All'apertura del programma per comodità lancia l'editor "gedit"
' (uso "gedit" a fini sperimentali del codice)
END
PUBLIC SUB Button1_Click() ' serve a far andare il focus nell'editor "gedit"
' e quindi a tenere sempre il cursore all'interno di "Gedit"
ME.hide ' nasconde il form...
scrive() ' chiama la subroutine "scrive()"
END
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' mademoiselle la Subroutine......
PUBLIC SUB scrive() ' svolge le funzioni di scrivere in "gedit"
Desktop.SendKeys("Stringa ") ' scrive in "gedit" la stringa "con uno spazio finale",
' ...altrimenti non viene scritta :-(
Desktop.SendKeys("[BackSpace]") ' ...ma io non voglio lo spazio alla fine della stringa,
' e con questo comando lo elimino.
ME.show ' il form, che avevo precedentemente nascosto, resta tale solo per un attimo,
' perché mi deve essere subito mostrato per darmi la possibilità - qualora io lo voglia -
' di inserire un'altra volta la stringa premendo il tasto (e così via).
END
1^ questione: se metto normalmente la stringa (che dovrà essere scritta) in Desktop.SendKeys, ...nell'editor non mi viene scritta ???. Per farla scrivere devo porre uno spazio alla fine della stringa, in questo modo: "Stringa ".
La domanda è: perché ci vuole lo spazio ?
2^ questione: una volta premuto con il mouse il tasto del mio programmino, per far scrivere la stringa nell'editor avviato parallelamente, devo spostare il mouse per cliccare all'interno dell'editor. Insomma, per far comparire la scritta nell'editor devo fare in modo da attivare lì il focus del cursore. Però si capirà che questo è tutto un po' farraginoso con aggiunta di perdita di tempo: clicca qua nel programmino, spostati là nell'editor e cliccaci dentro per poter far comparire il risultato, poi torna al programmino Gambas per cliccare nuovamente sul tasto, poi torna sull'editor per vedere il risultato... insomma troppo un casino ! :nono:
Io, invece, ho bisogno di una cosa semplice e veloce ovviamente: clicco sul tasto del mio programmino Gambas e vedo apparire immediatamente la stringa prevista nel campo dell'editor; poi senza spostare il mouse di qua e di là nello schermo del monitor clicco nuovamente sul tasto e vedo immediatamente apparire la stringa prevista nel campo dell'editor ! Questo vorrei ! :hatecomputer:
Mentre riflettevo e provavo il mio programma, vedevo che, quando cliccavo nell'editor Gedit per far apparire la stringa, il programmimo Gambas ovviamente spariva, ....m'è venuto in mente, dunque, che se avessi fatto sparire il programmino all'atto della scrittura, senza però chiuderlo, forse avrei ottenuto il focus del cursore nell'editor, e quindi la comparsa della stringa (...come se avessi cliccato con il mouse nell'editor. Insomma ho pensato che avrei dovuto riprodurre in modo controllato il fenomeno della sparizione del mio programmino !). Ho utilizzato il comando ME.hide, ed infatti così è stato... e senza dover spostare il mouse là in gedit e cliccarci dentro ! Ovviamente mi serviva far comparire subito il programmino per poter cliccare nuovamente sul tasto. Per fare questo ho inserito il comando ME.show. ...a me la cosa va, forse è una soluzione rozza, ma pare che va :-\ !
La domanda è: secondo voi c'è un metodo alternativo più elegante e preciso ?
potresti provare a embleddare il tuo editor all' interno del tuo programma , magari funziona meglio, oppure puoi provare a vedere se esiste un comando in bash per dare il focus ad una data finetra, partendo dal suo id , in questo modo quando hai scritto cio che vuoi sul tuo programma dai il focus alla finestra dell' editor e poi di nuovo al tuo programma.
Grazie "fsurfing" per il tuo contributo. La funzione "Embedder.Embed" è abbastanza complessa da quel che ho visto... magari per questo miracolo mi voglio attrezzare meglio. ;D
Però prezioso è stato il tuo suggerimento del comando in bash. Facendo una ricerca, ho trovato il comando wmctrl, il quale consente di interagire, combinato soprattutto con l'opzione " -a ", appunto con una determinata finestra avente un certo "Nome" e/o "PID".
Per gli amici del forum, assetati di conoscenza, segnalo di seguito l'indirizzo web della pagina relativa al comando wmctrl: http://linux.die.net/man/1/wmctrl
Quindi ora il codice si trasforma mediante l'eliminazione dei precedenti comandi "ME.Hide" e "ME.Show", ed aggiungendo il comando: < SHELL "wmctrl -a Nome_finestra_del_programma" >.
Be', effettivamente un miglioramento c'è stato, giacché non avviene più quel macchinoso - seppur veloce - scompari/ricompari del Form, a causa del quale, se fatto fare più volte con frequenza troppo alta, potrebbe sorgere il rischio di un qualche crash: a me - anche se per una volta sola - s'è imballato :rolleyes: il sistema.
Segnalo, però, due cose:
- ora con il nuovo comando "wmctrl" non c'è più bisogno di inserire uno spazio alla fine della stringa e conseguentemente non c'è neppure più bisogno del comando "Desktop.Sendkeys("[BackSpace]"), perché la stringa viene mostrata nell'editor anche senza lo spazio finale che avevo dovuto inserire nel precedente codice.
- tra il nuovo comando "wmctrl" e "Desktop.Sendkeys" ho dovuto porre un wait (fissato comunque a 1/10 di secondo), altrimenti non viene scritta la stringa nell'editor (...altro mistero :mad: ).
Per riassumere, quel codice, sopra inserito, è diventato ora così:
' Gambas class file
PUBLIC SUB Form_Open()
' All'apertura del programma per comodità lancia l'editor "gedit"
' (uso "gedit" a fini sperimentali del codice)
SHELL "gedit"
END
PUBLIC SUB Button1_Click() ' svolge le funzioni di scrivere una stringa in "gedit"
' serve a far andare il focus nell'editor "Gedit", e quindi a tenere sempre il cursore all'interno di "Gedit"
'Il nome della finestra del programma Gedit è: " gedit "; quindi inserirò questo nome così scritto.
SHELL "wmctrl -a gedit" ' l'opzione " -a " serve ad assegnare appunto il focus nella finestra " gedit ".
' mi sono visto costretto ad inserire un seppur brevissimo WAIT,
' ...altrimenti la stringa non viene scritta :-(
WAIT 0.1
' scrive in "gedit" la stringa (lo spazio finale non è più indispensabile)
Desktop.SendKeys("Stringa")
END
Vi farò sapere eventualmente quello che succede con l'uso di Embed.
Vi farò sapere eventualmente quello che succede con l'uso di Embed.
...allora: la prova con Embedder1.Embed l'ho fatta ; ma mi ha creato alcuni dubbi e perplessità.
Preciso e premetto che la prova è stata fatta con Gambas 3, e che la finestra inglobata è stata quella Gedit.
Riporto - anche ad utilità degli altri - di seguito il codice base, suggeritomi da fsurfing e mio adattamento al caso, per Embed:
Public Sub Button1_Click()
Dim id As New Integer[]
id = Desktop.FindWindow(FMain.Title) ' .FindWindow : SOLO per Gambas3; mentre per Gambas2 è .Find !!!
If id.Count > 0 Then
label1.text = id[0] ' se si vuole vedere il PID
Endif
Embedder1.Embed(id[0]) ' inserisco la variabile contenente il PID della finestra (opportunamente già minimizzata) di Gedit.
End
La finestra di Gedit è stata appunto inglobata, ma...
- primo, la finestra di Gedit (o di qualsiasi altro programma prescelto) viene inglobata solo se è stata preventivamente minimizzata :hard: ! (cfr. al riguardo: http://www.gambas-it.org/smf/index.php?topic=1822.0). Lì ho domandato perché e soprattutto se anche altri riscontrano comportamenti analoghi, ma nessuno mi ha risposto. Ahimé !
- secondo, nella finestra inglobata di Gedit non è poi possibile scriverci (il cursore del mouse non compare), come se fosse inattivo ??? . Fatta, però, la prova di inglobamento invece con la calcolatrice, questa funziona regolarmente.
Aggiornamento:
Rendo noto che ho fatto delle verifiche (oggi 14.11.2011) sul funzionamento di Embed con Gambas 3 aggiornato, e rinvio a queste discussioni dove ho descritto i risultati finalmente positivi:
http://www.gambas-it.org/smf/index.php?topic=1923.msg21337#msg21337
http://www.gambas-it.org/smf/index.php?topic=1822.0
Si veda anche la Wiki: http://www.gambas-it.org/wiki/index.php/Embedder (http://www.gambas-it.org/wiki/index.php/Embedder)