io faccio così, non sò se sia la soluzione migliore però funziona :
PUBLIC SUB abc()
SHELL "comando" FOR INPUT OUTPUT AS "processo"
ENDIF
PUBLIC SUB processo_read()
'quello che verrebbe scritto sul terminale
DIM riga AS String
LINE INPUT #LAST, riga 'fai quello che vuoi con "riga"
textarea1.text &= riga & gb.newline ''>>>>>>>>>modifica per cescko
END
PUBLIC SUB processo_error(testo_errore AS string)
'il testo dell errore è quello tra parentesi .... non sò xchè
end
PUBLIC SUB processo_kill()
'quello che serve a te
END
Sarebbe meglio postare all'interno di un altro topic già riguardante argomenti simili secondo mè .....
Scusa leo ma perchè il tuo comando blocca anche i comandi che do prima..
Ti faccio un esempio...io voglio che il mio software prima apre un form e poi esegue un comando:
FForm.Show
SHELL comando WAIT
Il problema è che prima esegue il comando e poi quando ha finito apre il form...perchè?
Il problema da te riscontrato dipende dalla gestione della GUI di Gambas. In genere gli aggiornamenti delle finestre vengono fatti "un po' alla volta" e mai nell'istante esatto in cui vengono richiesti.
Ciò si può facilmente vedere in casi come quello da te descritti oppure ad esempio durante l'esecuzione di complessi calcoli con una ProgressBar che avanza per visualizzare lo stato del processo: in questo caso la finestra si freeza, finendo per essere aggiornata solo al termine dei calcoli.
Per evitare ciò basta mettere, sotto ai comandi che aggiornano elementi grafici quali widget vari o la stessa finestra, un bel
oppure
Il comando WAIT forza Gambas ad eseguire l'aggiornamento della GUI. Un eventuale numero dopo il comando indica invece un'attesa che deve essere minimo pari al valore impostato che esprime il tempo in secondi (quindi 0.1 equivale a 100 ms) e forza, inoltre, Gambas a leggere eventuali tasti premuti dall'utente, a leggere gli spostamenti ed i click del mouse.
Quindi, io metterei:
FForm.Show
WAIT 0.1
SHELL comando WAIT
Potrebbe essere che il programma che lanci non scriva sullo standard output e quindi la stringa resti vuota. Esempio banale con "ls":
PUBLIC SUB Main()
DIM slsLog AS String
SHELL "ls " & User.Home &/ "fileinesistente" TO slsLog
PRINT "primo log: " & slsLog
SHELL "ls " & User.Home &/ "fileinsistente" & " 2>&1" TO slsLog
PRINT "secondo log: " & slsLog
END
Chiedo a "ls" di 'listare' un file che non esiste e registrare il log. La prima stringa
rimane però vuota perché "ls" ha scritto sullo standar error. Così devo reindirizare
lo standard error su cui scrive "ls" sullo standard output. E ciò si fa con "2>&1"
Nel secondo esempio la stringa sarà sempre piena, o con il percorso del file, se esiste,
o con l'errore del programma. Ciao.