Perdento o loop qdo abro form dentro dele
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?
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
Curtidas 0
Respostas
Koplin
28/02/2005
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...
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
Emerson Nascimento
28/02/2005
Acho que você está enganado. O loop continua sim. Executei o código exatamente como você publicou e funcionou perfeitamente.
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.
ou, para exemplificar melhor, exiba, num showmessage, o valor da variável indice:
você vai perceber que o valor será exibido corretamente.
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
Massuda
28/02/2005
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.
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
Janete
28/02/2005
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?
GOSTEI 0
Massuda
28/02/2005
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.GOSTEI 0
Emerson Nascimento
28/02/2005
o desejado é que o form se abra e o loop continue executando, simultâneamente?
GOSTEI 0
Janete
28/02/2005
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?
GOSTEI 0
Emerson Nascimento
28/02/2005
ah.... agora tá explicado!
vc pode desligar o timer, executar o [b:4ee0a259ff]for[/b:4ee0a259ff] e depois religá-lo.
vc pode desligar o timer, executar o [b:4ee0a259ff]for[/b:4ee0a259ff] e depois religá-lo.
GOSTEI 0
Janete
28/02/2005
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.
GOSTEI 0
Emerson Nascimento
28/02/2005
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.
veja se assim funciona.
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
Emerson Nascimento
28/02/2005
só um adendo:
deixe o timer do FrmReindexa desligado e só lique-o no OnShow.
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