Ajuda com While Que não Funciona

10/09/2018

2

Boa tarde!!! Alguém pode me ajudar!!!

Tenho um dbgrid aonde eu seleciono o números de telefone, quero que quando, eu clicar no botão abrir navegador, ele executa o shellexecute(abre o navegador faz o que está no timer, fecha o navegador e passa para o próximo número de telefone), só que no while ele executa só o último registro e se eu mudo o shellexecute para dentro do while, ele abre todos os contatos de uma vez, se eu tiver 10 contatos, ele abre os 10 ou seja abre 10 navegadores, eu não quero isso, quero que abre um por vez, só passar para o próximo assim que fechar o navegador,ai sim ele passa para o próximo.


procedure TForm1.Button1Click(Sender: TObject);
begin
    Clipboard.AsText := memoMensagem.Text;

    begin
    cdsGrid.Filter := ''''''''SELECIONA = '''''''' + QuotedStr(''''''''S''''''''); // filtra os registros selecionados
    cdsGrid.Filtered := True; // ativa o filtro
    cdsGrid.First; // posiciona o cursor no primeiro registro
        while not cdsGrid.Eof do

              begin

                         while not cdsGrid.Eof do
                          begin
                          cdsGrid.Edit;
                          edtNumero.Text := cdsGrid.FieldByName(''''''''TELEFONE'''''''').AsString;
                          timerBtnAbrirNavegador.Interval := 20500;
                          timerBtnAbrirNavegador.Enabled := True;
                          timerBtnFecharNavegador.Interval := 30000;
                          timerBtnFecharNavegador.Enabled := True;
                          cdsGrid.Next;
                          end;
                      ShellExecute(Handle,''''''''Open'''''''',''''''''firefox.exe'''''''',PChar(edtUrl.Text + edtNumero.Text),''''''''C:\\\\\\\\\\\\\\\\Arquivos de programas\\\\\\\\\\\\\\\\Mozilla Firefox'''''''', SW_SHOWNORMAL);
                      cdsGrid.Next;
              end;



  end;
end;
Responder

Post mais votado

10/09/2018

há while demais no seu código. o while mais interno está varrendo todos os registros, posicionando no último, e só depois o shellexecute é chamado.

tente assim:
procedure TForm1.Button1Click(Sender: TObject);
begin
    Clipboard.AsText := memoMensagem.Text;
 
    cdsGrid.Filter := 'SELECIONA = ' + QuotedStr('S'); // filtra os registros selecionados
    cdsGrid.Filtered := True; // ativa o filtro
    cdsGrid.First; // posiciona o cursor no primeiro registro

    while not cdsGrid.Eof do
    begin
        edtNumero.Text := cdsGrid.FieldByName('TELEFONE').AsString;
        timerBtnAbrirNavegador.Interval := 20500;
        timerBtnAbrirNavegador.Enabled := True;
        timerBtnFecharNavegador.Interval := 30000;
        timerBtnFecharNavegador.Enabled := True;

        ShellExecute(Handle,'Open','firefox.exe',PChar(edtUrl.Text + edtNumero.Text),'C:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Arquivos de programas\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Mozilla Firefox', SW_SHOWNORMAL);
        cdsGrid.Next;
    end;
end;
Responder

Mais Posts

Aliás, você também pode habilitar os 'timer' fora do while:
procedure TForm1.Button1Click(Sender: TObject);
begin
    Clipboard.AsText := memoMensagem.Text;
  
    cdsGrid.Filter := 'SELECIONA = ' + QuotedStr('S'); // filtra os registros selecionados
    cdsGrid.Filtered := True; // ativa o filtro
    cdsGrid.First; // posiciona o cursor no primeiro registro
 
    timerBtnAbrirNavegador.Interval := 20500;
    timerBtnAbrirNavegador.Enabled := True;
    timerBtnFecharNavegador.Interval := 30000;
    timerBtnFecharNavegador.Enabled := True;

    while not cdsGrid.Eof do
    begin
        edtNumero.Text := cdsGrid.FieldByName('TELEFONE').AsString; // esta linha é realmente necessária?
         ShellExecute(Handle,'Open','firefox.exe',PChar(edtUrl.Text + edtNumero.Text),'C:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Arquivos de programas\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\Mozilla Firefox', SW_SHOWNORMAL);
        cdsGrid.Next;
    end;
end;
Responder

10/09/2018

Bruno Henrique

Boa tarde, Emerson! Primeiramente, muito obrigado pela atenção!!!

edtNumero.Text := cdsGrid.FieldByName('TELEFONE').AsString; // esta linha é realmente necessária?

Então, como são vários números e eles estão em um clientdataset, para ir abrindo no navegador, foi o único que achei de jogar no edit, tem outro jeito???

Grato
Responder

10/09/2018

Bruno Henrique

Vou adaptar aqui!!! Posto o resultado.

Grato
Responder

11/09/2018

Bruno Henrique

Boa noite!!!

Então, ainda estou sem solução!O while não deu certo, e continua executando apenas um registro, ele não passa para o próximo, faz a ação só no primeiro registro, fiz como orientado mas não deu certo.Qual ajuste posso fazer?

procedure TForm1.Button1Click(Sender: TObject);
begin
      Clipboard.AsText := memoMensagem.Text;

      cdsGrid.Filter := 'SELECIONA = ' + QuotedStr('S'); // filtra os registros selecionados
      cdsGrid.Filtered := True; // ativa o filtro
      cdsGrid.First; // posiciona o cursor no primeiro registro


      
        while not(cdsGrid.eof) do
            begin
              cdsGrid.Edit;
              edtNumero.Text := cdsGrid.FieldByName('TELEFONE').AsString;
              ShellExecute(Handle,'Open','firefox.exe',PChar(edtUrl.Text + edtNumero.Text),'C:\\Arquivos de programas\\Mozilla Firefox', SW_SHOWNORMAL);
              cdsGrid.Next;
              cdsGrid.Last;
            end;

      timerBtnAbrirNavegador.Interval := 30000;
      timerBtnAbrirNavegador.Enabled := True;
      timerBtnFecharNavegador.Interval := 45000;
      timerBtnFecharNavegador.Enabled := True;
end;
Responder

11/09/2018

Bruno Henrique

Bom dia!!!

Ainda estou sem solução!!! Alguém poderia me ajudar?
Responder

11/09/2018

P2

Boa noite
Chama no skype sac@p2tecnico.com.br

Responder
porque você adicionou o cdsGrid.Last ??? desta forma o programa vai executar o primeiro e registro e depois sair do laço.
Responder

13/09/2018

Bruno Henrique

P2. Te add!!! Obrigado!!!
Responder

13/09/2018

Bruno Henrique

Emerson, boa noite!!!
Desculpa, vacilei com o cdsGrid.Last, agora deu certo, funcionou como eu queria.Muito Obrigado pela atenção!!!
Abraços
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar