Fórum Sair de um laço while #261224
09/12/2004
0
Saudações a todos da lista...
Estou precisando saber como fazer para, ao clicar em um botão, forçar a saída de um laço while que varre determinada tabela do banco.
O problema que estou encontrando é que eu gostaria de deixar a opção para que o usuário pare um determinando processo de atualização, mas, ao entrar no laço que varre a tabela, não consigo fazer nada no formulário (arrastar, clicar em um botão, etc.).
Sei que existe o recurso de threads, mas não sei como utilizá-lo.
Alguém poderia me ajudar?
Agradeço desde já a todos!!!
Estou precisando saber como fazer para, ao clicar em um botão, forçar a saída de um laço while que varre determinada tabela do banco.
O problema que estou encontrando é que eu gostaria de deixar a opção para que o usuário pare um determinando processo de atualização, mas, ao entrar no laço que varre a tabela, não consigo fazer nada no formulário (arrastar, clicar em um botão, etc.).
Sei que existe o recurso de threads, mas não sei como utilizá-lo.
Alguém poderia me ajudar?
Agradeço desde já a todos!!!
Nunes_fns
Curtir tópico
+ 0
Responder
Posts
09/12/2004
Emerson Nascimento
você não precisa de um thread para isso.
basta você colocar um Application.ProcessMessages a cada iteração do laço. você vai precisar criar uma variável publica/privada para controlar o clique do botão. algo assim:
type
    Form1 = class(TForm)
        {...}
    private
        lCancelar: boolean; // variável para controlar o cancelamento
        {...}
    public
        {...}
procedure TForm1.BotaoConfirmarClick(Sender: TObject);
begin
    lCancelar := False; // antes do laço, inicializo a variável como False
    while [sua condicao] do
    begin
        if lCancelar and (MessageDlg(´Deseja realmente cancelar o processo?´,mtConfirmation,[mbYes,mbNo],0)=mrYes) then
            break
        else
            lCancelar := False;
        [seus comandos]
        Application.ProcessMessages; // esse é o truque
    end;
    if lCancelar then
        ShowMessage(´Processo incompleto. Foi cancelado pelo usuário´)
    else
        ShowMessage(´Processo finalizado´);
end;
// procedimento do botão cancelar
procedure TForm1.BotaoCancelarClick(Sender: TObject);
begin
    lCancelar := True;
end;
end;
basta você colocar um Application.ProcessMessages a cada iteração do laço. você vai precisar criar uma variável publica/privada para controlar o clique do botão. algo assim:
type
    Form1 = class(TForm)
        {...}
    private
        lCancelar: boolean; // variável para controlar o cancelamento
        {...}
    public
        {...}
procedure TForm1.BotaoConfirmarClick(Sender: TObject);
begin
    lCancelar := False; // antes do laço, inicializo a variável como False
    while [sua condicao] do
    begin
        if lCancelar and (MessageDlg(´Deseja realmente cancelar o processo?´,mtConfirmation,[mbYes,mbNo],0)=mrYes) then
            break
        else
            lCancelar := False;
        [seus comandos]
        Application.ProcessMessages; // esse é o truque
    end;
    if lCancelar then
        ShowMessage(´Processo incompleto. Foi cancelado pelo usuário´)
    else
        ShowMessage(´Processo finalizado´);
end;
// procedimento do botão cancelar
procedure TForm1.BotaoCancelarClick(Sender: TObject);
begin
    lCancelar := True;
end;
end;
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)