Differenze tra le versioni di "Raccogliere quanto mostrato nella finestra di un Terminale"

Da Gambas-it.org - Wikipedia.
Riga 7: Riga 7:
 
La domanda è: una volta che il comando ''ls'' ha esercitato la sua funzione, ed il risultato è mostrato nel terminale, come raccogliere con codice Gambas <SPAN style="text-decoration:underline">ogni</span> riga appunto visibile nel Terminale ?
 
La domanda è: una volta che il comando ''ls'' ha esercitato la sua funzione, ed il risultato è mostrato nel terminale, come raccogliere con codice Gambas <SPAN style="text-decoration:underline">ogni</span> riga appunto visibile nel Terminale ?
  
Allo stato attuale delle conoscenze di chi scrive, bisognerà trovare un compromesso fra comandi ''Bash'' e funzioni Gambas.
 
  
 +
=Uso delle risorse del Componente ''gb.ncurses''=
 +
Una modalità molto efficace è quella che prevede l'uso delle risorse fornite dal Componente "''gb.ncurses''" di Gambas. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
 +
 +
Mostriamo un semplice esempio pratico:
 +
Private wn As Window
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  wn = New Window(True, 0, 0, 300, 20) As "WinCurses"
 +
 
 +
<FONT Color=gray>' ''Non mostra il tasto premuto della tastiera:''</font>
 +
  Screen.Echo = False
 +
 
 +
  With wn
 +
    .Border = Border.ACS
 +
    .Background = Color.Green
 +
    .Caption = "Console ncurses"
 +
    .SetFocus()
 +
  End With
 +
 
 +
'''End'''
 +
 +
 +
'''Public''' Sub WinCurses_Read()
 +
 
 +
  Dim tasto As Integer
 +
  Dim s As String
 +
 
 +
<FONT Color=gray>' ''Intercetta il tasto premuto della tastiera:''</font>
 +
  tasto = Window.Read()
 +
 
 +
  With wn
 +
<FONT Color=gray>' ''Scrive il testo sulla console:''</font>
 +
    If tasto = Key["s"] Then .Print("Testo sulla console.", 0, 1)
 +
<FONT Color=gray>' ''Cattura il testo presente sulla console...''</font>
 +
    If tasto = Key["c"] Then
 +
      s = .Get(0, 1)
 +
<FONT Color=gray>' ''...e lo riscrive poco più in basso:''</font>
 +
      .Print(s, 0, 10)
 +
    Endif
 +
    .Raise()
 +
  End With
 +
 
 +
'''End'''
 +
 +
 +
=Uso di comandi ''bash'' e di risorse Gambas=
 +
Un'altra modalità prevede una sorta di compromesso fra comandi ''Bash'' e funzioni Gambas.
  
 
==Uso del comando "''Script''"==
 
==Uso del comando "''Script''"==
Riga 96: Riga 144:
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
 +
 +
 +
 +
=Note=
 +
[1] Vedere la guida ufficiale di Gambas:
 +
* http://gambaswiki.org/wiki/comp/gb.ncurses
 +
* http://gambaswiki.org/wiki/tutorial/ncursestut

Versione delle 08:22, 12 mag 2017

La questione è abbastanza complessa. Si tratta di capire come poter raccogliere (leggere) quanto viene mostrato all'interno di una finestra di un Terminale.

E' il caso di precisare che è non si intende capire come intercettare, ma come raccogliere tutto ciò che è leggibile, e quindi ciò che è stato già scritto ed ottenuto, nel Terminale.

Facciamo un esempio pratico: si apra un Terminale, e si lanci per esempio il comando: ls.

La domanda è: una volta che il comando ls ha esercitato la sua funzione, ed il risultato è mostrato nel terminale, come raccogliere con codice Gambas ogni riga appunto visibile nel Terminale ?


Uso delle risorse del Componente gb.ncurses

Una modalità molto efficace è quella che prevede l'uso delle risorse fornite dal Componente "gb.ncurses" di Gambas. [Nota 1]

Mostriamo un semplice esempio pratico:

Private wn As Window


Public Sub Main()
 
 wn = New Window(True, 0, 0, 300, 20) As "WinCurses"
 
' Non mostra il tasto premuto della tastiera:
 Screen.Echo = False
 
 With wn
   .Border = Border.ACS
   .Background = Color.Green
   .Caption = "Console ncurses"
   .SetFocus()
 End With
  
End


Public Sub WinCurses_Read()
 
 Dim tasto As Integer
 Dim s As String
 
' Intercetta il tasto premuto della tastiera:
  tasto = Window.Read()
 
  With wn
' Scrive il testo sulla console:
    If tasto = Key["s"] Then .Print("Testo sulla console.", 0, 1)
' Cattura il testo presente sulla console...
    If tasto = Key["c"] Then 
      s = .Get(0, 1)
' ...e lo riscrive poco più in basso:
      .Print(s, 0, 10)
    Endif
   .Raise() 
 End With
  
End 


Uso di comandi bash e di risorse Gambas

Un'altra modalità prevede una sorta di compromesso fra comandi Bash e funzioni Gambas.

Uso del comando "Script"

Faremo in modo da aprire una finestra di Terminale e lanciarvi all'interno il comando Script:

Public Sub Form_Open()

  Shell "gnome-terminal -e script"

End

Nel medesimo percorso ove è posizionato l'eseguibile Gambas, sarà creato un file, chiamato: "typescript". Si comincerà a scrivere e ad usare normalmente il terminale. Conclusa la scrittura, si dovrà lanciare in Terminale il comando Exit. Questa fase finale chiuderà il Terminale, e procederà a copiare all'interno del file "typescript" quanto scritto e ritornato nel predetto Terminale, aggiungendovi dei codici speciali, leggibili ed interpretabili solo da un Terminale. Quindi, tornando in Gambas, si potrà leggere agevolmente in un nuovo Terminale, quanto presente nel file "typescript":

Public Sub Button1_Click()

 Dim bb As Byte[]
 Dim ss As String[]
 Dim s As String
 Dim i As Integer
  
' Individua il file speciale "/dev/pts/n" che sarà creato con riferimento all'apertura del nuovo Terminale:
  ss = Dir("/dev/pts", "*", gb.Device) 
  
  bb = New Byte[ss.Count]
  
  For Each s In ss
    If IsNumber(s) Then bb[Val(s)] = CByte(Val(s))
  Next
  
  i = bb.Find(0, 1)
 

' Apre un nuovo Terminale per la lettura del contenuto del file "typescript":
  Desktop.OpenTerminal

' Attende la creazione del file speciale "/dev/pts/1":
  Do
    Wait 0.01
  Loop Until Exist("/dev/pts" &/ CStr(i))
 
 ' Legge dal file "typescript", ed indirizze il contenuto al nuovo Terminale appena aperto:
    Shell "cat typescript > /dev/pts" &/ CStr(i)

End


Uso del comando "xterm -l"

Per usare questa modalità, bisognerà aver installato nel proprio sistema il Terminale "xterm".

Si dovrà lanciare il comando xterm -l:

Public Sub Button1_Click()

   Shell "xterm -l"

End

si aprirà quindi il Terminale "xterm". Nel medesimo percorso ove è posizionato l'eseguibile Gambas, verrà creato un file, il cui nome inizia con: Xterm.log. . Si potrà quindi scrivere ed utilizzare regolarmente il Terminale "xterm".

Successivamente, per rivedere quanto scritto ed ottenuto nel terminale, si chiuderà il Terminale "xterm" e si leggerà il contenuto del predetto file in un nuovo Terminale:

Public Sub Button2_Click()

 Dim bb As Byte[]
 Dim ss As String[]
 Dim s As String
 Dim i As Integer
  
' Individua il file speciale "/dev/pts/n" che sarà creato con riferimento all'apertura del nuovo Terminale:
  ss = Dir("/dev/pts", "*", gb.Device) 
  
  bb = New Byte[ss.Count]
  
  For Each s In ss
    If IsNumber(s) Then bb[Val(s)] = CByte(Val(s))
  Next
  
  i = bb.Find(0, 1)
 

' Apre un nuovo Terminale per la lettura del contenuto del file "Xterm.log.":
  Desktop.OpenTerminal

' Attende la creazione del file speciale "/dev/pts/n":
  Do
    Wait 0.01
  Loop Until Exist("/dev/pts" &/ CStr(i))
 
 ' Legge dal file "typescript", ed indirizza il contenuto al nuovo Terminale appena aperto:
  Shell "cat Xterm.log.* > /dev/pts" &/ CStr(i)

End



Note

[1] Vedere la guida ufficiale di Gambas: