Newsgroup: it.comp.lang.delphi
Titolo: Form con ELABORAZIONE e tasto di STOP

Grazie a chi potrŕ aiutarmi. Ciň che devo realizzare č  piů complesso ma puň
andarmi bene la
soluzione al seguente problema:
Voglio ottenere una form (o altro) in cui avvenga un'elaborazione (che
possiamo ridurre
alla visualizzazione di un contatore che si incrementa con un ciclo for) e
contemporaneamente
deve essere disponibile un pulsante (o altro) che possa arrestare questa
elaborazione:
Tanto per interdeci il pulsante di STOP di SCANDISK.
Qualcuno ha qualche idea o sa dirmi dove posso trovare la soluzione ?
Grazie.
ilp...@tin.it

Qualcuno ha qualche idea o sa dirmi dove posso trovare la soluzione ?
Dichiari una variabile StopFlag di tipo booleano come private nel
form.
Nel bottone che implementa il ciclo (scritto come while, per
comodita') corrispondera' il reset a FALSE della variabile.
Al bottone che interrompe corrisponde il set a TRUE della variabile.
Il ciclo sara' del tipo :
while ( ( contatore < limite_max ) and ( not StopFlag ) ) do
begin
  ...
  inc( contatore ) ;
end ;

"Alessandro Pelissero":
| Voglio ottenere una form (o altro) in cui avvenga un'elaborazione (che
| possiamo ridurre
| alla visualizzazione di un contatore che si incrementa con un ciclo for) e
| contemporaneamente
| deve essere disponibile un pulsante (o altro) che possa arrestare questa
| elaborazione:
in alternativa puoi usare un TThread,
non cambia molto dalla soluzione di Andrea,
butti il codice nel Thread.Execute:
while ( ( contatore < limite_max ) and ( not Terminated ) ) do
begin
  ...
  inc( contatore ) ;
end ;
e per bloccarlo fai Thread.Terminate;
...l'unica cosa è che in più puoi assegnare una priorità
al processo e che la tua applicazione eventualmente
può fare altre cose.
ps: buttaci anche un Application.ProcessMessage all'interno
del ciclo altrimenti non sarà possibile cliccare sul pulsante
per stoppare il tutto.
Ciao!
Alan Solo

elaborazione:
Quello che devi fare è servire la coda dei messaggi della tua applicazione,
mediante Application.processmessages.
Ciao!
--
- Carlo -

per stoppare il tutto.
Gia'...
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, 
  Forms, Dialogs,  StdCtrls ;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    StopFlag : boolean ;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var contatore : integer ;
begin
  StopFlag := false ;
  contatore := 0 ;
  while ( not StopFlag ) and ( contatore < 9999 ) do
  begin
    inc( contatore ) ;
    Memo1.Lines.Add( IntToStr( contatore ) ) ;
    Application.ProcessMessages ;
  end ;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  StopFlag := true ;
end;
end.

Andrea Laforgia
| >ps: buttaci anche un Application.ProcessMessage all'interno
| >del ciclo altrimenti non sarà possibile cliccare sul pulsante
| >per stoppare il tutto.
|
| Gia'...
[cut]
[cut]
[cut]
8-)
... hey calmati, era solo un'osservazione!! :-)))
ps: cmq, non vorrei dire cacchiate ma se
si usa un thread penso non serva neanche il
processmessages, contrariamente
a quanto io stesso ho detto...(boh, non l'ho provato)
ciao ciao
Alan Solo

a quanto io stesso ho detto...(boh, non l'ho provato)
Dipende da che tipo di thread.
Se e' un thread a cui e' associata una coda di messaggi, DEVE
necessariamente avere la forzatura dell'estrazione dei messaggi, per
consentire agli altri thread di parlargli.