Ajuda com While Que não Funciona

Delphi

Lógica de programação

10/09/2018

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;
Bruno Henrique

Bruno Henrique

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

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;
GOSTEI 1

Mais Respostas

Emerson Nascimento

Emerson Nascimento

10/09/2018

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;
GOSTEI 1
Bruno Henrique

Bruno Henrique

10/09/2018

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
GOSTEI 0
Bruno Henrique

Bruno Henrique

10/09/2018

Vou adaptar aqui!!! Posto o resultado.

Grato
GOSTEI 0
Bruno Henrique

Bruno Henrique

10/09/2018

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;
GOSTEI 0
Bruno Henrique

Bruno Henrique

10/09/2018

Bom dia!!!

Ainda estou sem solução!!! Alguém poderia me ajudar?
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

10/09/2018

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

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

10/09/2018

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

Bruno Henrique

10/09/2018

P2. Te add!!! Obrigado!!!
GOSTEI 0
Bruno Henrique

Bruno Henrique

10/09/2018

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