Salve, sto cercando di creare una semplice gui per il programma units (comando) di linux. Ho notato che manca una gui e pensavo di crearla con gambas.
Il problema è il seguente. Una volta installato units col comando sudo apt-get install units questo è presente nel sistema operativo pronto per essere lanciato. Se viene lanciato da gambas con Shell si apre e si vede il risultato nella console di gambas. Fino qui tutto ok. Il comando units inizialmente chiede quale unità di misura bisogna convertire. Ho pensato di mettere un bel "shell units for write" per immettere l'input "prova" e "prova1" da due TextArea differenti. Ora mi sono già arenato. Units chiede l'unità da convertire e poi l'unità desiderata, poi converte spara il risultato e inizia da capo.
Non capisco come fargli digerire i due input necessari e visualizzare l'output in una terza Textarea
Public Sub Button1_Click()
Dim prova As String
Dim prova1 As String
Shell "units" For Write
prova = TextArea1.Text
prova1 = TextArea2.Text
Print prova
Print prova1
Il programmino vorrei integrarlo in Azeotrope insieme ad altri calcoli chimico-fisici.
La ragione di usare la shell di linux è che units è l'unico convertitore che conosco in grado di fare le conversioni con multipli e sottomultipli del S.I.
Riscrivere il programma totalmente in gambas è un obiettivo a medio termine ma per ora mi accontenterei di fare andare la pappa pronta.
Grazie per eventuali dritte.
Ho pensato di mettere un bel "shell units for write" per immettere l'input "prova" e "prova1" da due TextArea differenti.
Non capisco come fargli digerire i due input necessari e visualizzare l'output in una terza Textarea
Devi gestire il processo lanciato con Shell mediante una viariabile di tipo Process.
Esempio semplice:
Private pr As Process
Public Sub Form_Open()
pr = Shell "units" For Write
end
Public Sub Button1_Click()
Write #pr, TextArea1.Text
End
Al riguardo, ad esempio, vedi qua:
https://www.gambas-it.org/wiki/index.php/Lettura_dati_da_un_Processo_e_scrittura_dati_in_un_Processo_mediante_Process
ed anche qua:
http://www.gambas-it.org/smf/index.php?topic=1908.msg21179#msg21179
in modo particolare l'applicativo di esempio fatto da fsurfing.
Riscrivere il programma totalmente in gambas è un obiettivo
...sarebbe molto più interessante !
pr As Process
Public Sub Form_Open()
pr = Shell "units" For Write As "pr"
End
Public Sub Button1_Click()
Print #pr, TextArea1.Text
Print #pr, TextArea2.Text
End
Allora funziona.
Problema successivo. I dati di risultato li vedo scritti nella console di gambas. Dovrei portarli in una terza area di testo per visualizzarli correttamente. Come si legge da console gambas e si scrive in un'area di gambas?
pr As Process
Public Sub Form_Open()
Shell "gnome-terminal -e script"
pr = Shell "units" For Write As "pr"
End
Public Sub Button1_Click()
Desktop.OpenTerminal
' Attendiamo la creazione del file speciale "/dev/pts/1":
Do
Wait 0.01
Loop Until Exist("/dev/pts/1")
' Leggiamo dal file "typescript", ed indirizziamo il contenuto al nuovo Terminale appena aperto:
Shell "cat /percorso_del_file/typescript > /dev/pts/1"
Print #pr, TextArea1.Text
Print #pr, TextArea2.Text
End
Ho provato il metodo script ma non vedo nessun file typescript creato....La guida non mi sembra chiara.
Purtroppo se inserisco comandi shell write non posso mettere poi lo stesso comando con read.
pr = Shell "comando" For Read Write
Mi sembra strano che non ci sia una soluzione semplice per leggere quello che avviene in console di gambas
...non è proprio una cosa semplice.
Ovviamente riscrivere il programmino per convertire le unità di misura sarebbe semplice...e poi -units- è talmente efficiente da sbalordire.
Se non erro, la libraria esterna su cui si basa units è "libudunits2-0".
Utilizzando le risorse della sua API, otterresti i medesimi risultati. :-\
pr As Process
Private prova As Process
Public Sub Form_Open()
pr = Shell "units" For Write As "pr"
prova = Exec [System.Shell] For Read Write As "processo"
End
Public Sub processo_Read()
Dim s As String
Line Input #prova, s
result.Text &= s & "\n"
End
Public Sub Button1_Click()
Print #pr, TextArea1.Text
Print #pr, TextArea2.Text
End
Con questo codice non mi apre nessuna shell. Per System.shell si intende /bin/sh?
Mentre con questo non succede nulla.
pr As Process
Private por As Process
Private fl As File
Public Sub Form_Open()
pr = Shell "units" For Write As "pr"
por = Exec [System.Shell] For Write
' Apriamo in lettura e sottoponiamo in osservazione lo standard Out:
fl = Open "/dev/stdout" For Read Watch
End
Public Sub Button1_Click()
Print #pr, TextArea1.Text
Print #pr, TextArea2.Text
End
Public Sub File_Read()
Dim s As String
Line Input #fl, s
result.Text &= s
Print "Osservato: "; s
End
Ho fatto altre prove, creando un apposito piccolo e semplicissimo programma, che ho scritto in C:
#include <stdio.h>
int a;
void main() {
while (1) {
printf("-> %d\n", a);
sleep (1);
a++;
};
}
il quale ogni secondo scrive nello standard output un valore numerico crescente.
Ho, poi, realizzato un piccolo applicativo in Gambas che lancia e gestisce il processo di quel programmino C con Exec [].
Se pongo la riga del comando Exec [] in modo essenziale:
pr = Exec ["/percorso/del/programmino/C"]
vedo scrivere nella console dell'IDE di Gambas ogni secondo i numeri crescenti.
Invece, per intercettare questi dati dalla console ad una TextArea, posta sul Form, ho dovuto ovviamente porre in osservazione il processo.
La differenza rispetto ai precedenti tentativi, anche in questa discussione esposti negli ultimi inteventi e nella WIKI, è che il processo va dichiarato eseguito in lettura con la parola For Input, e non For Read:
pr = Exec ["/percorso/del/programmino/C"] For INPUT As "prova"
Mi pare che tu, però, abbia bisogno di una dichiarazione doppia, in lettura ed in scrittura, del processo. In tal caso, Gambas non accetta la compresenza della parola Input e della parola Write. Pertanto, devi provare l'efficienza del tuo codice utilizzando congiuntamente le parole Input ed Output.
pr As Process
Public Sub Form_Open()
pr = Shell "units" For Input Output As "pr"
End
Public Sub Button1_Click()
Print #pr, TextArea1.Text
Print #pr, TextArea2.Text
End
Mi sembrava ragionevole che fosse così. Purtroppo non va. Era un esperimento che avevo già fatto ieri. Non funziona neppure con Read Write- Nel tuo caso di programma in C l'interazione è di sola lettura. Invece units ha due fasi di scrittura ed una di lettura.....
pr As Process
Public Sub Form_Open()
pr = Shell "units" For Write
End
Public Sub Button1_Click()
Print #pr, TextArea1.Text
Print #pr, TextArea2.Text
Read #pr, TextArea3.Text
End
Invece proprio quello mi permette di immettere i dati di TextArea1 e TextArea2. Mi spiego ma sarebbe meglio che tu provassi ad installare units.
TextArea1.Text contiene le unità da convertire
TextArea2.Text contiene le unità che si vogliono ottenere.
TextArea3.Text contiene l'equivalenza tra la prima e la seconda ovvero il risultato finale.
Non riesco a leggere il risultato finale malgrado sia scritto in chiaro nella console di gambas. Questo è il problema.
No il programma si chiama units.
sudo apt-get install units
units
Ti confondi con un pacchetto che fa cose simili.
http://manpages.ubuntu.com/manpages/maverick/man1/units.1.html
Lol ho appena letto che si può usare in modo non interattivo e che riesce a generare degli output...Buona speranza allora.
...direi di più.
Se il programma units deve essere sempre riavviato per effettuare una conversione richiesta, allora non c'è proprio bisogno di porre in osservazione il flusso del processo.
Si può fare mooolto più semplicemente come nell'esempio che segue con il programma wmctrl:
Public Sub Form_Open()
Dim s As String
Shell "wmctrl -l -p" To s
Print s
End
Public Sub Form_Open()
End
Public Sub Button1_Click()
Dim a As String
Dim b As String
Dim risultato As String
a = TextArea1.Text
b = TextArea2.Text
Shell "units a b" To risultato
TextArea3.Text = risultato
End
Ho provato a cambiare approccio. Units viene avviato immettendo come unità di misura da convertire la variabile "a" e quella da ottenere come variabile "b" poi come detto il programma termina e si può ripartire da capo (mentre prima si avviava un processo infinito). Il comando da shell è giusto perchè funziona dalla shell di linux. Tuttavia il risultato non quadra perchè è come se non leggesse la a e la b. Forse sbaglio a mettere questo codice in questo modo. Eppure le due variabili le devo pescare dai due campi TextArea1 e TextArea2 per poi essere in grado di mettere il risultato in unad terza TextArea3.
Suggerimenti? Penso che siamo vicini alla soluzione. Si tratta di immettere correttamente le due variabili a e b.
....è come se non leggesse la a e la b. Forse sbaglio a mettere questo codice in questo modo.
Si tratta di immettere correttamente le due variabili a e b.
Prova così:
Shell "units " & a & b To risultato
Public Sub Form_Open()
End
Public Sub Button1_Click()
Dim a As String
Dim b As String
Dim resultat As String
a = TextArea1.Text
b = TextArea2.Text
Shell "units" & a & b To resultat
TextArea3.Text = resultat
End
Non le legge neppure in questo modo. Strano. Forse dovrebbero rientrare tra le virgolette come ho fatto precedentemnte. Possibile che non ci sia documentazione?
Forse dovrebbero rientrare tra le virgolette come ho fatto precedentemnte.
Non credo, poiché facendo questo test:
Public Sub Main()
Dim s As String = "/percorso/di/un/file.wav"
Shell "aplay s"
non funziona.
Invece, così:
Public Sub Main()
Dim s As String = "/percorso/di/un/file.wav"
Shell "aplay " & s
funziona.
...prova a distaccare in modo esplicito le due variabili; o con una virgola:
Shell "units " & a & "," & b
oppure con uno spazio:
Shell "units " & a & " " & b
...o con una virgola ed uno spazio:
Shell "units " & a & ", " & b
Public Sub Button1_Click()
Dim a As String
Dim b As String
Dim resultat As String
'Print #pr, TextArea1.Text
' Print #pr, TextArea2.Text
a = TextArea1.Text
b = TextArea2.Text
Shell "units " & a To resultat
TextArea3.Text = resultat
End
Legge solo la a ma la variabile successiva non "gli entra".
Edit: ora provo come hai riportato sopra ed incrocio le dita.
;D
bingo
Public Sub Form_Open()
End
Public Sub Button1_Click()
Dim a As String
Dim b As String
Dim resultat As String
'Print #pr, TextArea1.Text
' Print #pr, TextArea2.Text
a = TextArea1.Text
b = TextArea2.Text
Shell "units " & a & " " & b To resultat
TextArea3.Text = resultat
End
Ora perfeziono il codice con un menu a tendina e le unità di misura, un help e una breve guida. Dopo dovrebbe essere pronto. Si aprono scenari sconvolgenti per l'uso della shell di linux e di bash (la mia passione). Posso aprire un topic nel forum di ubuntu per perfezionare il tutto ovviamente facendo riferimento a questa discussione?
Intanto buon Natale.
bingo
Sì, dunque possiamo dire che per passare due o più variabili come argomenti, bisogna tenere presente della modalità prevista dal comando specifico.
Ad esempio, ho fatto la prova con il compilatore gcc. Funziona, come per units, così:
Public Sub Main()
Dim s1, s2 As String
s1 = "/percorso/del/file/C/compilato"
s2 = "/percorso/del/file.c/da/compilare"
Shell "gcc -o " & s1 & " " & s2
End
appunto con lo spazio che separa le due variabili di tipo Stringa.
Caso diverso quando il comando prevede che gli argomenti siano separati da virgole.
Vediamo l'esempio del comando wmctrl utilizzato per spostare una finestra sul desktop.
Una linea di comando come questa:
Shell "wmctrl -r nome_finestra_da_spostare -e 0,500,800,600,300"
utilizzando le variabili funziona così:
Public Sub Main()
Dim s1, s2, s3 As String
s1 = "0"
s2 = "500"
s3 = "800"
Shell "wmctrl -r nome_finestra_da_spostare -e " & s1 & "," & s2 & "," & s3 & ",600,300"
End
Public Sub Button1_Click()
Dim a As String
Dim b As String
Dim c As String
Dim d As String
Dim e As String
Dim f As String
Dim resultat As String
a = TextArea1.Text
b = TextArea2.Text
c = a & b
d = TextArea3.Text
e = TextArea4.Text
f = d & e
Shell "units " & c & " " & f To resultat
TextArea5.Text = resultat
End
Creo passo per passo le tendine per le unità di misura. Vado avanti in questa discussione così si vedono i risultati. Le unità di misura aggiornate si trovano in un file installato su ubuntu che allego.
Codice riepilogativo:
Public Sub Form_Open()
End
Public Sub Button1_Click()
Dim a As String
Dim b As String
Dim c As String
Dim d As String
Dim e As String
Dim f As String
Dim g As String
Dim h As String
Dim resultat As String
a = TextArea1.Text
b = ComboBox1.Text
c = ComboBox2.Text
d = a & b & c
e = TextArea2.Text
f = ComboBox3.Text
g = ComboBox4.Text
h = e & f & g
Shell "units -v " & d & " " & h To resultat
TextArea3.Text = resultat
End
Gambas 3.5.1. L'icona non compariva neppure nella 3.1.1 di ubuntu 13.10.
[System]
Gambas=3.5.1
OperatingSystem=Linux
Kernel=3.11.0-15-generic
Architecture=x86_64
Distribution=Ubuntu 13.10
Desktop=GNOME
Theme=QGtk
Language=it_IT.UTF-8
Memory=3829M
[Libraries]
Cairo=libcairo.so.2.11200.16
Curl=libcurl.so.4.3.0
DBus=libdbus-1.so.3.7.4
GStreamer=libgstreamer-0.10.so.0.30.0
GStreamer=libgstreamer-1.0.so.0.200.0
GTK+=libgtk-x11-2.0.so.0.2400.20
OpenGL=libGL.so.1.2.0
Poppler=libpoppler.so.43.0.0
Qt4=libQtCore.so.4.8.4
SDL=libSDL-1.2.so.0.11.4
per l' invio delle mail ti mancano alcuni parametri:
correggi così:
Public Sub ToolButton4_Click()
Dim vTo As New String[]
Dim bcc As New String[]
Dim cc As New String[]
Dim vSubject As String
Dim vBody As String
Dim vAttach As String
vTo.Add("pippolippo@yahoo.it")
Desktop.SendMail(vTo, cc, bcc, vSubject, vBody, vAttach)
End
A me è sembrato Indeciso di capire (ma probabilmente mi sono sbagliato) che lui non riesca a vedere l'icona neppure in fase di impostazione iniziale del componente sul Form.
Magari, se aleandro può chiarire meglio la questione....
impossibile, al limite è nascosta da altri componenti presenti sul form, anzi no si vede benissimo vicino al pulsante conversione
per stampare puoi partire da qui, dopo aver inserito un nuovo bottone per la stampa
Public Sub button6_Click()
If Printer1.Configure() Then Return 'fai apparire il modulo di conf. stampante
printer1.Print()
End
Public Sub Printer1_Draw()
Dim x As Integer
Dim y As Integer
draw.Begin(printer1) ' Initializes the draw
draw.LineWidth = 1
Draw.Foreground = Color.black
x = 10
y = 10
draw.rect(x, y, 400, 200)
draw.Font.Name = "Utopia"
draw.Font.size = 9
draw.Font.Italic = True
Draw.Text("ciao a tutti", x, y)
Draw.end
End
tieni presente che perà questa modalità di stampa che hai utilizzato deriva da gambas2 ed utilizza i metodi draw, sarà compatibile solo con le ultime versioni di g3 , mi pare che prima della 3.1 non funzionasse.
se non vuoi complicarti la vita puoi fare così:
Private Sub GetText() As String
Dim sText As String
dim i as integer
' sText = Listbox1.Text
' If Not btnRichText.Value Then sText = Replace(Html(sText), "\n", "<br>")
' Return sText
For i = 0 To Listbox1.List.Max
sText = sText & Listbox1.List[i] & "\n"
Next
Return sText
End
altrimenti il ciclo for lo inserisci nel metodo draw e per ogni riga dai un comando di stampa testo
Ultimo problema da risolvere.
Le descrizioni dei comandi sono immesse in una TextArea quando si attivano le opzioni dei vari menu.
Per l'immissione utilizzo un codice così:
TextArea4.Text = "Il comando esegue una conversione tra due unità di misura eventualmente anche non uguali riportando il risultato sotto forma di fattore moltiplicativo ed anche sotto forma di quoziente."
Dunque il testo compare ma solo una parte resta dentro la TextArea che è decisamente più ristretta. Io vorrei che rimanesse tutto dentro in automatico senza dover creare dei capolinea artificiali; vorrei una cosa come la formattazione giustificata di libreoffice che mi tiene tutto il testo dentro i margini di TextArea.
Intanto allego l'ultima beta.
vorrei una cosa come la formattazione giustificata
L'azione sulla proprietà .Wrap che ti ho appena sopra segnalata, pur facendo restare il testo nei limiti della larghezza della TextArea, non conferisce un allineamento "giustificato" del testo medesimo.
Per ottenere anche questa caratteristica devi operare pure sulla proprietà ".Alignment":
With TextArea1
.Alignment = Align.Justify
.Wrap = True
.Text = "Il comando esegue una conversione tra due unità di misura eventualmente anche non uguali riportando il risultato sotto forma di fattore moltiplicativo ed anche sotto forma di quoziente."
End With