Problemas ao fechar forms MDI e MDICHild
Senhores,
Estou com um probleminha.
Tenho uma aplicação que usas forms MDI. Em cada form filho eu tenho um evento no OnCloseQuery, ou seja, toda vez que se fechar um form filho ele faz uma pergunta.
Só que a bronca começa quando eu tento fechar o form pai e existem janelas filhas abertas. Para cada form filho é executada a pergunta de fechar. Já tentei interceptar a mensagem de fechamento, só que não funcionou. Quando se tenta fechar o form pai ele tenta fechar os forms filhos e só depois executas os eventos OnClose e OnCloseQuery dos form pai. Já tentei também capturar os eventos do sistema. Não resolveu. Não sei mais onde procurar a mensagem de fechamento do form filho, ou com evitar que execute o OnCloseQuery dos filhos.
Se alguém souber com fazer fico grato se puder me ajudar.
Desde já agradeço a atenção de todos
Estou com um probleminha.
Tenho uma aplicação que usas forms MDI. Em cada form filho eu tenho um evento no OnCloseQuery, ou seja, toda vez que se fechar um form filho ele faz uma pergunta.
Só que a bronca começa quando eu tento fechar o form pai e existem janelas filhas abertas. Para cada form filho é executada a pergunta de fechar. Já tentei interceptar a mensagem de fechamento, só que não funcionou. Quando se tenta fechar o form pai ele tenta fechar os forms filhos e só depois executas os eventos OnClose e OnCloseQuery dos form pai. Já tentei também capturar os eventos do sistema. Não resolveu. Não sei mais onde procurar a mensagem de fechamento do form filho, ou com evitar que execute o OnCloseQuery dos filhos.
Se alguém souber com fazer fico grato se puder me ajudar.
Desde já agradeço a atenção de todos
Ehvasc
Curtidas 0
Respostas
Massuda
28/02/2005
Uma possibilidade seria você fechar os forms filhos no OnClose ou OnCloseQuery do form pai usando Free ao invés de Close (não testei):Outra possibilidade seria você ter uma flag (global ou na classe do form filho) indicando que quem está fechando o form é o form pai. Por exemplo, teste no OnCloseQuery do form filho se essa flag está marcada, se estiver, não mostre a pergunta.
var I: Integer; .... with Form1 do for I := MDIChildCount - 1 downto 0 do begin MDIChildren[I].Free; end;
GOSTEI 0
Ehvasc
28/02/2005
Caro Massuda,
Já tentei isso. Não funciona pq de alguma forma o form_pai envia uma mensagem antes do close ou do CloseQuery do próprio form_pai para os filhos. A saida seria capturar a mensagem que o form MDI manda pra os filhos quando se tenta fechá-lo.
Já tentei verificar no OnClose e OnCloseQuery do form pai, só que primeiro é executado o do form filho e depois o do form_pai.
De qualquer forma agradeço sua atenção.
Já tentei isso. Não funciona pq de alguma forma o form_pai envia uma mensagem antes do close ou do CloseQuery do próprio form_pai para os filhos. A saida seria capturar a mensagem que o form MDI manda pra os filhos quando se tenta fechá-lo.
Já tentei verificar no OnClose e OnCloseQuery do form pai, só que primeiro é executado o do form filho e depois o do form_pai.
De qualquer forma agradeço sua atenção.
GOSTEI 0
Massuda
28/02/2005
Insistindo um pouco mais na idéia da flag global ou na classe do form filho...
Isso deve funcionar porque a função CloseQuery é quem dispara o evento OnCloseQuery. No caso de um form MDI pai, CloseQuery primeiro verifica o resultado de CloseQuery nos forms MDI filho para então disparar o evento OnCloseQuery do form MDI pai. Setar uma flag [b:b24c7dc6e2]antes[/b:b24c7dc6e2] de chamar a função herdada deve solucionar o problema.
Já tentei verificar no OnClose e OnCloseQuery do form pai, só que primeiro é executado o do form filho e depois o do form_pai.
Depois de dar uma olhada no funcionamento do evento OnCloseQuery num aplicativo MDI, acho que você pode fazer o seguinte...type TMeuFormMdiPai = class(... ... public function CloseQuery: Boolean; override; ... ... function TMeuFormMdiPai.CloseQuery: Boolean; begin // seta uma flag global ou // percorre MDIChildren[] setando uma flag // para indicar que é o form pai que está fechando os forms Flag_FormPai_Fecha_FormFilho := True; Result := inherited CloseQuery; end;
GOSTEI 0
Ehvasc
28/02/2005
Caro Massuda,
Não havia me atentado para isso, acho que queria resolver da forma mais complicada possível, essa sua dica funcionou muito bem. Muito obrigado e até a próxima
Não havia me atentado para isso, acho que queria resolver da forma mais complicada possível, essa sua dica funcionou muito bem. Muito obrigado e até a próxima
GOSTEI 0