Passare dati in runtime ad un programma 'a linea di comando'
Come si sa, diversamente da un'applicazione grafica, in un programma a linea di comando non è possibile richiamare l'istruzione InputBox per immettere dati e passarli così al programma medesimo. E' possibile, però, in tal caso trovare una soluzione via codice per poter passare dati a questa applicazione a linea di comando, mentre essa sta funzionando.
Mostreremo in questa pagina almeno due modalità.
Utilizzare un ciclo
Tale modalità prevede l'attivazione di un ciclo, dal quale si uscirà solo quando si sarà passato all'applicazione Gambas un dato-stringa formato da uno o più caratteri:
Public Sub Main() Dim fl As File Dim s As String ' Esegue il ciclo, finché non sarà stato inviato al programma Gambas dal Terminale, ove esso è stato lanciato, uno o più caratteri tramite la tastiera: While IsNull(s) ' Intercetta quanto scritto nel Terminale, ove è stato lanciato il programma Gambas: Line Input #File.In, s ' Ricevuto quanto scritto nel Terminale, lo mostra nuovamente con aggiunta di altro testo nel Terminale medesimo: Print #File.Out, "I caratteri inviati sono: " & s Wend End
Utilizzare l'evento "Application_Read()"
L'uso dell'Evento "_Read()" della Classe Application consente di evitare che l'applicazione resti concentrata tutta nel ciclo, finché non riceve dati, come nella precedente modalità, e di effettuare così altre operazioni.
Con il seguente codice l'applicazione a linea di comando, lanciata in un Terminale, attende che siano immessi caratteri numerici per effettuare a scelta dell'utente una delle quattro operazioni fondamentali:
Public Sub Main() Print "\n'i' + [Invio] per ottenere informazioni" End ' Questo è un gestore di eventi: lo "stdin" è rediretto qui Public Sub Application_Read() Dim s As String Dim ss As String[] Line Input #File.In, s If s = "i" Then Print "Come si usa:\n- 'i'+[Invio] per queste informazioni;" Print "- intero*intero per moltiplicare i due interi;" Print "- intero+intero per l'addizione;" Print "- intero/intero per la divisione;" Print "- intero-intero per la sottrazione;" Print "- 'chiudi' per chiudere." Else If InStr(s, "*") Then ss = Split(s, "*") Print CLong(Val(ss[0]) * Val(ss[1])) Endif If InStr(s, "+") Then ss = Split(s, "+") Print CLong(Val(ss[0]) + Val(ss[1])) Endif If InStr(s, "/") Then ss = Split(s, "/") Print CLong(Val(ss[0]) \ Val(ss[1])) Endif If InStr(s, "-") Then ss = Split(s, "-") Print CLong(Val(ss[0]) - Val(ss[1])) Endif If s = "chiudi" Then Print "\e[1;31mChiusura fra \e[1;33m2\e[1;31m secondi !" Sleep 2 Quit Endif Endif End