Newsgroup: it.comp.lang.delphi
Titolo: Interrompere un'operazione

Ciao a tutti.
Sapete come fare per interrompere un'operazione durante la sua esecuzione?
Mi spiego meglio:
in un button metto un'istruzione di questo tipo per forzarlo in un loop
senza fine
:
a := 0;
while a = 0 do;
Ovviamente ne consegue che un secondo button che eventualmente chiuda
l'applicazione non risponde all'evento OnClick.
Come intercettare un input esterno mentre è attiva una procedura di calcoli
abbastanza impegnativi?
Valter

callback?
AS

 abbastanza impegnativi?
unit Unit1;
interface
uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
Forms,
   Dialogs, StdCtrls;
type
   TForm1 = class(TForm)
     btnStart: TButton;
     Memo1: TMemo;
     btnStop: TButton;
     procedure btnStartClick(Sender: TObject);
     procedure btnStopClick(Sender: TObject);
   private
     FStopped: Boolean;
   public
     { Public declarations }
   end;
var
   Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnStartClick(Sender: TObject);
begin
   FStopped := False;
   while True // <-- tua condizione
         and (not FStopped) do
   begin
     Memo1.Lines.Add('sto correndo...');
     Application.ProcessMessages;
   end;
end;
procedure TForm1.btnStopClick(Sender: TObject);
begin
   FStopped := True;
end;
end.

 calcoli abbastanza impegnativi?
oltre a quello che ti hanno detto, anche un Thread:
unit uThread;
interface
uses
  Classes;
type
  TUpdateEvent = procedure (const i: Integer) of object;
  TThreadedCounter = class(TThread)
  private
    FOnUpdate: TUpdateEvent;
    FCount: Integer;
    procedure DoUpdate;
  protected
    procedure Execute; override;
  public
    procedure Reset;
    property OnUpdate: TUpdateEvent read FOnUpdate write FOnUpdate;
  end;
implementation
uses Windows;
const
  DELAY   = 100;   //ritardo in millisecondi
{ TMyCounter }
procedure TThreadedCounter.DoUpdate;
begin
  if Assigned(FOnUpdate) then
    FOnUpdate(FCount)
end;
procedure TThreadedCounter.Execute;
var
  c: Cardinal;
begin
  while not Terminated do
  begin
    c:= GetTickCount;
    if FCount >= High(Integer) then
      FCount:= 0;
    Sleep(DELAY);
    Inc(FCount, GetTickCount - c);
    Synchronize(DoUpdate);
  end;
end;
procedure TThreadedCounter.Reset;
begin
  FCount:= 0;
end;
end.
-- 
Mauro Falzari 
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

 l'applicazione non risponde all'evento OnClick.
E' pieno di post simili in rete, basta che cerchi in google groups, la
tecnica di base consiste nell'aggiungere ai controlli del ciclo una tua
variabile booleana in AND che cosi' facendo causa l'uscita immediata dal
ciclo.
Per processare ad ogni loop i bottoni premuti, i tasti, ecc, si usa
application.processmessages.
una cosa come hai scritto tu verrebbe cosi':
public continua := true;
a := 0;
while (a = 0) AND continua do begin
  ..
  ..  
  ..
  FunzioneControlloPerUscita;
  Application.processmessages;  
end;
E nella FunzioneControlloPerUscita puoi settare continua;
if (condizione di uscita) then continua:=false;
Lo stesso dicasi per i tasti premuti, nell' onkeypress della form fai il
controllo sul tasto premuto, se ESC ad esempio imposti continua a false;
ciao
-- 
Morde. 
ICLDweb: 
http://www2.samatel.com/icld/

Grazie per il vostro rapidissimo supporto.
Al lavoro!... :o)
Valter