GARANTIR DESCONTO

Fórum Problemas ao fechar forms MDI e MDICHild #270422

28/02/2005

0

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


Ehvasc

Ehvasc

Responder

Posts

28/02/2005

Massuda

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):
var
  I: Integer;
....
  with Form1 do 
    for I := MDIChildCount - 1 downto 0 do begin
      MDIChildren[I].Free;
    end;
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.


Responder

Gostei + 0

01/03/2005

Ehvasc

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.


Responder

Gostei + 0

01/03/2005

Massuda

Insistindo um pouco mais na idéia da flag global ou na classe do form filho...

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;
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.


Responder

Gostei + 0

02/03/2005

Ehvasc

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


Responder

Gostei + 0

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

Aceitar