Introduzione alla programmazione

Uno sguardo a Turbo Pascal e Lazarus
LEZIONE 7

Lezione 7

Ciclare una o più istruzioni

In questa sezione conosciamo i cicli, sì, ne hai sicuramente uno anche tu, ma il tuo è a pedali 😀
Qui parliamo di cicli quando vogliamo che un certo blocco di istruzioni venga ripetuto per un certo numero di volte.
I cicli sono molto convenienti e indispensabili in molte occasioni, per esempio per far leggere al programma un elenco di voci, o per muovere un oggetto dentro al nostro form.

Il numero delle ripetizioni può essere indicato dal programmatore, o essere "preso" da un contatore.
Infatti il numero di volte che un blocco di istruzioni debba essere ripetuto, per fare una certa operazione, può essere noto o "nascosto", ma in ogni caso può essere scoperto, vediamo come.

Ipotizziamo di voler far spostare un oggetto da un lato all’altro della nostra finestra, cosa ci serve? Dobbiamo almeno conoscere la larghezza della finestra, e la larghezza del nostro oggetto, giusto?
Bene, io creo una finestra larga 500 punti e ora so quanto è larga, vero?
No, l’utente potrebbe averla ridimensionata! Pazienza, posso sempre sapere quanto è grande semplicemente ponendo una domanda.

Le proprietà di un oggetto possono essere impostate durante la progettazione del form, e durante l'esecuzione del programma, ricordi? Allo stesso modo però, le proprietà possono essere lette: " form1.width;" ci restituirà il valore numerico relativo alla larghezza della finestra che si chiama form1, Lo faccio accedendo alla sua proprietà Width (larghezza).
Allo stesso modo, avendo un elenco di voci il cui numero è ignoto, questo può essere scoperto con la proprietà count dell'oggetto, per esempio: listbox.count mi dice esattamente quante voci contenga l'oggetto listbox.

Ciclo For Do


Il ciclo For DO è un ciclo che usa un contatore per eseguire un certo numero di operazioni, ogni volta che il blocco di istruzioni viene eseguito, il contatore si incrementa di 1 fino ad arrivare al valore massimo impostato, una volta arrivati qui il ciclo termina.
Il contatore può essere incrementale o decrementale, a stabilirlo sarà la parola chiave to (incrementale) o downto (decrementale)

Bene allora, ecco come spostare un oggetto con un ciclo, usando il ciclo For Do:


  procedure TForm1.Button1Click(Sender: TObject);
    var
      I:Integer;
  begin
    for I:=0 to Form1.Width -Label1.Width do
      begin
        Label1.Left:=I;
        Application.ProcessMessages;
      end;
  end;

N.B.
Per far funzionare questo codice dovrai mettere sul tuo form una Tlabel e un TButton (ma ormai dovrebbe essere scontato)


Cliccando sul pulsante vedrai la label (etichetta) correre da sinistra a destra piuttosto velocemente, ma questa velocità varierà in funzione della potenza di calcolo del computer su cui stai eseguendo il codice, per essere sicuro che il ciclo abbia più o meno la stessa velocità su qualsiasi PC dovrai mettere un regolatore di velocità.
Si potrebbe usare Sleep().


  procedure TForm1.Button1Click(Sender: TObject);
    var
      I:Integer;
  begin
    for I:=0 to Form1.Width - Label1.Width do
      begin
        Label1.Left:=I;
        Application.ProcessMessages;
        Sleep(1);
      end;
  end;

N.B.
Adesso l’oggetto ha rallentato perché tra una ripetizione e la successiva si ferma ad aspettare un millesimo di secondo, ma siamo abbastanza certi che la velocità sarà più o meno simile su tutti i PC (a parte quelli vecchi o decisamente poco prestanti).


Come vedi con il For abbiamo chiesto al programma di ripetere un certo numero di volte la riassegnazione della proprietà Left della Label (Left rappresenta la distanza della label dal lato sinistro della finestra in cui è contenuta)

Con For I:=0 diciamo che il ciclo inizia con la I avente valore zero, ogni volta che il ciclo ricomincia, I viene incrementato di 1 e il ciclo si ripete fino a to Form1.Width – Label1.Width, quindi nel momento in cui la Label tocca il lato destro della sua finestra, il ciclo raggiunge il suo compimento e si ferma, lasciando che il programma faccia altre cose o attenda l’intervento dell’utente.

Si potrebbe anche far correre la label da destra verso sinistra usando downto al posto di to, questo farà fare il ciclo scalando di uno il valore di I dopo ogni ripetizione, fino ad arrivare a zero.

Ecco come:


  procedure TForm1.Button1Click(Sender: TObject);
    var
      I:Integer;
  begin
    for I:=Form1.Width - Label1.Width downto 0 do
      begin
        Label1.Left:=I;
        Application.ProcessMessages;
        Sleep(1);
      end;
  end;

N.B.
Adesso abbiamo impostato il valore iniziale del ciclo sul lato destro e togliendo 1 al valore di I ad ogni ripetizione, la label si avvicina al lato sinistro, quando I arriva a zero la label si ferma sul bordo sinistro della finestra e il ciclo termina.



Ciclo While Do

Il ciclo While funziona in modo simile ma non ha un contatore che incrementa o decrementa e che determina la fine del ciclo, nel ciclo While (mentre), si interrompe quando la condizione che passiamo al ciclo come parametro di confronto diventa vera.

Esempio:


  procedure TForm1.Button1Click(Sender: TObject);
  begin
   Label1.Left:=26; //posizione di partenza della label
   While Label1.Left < form1.Width - Label1.Width do
     begin
       Label1.Left:=label1.Left + 1;
       application.ProcessMessages;
       sleep(1);
     end;
  end;

N.B.
In questo caso il While farà ripetere tutte le istruzioni del blocco fino a quando la posizione (left) della label non sarà inferiore alla larghezza del form meno la larghezza della label, cioè fino a quando la label non toccherà il lato destro della finestra.


La label si sposta perché abbiamo detto che la sua proprietà Left deve essere uguale a .Left + 1, quindi ogni volta si sposterà di un punto verso destra.


Ciclo Repeat Until

Un altro modo per creare un ciclo è quello di usare Repeat Until, vedi nell’esempio come funziona:


  procedure TForm1.Button1Click(Sender: TObject);
  begin
    Label1.Left:=26;
    Repeat
      Label1.Left:=label1.Left + 1;
      application.ProcessMessages;
      sleep(1);
    Until Label1.Left >= form1.Width - label1.Width;
  end;


Come vedi, adesso la condizione viene verificata in modo contrario al ciclo while.
Nel While Do si chiedeva: "continua fin tanto che la condizione è vera", nel Repeat Until si chiede invece: "fermati appena la condizione è vera!"
Infatti, non appena il Left diventa più grande del dovuto, il ciclo si interrompe e la label è esattamente dove la abbiamo messa con gli altri cicli.

Divertiti ad inventare dei cicli usando quello hai appena imparato.


‹ Precedente Successiva ›

Sommario

Sommario