GARANTIR DESCONTO

Fórum Perdento o loop qdo abro form dentro dele #270483

28/02/2005

0

Preciso abrir um form em loop só q quando eu abro esse form o loop não vai até o final e a Numeração de indice q controla o loop volta pra zero:

var Indice : Integer;

for Indice:=0 to (FileListBox1.items.count-1) do
begin
if FileListBox1.Items.Strings[indice] = ´Entra´ then
begin
Try
Application.CreateForm(TFrmReindexa, FrmReindexa);
FrmReindexa.ShowModal;
Finally
FrmReindexa.Free;
End;
end;
end;

o que eu poderia fazer pra q ele continue com o loop mesmo depois de abrir outro form?


Janete

Janete

Responder

Posts

28/02/2005

Koplin

Use uma variavel global para armazenar o ponto em q parou e faça o loop baseado nesta var, incrementando-a

var Indice, Ponto : Integer; //poe global
//na chamada da procedure faça:
ponto :=0;//
for Indice:=Ponto to (FileListBox1.items.count-1) do
begin
inc(ponto);
if FileListBox1.Items.Strings[indice] = ´Entra´ then
begin
Try
Application.CreateForm(TFrmReindexa, FrmReindexa);
FrmReindexa.ShowModal;
Finally
FrmReindexa.Free;
End;
end;
end;

Nao sei se é isso mas tenta...


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

Acho que você está enganado. O loop continua sim. Executei o código exatamente como você publicou e funcionou perfeitamente.

var Indice : Integer;

for Indice:=0 to (FileListBox1.items.count-1) do 
begin 
  if FileListBox1.Items.Strings[indice] = ´Entra´ then 
    Try 
      Application.CreateForm(TFrmReindexa, FrmReindexa); 
      FrmReindexa.ShowModal; 
    Finally 
      FrmReindexa.Free; 
    End; 
end;


o problema é que depois da execução o loop executa muito rápido.
agora tente o seguinte:
adicione um label no seu form e exiba o valor da variável indice. você vai ver que funciona.

var Indice : Integer;

for Indice:=0 to (FileListBox1.items.count-1) do 
begin 
  if FileListBox1.Items.Strings[indice] = ´Entra´ then 
    Try 
      Application.CreateForm(TFrmReindexa, FrmReindexa); 
      FrmReindexa.ShowModal; 
    Finally 
      FrmReindexa.Free; 
    End; 

  // acione um label e coloque essa linha.
  Label1.Caption := IntToStr(indice);

end;


ou, para exemplificar melhor, exiba, num showmessage, o valor da variável indice:

var Indice : Integer;

for Indice:=0 to (FileListBox1.items.count-1) do 
begin 
  if FileListBox1.Items.Strings[indice] = ´Entra´ then 
    Try 
      Application.CreateForm(TFrmReindexa, FrmReindexa); 
      FrmReindexa.ShowModal; 
    Finally 
      FrmReindexa.Free; 
    End; 

  // exiba o valor numa mensagem.
  ShowMessage( IntToStr(indice) );

end;


você vai perceber que o valor será exibido corretamente.


Responder

Gostei + 0

01/03/2005

Massuda

No seu código, o loop irá ficar paralisado até que o form FrmReindexa seja fechado.

Entretanto, se você estiver usando Application.ProcessMessages dentro da implementação de FrmReindexa, teoricamente é possível ocorrer reentrância e seu loop ser iniciado novamente; note que esta nova execução nada tem a ver com a primeira execução.

Ao invés de criar o form e dar um ShowModal, talvez você devesse considerar a possibilidade se dar um Show no form, principalmente se FrmReindexa não for uma caixa de diálogo.


Responder

Gostei + 0

01/03/2005

Janete

Não consegui, e fiz um teste ocultando a abertura do form aí funciona perfeitamente mas se eu abrir não dá certo, criei as variaveis global tb não deu, alguém pode me dar mais alguma sugestão?


Responder

Gostei + 0

01/03/2005

Massuda

Não consegui, e fiz um teste ocultando a abertura do form aí funciona perfeitamente mas se eu abrir não dá certo...
Dê uma olhada nos eventos OnCreate, OnShow e OnActivate do seu form FrmReindexa. Pode ser interessante você postar aqui o código do FrmReindexa.


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

o desejado é que o form se abra e o loop continue executando, simultâneamente?


Responder

Gostei + 0

01/03/2005

Janete

o desejado é que o form se abra e o loop continue executando, simultâneamente?


Não, ele aguarde o form ser fechado, só aí ele continua. Eu estava observando aqui me parece q o problema se dá por esse processo estar sendo feito no OnTimer de um componente Timer, é q o timer fica todo momento mesmo com q o intervalo definido seja maior, passando novamente pelo processo e então o loop volta para o início e começa tudo novamente. O que posso fazer agora?


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

ah.... agora tá explicado!

vc pode desligar o timer, executar o [b:4ee0a259ff]for[/b:4ee0a259ff] e depois religá-lo.


Responder

Gostei + 0

01/03/2005

Janete

ah.... agora tá explicado! vc pode desligar o timer, executar o [b:38dec36e33]for[/b:38dec36e33] e depois religá-lo.


Belezinha, obrigado! Outra coisa, ainda nesse mesmo processo qdo abro o FrmReindexa, executo um processo lá dentro logo no formshow e logo q termino coloco um Close para q feche o form qdo terminar o processo, mas ele não fecha tenho q fechar manual, o onclose está vazio. Parece tão simples mas não fecha.


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

acho que isso requer um ´ajuste técnico´...

coloque um Timer no FrmReindexa com interval 1000 (um segundo) e coloque seu código nesse Timer (não faça no OnShow).
faça da mesma forma que no outro:
ao entrar no Timer desligue-o, execute o seu código dê o Close.

procedure FormReindexa.Timer1OnTimer(Sender: TObject);
begin
  Timer1.Enabled := False;
  {Código que estava no OnShow};
  Close;
end;


veja se assim funciona.


Responder

Gostei + 0

02/03/2005

Emerson Nascimento

só um adendo:

deixe o timer do FrmReindexa desligado e só lique-o no OnShow.

procedure FrmReindexa.FormCreate(Sender: TObject); 
begin 
  Timer1.Enabled := False; 
end;

procedure FrmReindexa.FormShow(Sender: TObject); 
begin 
  Timer1.Enabled := True;
end;

procedure FrmReindexa.Timer1OnTimer(Sender: TObject); 
begin 
  Timer1.Enabled := False; 
  {Código que estava no OnShow}; 
  Close; 
end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar