循环中有延时,导致在循化执行中不能关闭,如何可以关闭?
程序循化取出数据库的URL,然后在webbrowser打开,每次打开间隔10s。
procedure Delay(dwMilliseconds: Longint);
var
  iStart, iStop: DWORD;
begin
  iStart := GetTickCount;
  repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
  until (iStop - iStart) >= dwMilliseconds;
end;procedure TForm1.Button1Click(Sender: TObject);
begin  Form1.ADOQuery1.Close;
  Form1.ADOQuery1.SQL.Clear;
  Form1.ADOQuery1.SQL.Add('select * from keywords');
  Form1.ADOQuery1.Active:=True;
  Form1.ADOQuery1.ExecSQL;
  ADOQuery1.first;  b:=true;
  while(b) do
   begin
     while not adoquery1.eof do
     begin
     if not b then break;     WebBrowser1.Navigate(ADOQuery1.FieldByName('KeyURL').value);
     Delay(10000);
     repeat
        Application.ProcessMessages;
      until (not webbrowser1.Busy);      adoquery1.next;     end;
     end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
b:=false;
end;

解决方案 »

  1.   

    我建议楼主用 TTimer 定时
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Timer1: TTimer;
        ADOQuery1: TADOQuery;
        WebBrowser1: TWebBrowser;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        FList: TStrings;
        FIndex: Integer;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      FList := TStringList.Create;
      Timer1.Enabled := False;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      FList.Free;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      FList.Clear;
      FIndex := 0;
      with ADOQuery1 do begin
        SQL.Text := 'select * from keywords';
        ExecSQL;
        while not Eof do begin
          FList.Add(FieldByName('KeyURL').value);
          Next;
        end;
      end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if FIndex < FList.Count then begin
        WebBrowser1.Navigate(FList.Strings(FIndex);
        Inc(FIndex);
      end else
        Timer1.Enabled := False;
    end;end.
      

  2.   

    修改了一下procedure TForm1.Button1Click(Sender: TObject);
    begin
      FList.Clear;
      FIndex := 0;
      with ADOQuery1 do begin
        SQL.Text := 'select * from keywords';
        Open;
        while not Eof do begin
          FList.Add(FieldByName('KeyURL').value);
          Next;
        end;
        Close;
      end;
      Timer1.Enabled := True;
    end;
      

  3.   

    真大意,要要修改一个地方
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if FIndex < FList.Count then begin
        WebBrowser1.Navigate(FList.Strings[FIndex]);
        Inc(FIndex);
      end else
        Timer1.Enabled := False;
    end;
      

  4.   

    看楼主的回复就知道是超级新手。TTimer 用消息驱动,不比你用  repeat ...... until  循环好吗?
    你不用任务管理器看看 Delay 函数延时的时候,你的程序占用的 CPU 有多高!