Passare dati in runtime ad un programma 'a linea di comando'

Da Gambas-it.org - Wikipedia.

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