Differenze tra le versioni di "Intercettare dati inviati al programma Gambas da altri programmi utilizzati"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
Nei casi in cui l'applicativo Gambas riceve dati nella propria console da programmi che nel suo codice sono stati lanciati con ''Exec'' o ''Shell''. Tali dati potranno essere intercettati anche se l'applicativo Gambas è avviato a livello di IDE come semplice progetto.
+
Nei casi in cui l'applicativo Gambas riceve dati nella propria console da programmi che nel suo codice <SPAN Style="text-decoration:underline">sono stati lanciati con ''Exec'' o ''Shell''</span>, tali dati potranno essere intercettati anche se l'applicativo Gambas è avviato a livello di IDE come semplice progetto.
  
 
Da sottolineare che in questo caso il processo deve essere lanciato in lettura usando, però, le parole ''For '''Input''''' (e NON ''For Read'' !).
 
Da sottolineare che in questo caso il processo deve essere lanciato in lettura usando, però, le parole ''For '''Input''''' (e NON ''For Read'' !).
 
  
 
Nell'esempio che segue, i dati intercettati nella console, proveniente da un programma esterno lanciato con ''Exec'' e di cui viene gestito il processo mediante una variabile di tipo ''Process'', vengono poi trasferiti ''direttamente'' in una ''TextArea'' posta sul ''Form'' dell'applicativo Gambas:
 
Nell'esempio che segue, i dati intercettati nella console, proveniente da un programma esterno lanciato con ''Exec'' e di cui viene gestito il processo mediante una variabile di tipo ''Process'', vengono poi trasferiti ''direttamente'' in una ''TextArea'' posta sul ''Form'' dell'applicativo Gambas:

Versione delle 22:27, 14 dic 2021

Nei casi in cui l'applicativo Gambas riceve dati nella propria console da programmi che nel suo codice sono stati lanciati con Exec o Shell, tali dati potranno essere intercettati anche se l'applicativo Gambas è avviato a livello di IDE come semplice progetto.

Da sottolineare che in questo caso il processo deve essere lanciato in lettura usando, però, le parole For Input (e NON For Read !).

Nell'esempio che segue, i dati intercettati nella console, proveniente da un programma esterno lanciato con Exec e di cui viene gestito il processo mediante una variabile di tipo Process, vengono poi trasferiti direttamente in una TextArea posta sul Form dell'applicativo Gambas:

Private pr As Process


Public Sub Form_Open()

 pr = Shell "/percorso/del/programma/di/cui/si/riceveranno/i/dati/in/console"] For Input As "prova"

End

Public Sub prova_Read()

 TextArea1.Text &= pr.ReadLine() & "\n"

End

Esempi pratici

Un esempio pratico del precedente codice può essere il seguente.
Creiamo un semplicissimo applicativo in linguaggio C che scriva ogni secondo nello standard output un valore decimale intero crescente:

#include <stdio.h>


int a;

void main() {

  while (1) {

     printf("%d\n", a);
     sleep(1);
     a++;

  };

}

Creiamo, poi, un applicativo Gambas che provvede a lanciare dall'IDE quel codice C gestendone contemporaneamente il processo mediante una variabile di tipo Process.
Ebbene, vedremo che nella console dell'IDE di Gambas verranno scritti i valori sempre crescenti, scritti dall'applicativo in C nello standard output. L'intento, però, è quello di intercettare in tempo reale tali dati e trasferirli, mostrandoli, in una TextArea posta sul Form del progetto Gambas:

Private pr As Process


Public Sub Form_Open()

 pr = Shell "/percorso/dell'applicativo/in/C" For Input As "prova"

End

Public Sub prova_Read()
  
 TextArea1.Text = pr.ReadLine()
 
End

Altro esempio

In quest'altro esempio sarà lanciato un programma in C, al quale si passerà un valore di tipo Stringa. Il programma, quindi, convertirà in un numerico Intero questo valore ricevuto e, dopo averlo sommato al valore 100, lo scriverà nello standard output. Il programma Gambas intercetterà il dato dallo standard output e lo mostrerà, come nel caso precedente, in una TextArea.

Il codice del programma in C sarà il seguente:

#include <stdio.h>
#include <stdlib.h>


void main(int argc, char *argv[]) {


  int a, b;

// Converte la Stringa in un numero "Intero":
  a = atoi(argv[ 1 ]);

  b = a + 100;

  printf("%d", b);

}

Il programma Gambas sarà, invece, il seguente:

Private pr As Process
Private i As Integer


Public Sub Button1_Click()

 Dim s As String

 s = CStr(i)

 pr = Shell "/percorso/del/programma/in/C " & s For Input As "prova"

 Inc i

End

Public Sub prova_Read()
 
 TextArea1.Text = pr.ReadLine()

 pr.Close
 
End

o più semplicemente:

Private i As Integer


Public Sub Button1_Click()

 Dim s As String

  Shell "/percorso/del/programma/in/C " & CStr(i) To s

  TextArea1.Text = s

  Inc i

End

Ogni qual volta si clicca sul tasto, si vedrà nella TextArea il valore numerico incrementato di un'unità.