Fórum Perdento o loop qdo abro form dentro dele #270483
28/02/2005
0
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
Curtir tópico
+ 0Posts
28/02/2005
Koplin
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...
Gostei + 0
01/03/2005
Emerson Nascimento
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.
Gostei + 0
01/03/2005
Massuda
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.
Gostei + 0
01/03/2005
Janete
Gostei + 0
01/03/2005
Massuda
Gostei + 0
01/03/2005
Emerson Nascimento
Gostei + 0
01/03/2005
Janete
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?
Gostei + 0
01/03/2005
Emerson Nascimento
vc pode desligar o timer, executar o [b:4ee0a259ff]for[/b:4ee0a259ff] e depois religá-lo.
Gostei + 0
01/03/2005
Janete
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.
Gostei + 0
01/03/2005
Emerson Nascimento
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.
Gostei + 0
02/03/2005
Emerson Nascimento
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;Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)