Fórum Alguem saber pq o form nao fecha se fizer isso? #364558
02/10/2008
0
Alguem saber pq o form nao fecha se fizer isso?
Façam o teste
Form1
=======================
Coloque um Timmer
Set a propriedade do Timer1.Enabled = False
No evento OnTimer coloque o codigo
var i : integer;
begin
Timer1.Enabled := False;
i := 1;
while i > 0 do
begin
Application.ProcessMessages;
end;
end;
Form2
=======================
Faca a chamada do Timer1 atraves do clique e um botao
form1.Timer1.Enabled := true;
Tente Fechar o Form2...
Ele nao fehca. se vc colocar um envento no OnClose do Form ele é disparado.. parece ser alguma coisa no envendo OnCloseQuery do form2.
Colerapunk
Curtir tópico
+ 0Posts
02/10/2008
Emerson Nascimento
Gostei + 0
02/10/2008
Wdrocha
o form só fechará qdo ele sair do loop...assim como disse o amigo Emerson.en....é o loop q está impedindo o fechamento do form...
qualquer outra ação só será executada qdo o loop terminar....pq está é síncrona...
Gostei + 0
02/10/2008
Colerapunk
pois no form2 as acoes ocorrem normalmente.
Tipo coloquei mais um botao com a acao de inserir linhas em um memo..
O loop esta em acao no form1 e cada vez q eu clico no botao no form2 ele insere a linha no Memo
Memo1.Lines.Add(´Inserindo linha´);
fiz outros testes tb.. tudo normal..
so o form q nao fecha
Gostei + 0
02/10/2008
Emerson Nascimento
mas não tenho nada nos eventos OnClose e OnCloseQuery.
Gostei + 0
02/10/2008
Colerapunk
aki nao fechou..
Estou usando o Delphi7...
Gostei + 0
02/10/2008
Emerson Nascimento
fiz o seguinte pra ilustrar isso...
criei a variável private i (ela não é mais local no OnTimer).
coloquei um botão no form1, que chama o form2, e outro que zera a variável (pra poder sair do loop).
no form2 coloquei um botão que liga o timer do form1, assim como você exemplificou.
ficou assim:
[size=18:5db7996556]- form1[/size:5db7996556]
type
TForm1 = class(TForm)
Timer1: TTimer;
Button1: TButton; {caption: ´Abre Form2´}
Button2: TButton; {caption: ´i = 0´}
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
i: integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
i := 0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
i := 1;
while i > 0 do
Application.ProcessMessages;
end;[size=18:5db7996556]- form2[/size:5db7996556]
type
TForm2 = class(TForm)
Button1: TButton; {caption: Habilita o timer}
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Timer1.Enabled := true;
end;clique no botão que abre o form2. depois, no form2, clique no botão que inicia o timer; feche o form2. deve fechar normalmente.
agora, no form1, clique no ´x´ para fechar o form. você notará que ele não fecha, justamente por estar esperando o loop finalizar. agora pressione o botão que zera a variável i. o form1 será fechado.
note que o form1 é o form principal da aplicação teste.
Gostei + 0
02/10/2008
Colerapunk
Primeiro valeu por fazer os testes.
Parece coisa boba mas vou precisar disso em uma aplicacao q estou fazendo. Intao valeu pela dedicacao.
do jeito q vc fez esta ok..
Apenas faça a chamada do form2 com showmodal ou inves do Show
form2.showModal;
Ai q ta a diferença
Gostei + 0
02/10/2008
Emerson Nascimento
Gostei + 0
02/10/2008
Colerapunk
de qualquer forma no meu Delphi7 o Form2 nao fecha com o Timer executando
bom.. vou deixar os fontes ´simples para caramba´
para quem quiser dar uma olhada e ver
http://rapidshare.com/files/150337896/teste_fecha_form.rar.html
Valew
Gostei + 0
02/10/2008
Paullsoftware
var i : integer;
begin
Timer1.Enabled := False;
i := 1;
while i > 0 do
begin
Application.ProcessMessages;
//variavel global ´Parar´ do tipo char...
if Parar = ´S´ then
Break;
end;
end;
acho que assim vai funcionar perfeitamente :wink:
Gostei + 0
03/10/2008
Colerapunk
Na verdade esse exemplo é uma parte do meu sistema de backup automatico funciona em minha aplicacao..
Dependendo de como o bkp é configurado o sistema dispara sua execucao em determinado dia e horario..
Neste loop eu fico monitorando a quantidade de conexões existentes com a base de dados..
Ex: O sistema ira executar o bkp automatico da base de dados. FDB.
No momento em que é disparado uma mensagem aparece na tela de todas as estacoes que estao com o programa aberto informando que o bkp será realizado e q o sitema sera fechado em 1 minuto.. Assim terão tempo para salvar o seu trabalho. Depois de 1 minuto o sistema fecha automaticamente. Isso pq algum usuario pode ter deixado o sistema aberto e foi almoçar rss
loge apos disporar a mensagem de 1 minuto para fechar entra no loop
while Dados.IB_Conexao.Users.Count > 1 do
begin
Application.ProcessMessages;
end;
dessa forma verifico qtos usuarios estao conetados na base.
Qdo tiver apenas 1 conexao (q seria ele proprio) o sistema desconecta da base. compacta o FDB. e volta a conexao..
O lance é se se o bkp for disparado e a aplicacao que disparou estiver em uma tela.. por exemplo de cadastro de cliente ele nao consegue fechar a tela.. por causa do loop..
O loop é disparado no form principal atraves de um Timer programado.
A grande questao é essa.. O loop foi disparado e o usuario estava na tela de cadastro de cliente.. ele nao consegue fechar a tela de cadasto de clientes...
Tudo isso acontece somente na maquina q diparou a execucao do bkp..
So queria q ele conseguisse fechar o form em que estivesse e voltar para a tela principal do sistema..
Estou tentando achar outras alternativas...
é isso ai..
att
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)