Automi e Macchina di Turing
Esempio 2: Lo stesso semaforo dell’esercizio precedente, ma presentato attraverso una applicazione grafica. Utilizzando le finestre e i bottoni è qui possibile modificare l’esempio precedente inserendo un bottone che fa transitare istantaneamente lo stato, senza aspettare lo scadere dell’intervallo di tempo; questo bottone simula quello che i vigili urbani utilizzano per gestire manualmente un incrocio semaforico.
Ora la transizione avviene sia attraverso lo scadere dell’intervallo di tempo che tramite l’uso del pulsante, di fatti si estende l’insieme degli ingressi ammessi per l’automa considerato.
Il codice sarà quindi il seguente.
unit USemaforo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls;
type
TfrmSemaforo = class(TForm)
fraSemaforo: TGroupBox;
shpLampada1: TShape;
shpLampada2: TShape;
shpLampada3: TShape;
bntSaltoManuale: TBitBtn;
Timer1: TTimer;
btnFine: TBitBtn;
txtSecondi: TEdit;
spnSecondi: TUpDown;
Label1: TLabel;
procedure FormShow(Sender: TObject);
procedure btnFineClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure txtSecondiChange(Sender: TObject);
procedure bntSaltoManualeClick(Sender: TObject);
private
{1 = rosso, 2 = arancione, 3 = Verde}
m_iStato: integer; // Stato attuale.
procedure ColorazioneLampade(bRosso, bArancione, bVerde: boolean);
procedure TransizioneItalia;
procedure SemaforoRosso;
procedure SemaforoArancione;
procedure SemaforoVerde;
{ Private declarations }
public
{ Public declarations }
end;
var
frmSemaforo: TfrmSemaforo;
implementation
{$R *.dfm}
// Colora le lampade in modo opportuno.
procedure TfrmSemaforo.ColorazioneLampade(bRosso, bArancione, bVerde: boolean);
begin
// Lampada per il Rosso
if (bRosso)
then shpLampada1.brush.color := clRed
else shpLampada1.brush.color := clSilver;
// Lampada per l'arancione
if (bArancione)
then shpLampada2.brush.color := clYellow
else shpLampada2.brush.color := clSilver;
// Lampada per il Verde
if (bVerde)
then shpLampada3.brush.color := clGreen
else shpLampada3.brush.color := clSilver;
end;
// Semaforo rosso, di default.
procedure TfrmSemaforo.SemaforoRosso();
begin
ColorazioneLampade(True, False, False);
m_iStato := 1;
end;
// Semaforo arancione.
procedure TfrmSemaforo.SemaforoArancione();
begin
ColorazioneLampade(False, True, False);
m_iStato := 2;
end;
// Semaforo verde.
procedure TfrmSemaforo.SemaforoVerde();
begin
ColorazioneLampade(False, False, True);
m_iStato := 3;
end;
procedure TfrmSemaforo.FormShow(Sender: TObject);
begin
// All'inizio stabilisco sempre che sia rosso.
SemaforoRosso();
end;
procedure TfrmSemaforo.btnFineClick(Sender: TObject);
begin
Close();
end;
// Gestisce la transizione di stato nel caso di semaforo italiano.
procedure TfrmSemaforo.TransizioneItalia();
begin
case m_iStato of
1: SemaforoVerde();
2: SemaforoRosso();
3: SemaforoArancione();
end;
end;
// Quando scatta il timer.
procedure TfrmSemaforo.Timer1Timer(Sender: TObject);
begin
TransizioneItalia();
end;
procedure TfrmSemaforo.txtSecondiChange(Sender: TObject);
begin
Timer1.Interval := strtoint(trim(txtSecondi.text)) * 1000;
end;
procedure TfrmSemaforo.bntSaltoManualeClick(Sender: TObject);
begin
Timer1.Enabled := False;
// Attivo manualmente la transizione.
TransizioneItalia();
// Faccio ripartire il timer.
Timer1.Enabled := True;
end;
end.
All’inizio, alla visualizzazione della finestra il semaforo sarà rosso. Viene creata una procedura per la colorazione e le procedure che identificano lo stato con la richiesta della colorazione opportuna.
In questo caso, per scandire il tempo viene utilizzato un oggetto Timer proprio delle librerie di Delphi, che ha le proprietà di essere attivo fin dall’inizio e lancia un evento, la procedure Timer1Timer, allo scadere di 1000 millisecondi (1 secondo) di default.
Per allungare l’intervallo di tempo è stato inserito un edit box (text box) per indicare il numero di secondi del nuovo intervallo, variazione gestita dalla procedure txtSecondiChange.
La procedura bntSaltoManualeClick gestisce il passaggio manuale immediate allo stato successivo.
Per ricordare lo stato attuale è stata inserita una variabile globale m_iStato il cui valore numerico indica lo stato e il colore del semaforo.
Come risultato apparirà la seguente finestra.
Implementazione Delphi
Copyright © 2006 by
Emanuele Scapin
All Rights reserved
Designed by GOEMO.de