Problema com showmodal

Delphi

07/11/2007

Ultimamente meus sistemas estão com um problema que não consigo entender: De vez em quando as telas abertas com SHOWMODAL não funcionam, isto é, ficam atrás da tela que a chamou.
Saindo do programa e voltando o problema some.
Alguém pode me explicar este pepino?
Pode ser o Windows XP?


Crpavao

Crpavao

Curtidas 0

Respostas

Massuda

Massuda

07/11/2007

Não é um problema do Windows, mas sim um problema relacionado ao modo como a VCL implementa os objetos TApplication e TForm.

Para ajudar a minimizar isso, inclua isto no seu form modal...
type
  TSeuFormModal = class(TForm)
    ...
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    ...
  end;

...

procedure TSeuFormModal.CreateParams(var Params: TCreateParams);
begin
  inherited;

  if Assigned(Owner) and (Owner is TWincontrol) then
    Params.WndParent := TWinControl(Owner).handle
  else if Assigned(Screen.Activeform) then
    Params.WndParent := Screen.Activeform.Handle;
end;



GOSTEI 0
Crpavao

Crpavao

07/11/2007

Obrigado Massuda. Vou testar e retorno aqui o resultado


GOSTEI 0
Crpavao

Crpavao

07/11/2007

Qdo uso MessageDgl também ocorre este problema. Teria alguma solução para este caso?
Substitui todos eles por um form criado por mim, mas gostaria de saber se tem solução.
Grato.


GOSTEI 0
Massuda

Massuda

07/11/2007

Troque seus MessageDlg e ShowMessage por MessageBox da unit Windows.

Note que o primeiro parametro do MessageBox é o handle de uma janela, sempre informe o handle da janela ativa do seu programa (algo do tipo SeuForm.Handle) ou informe Screen.ActiveForm.Handle.


GOSTEI 0
Crpavao

Crpavao

07/11/2007

Obrigado Massuda, vou testar em momento oportuno e te retorno..
Mais uma vez, obrigado pela força.


GOSTEI 0
Martins

Martins

07/11/2007

[quote:d9d0e2dc68=´Pavão´]Obrigado Massuda, vou testar em momento oportuno e te retorno..
Mais uma vez, obrigado pela força.[/quote:d9d0e2dc68]

Algo mais ou menos assim.

  MessageBox(Form2.Handle, pchar(´Testando..´), pchar(´Informação´), mb_ok);


Boa sorte e bons códigos.


GOSTEI 0
Fabio Ferreira

Fabio Ferreira

07/11/2007

Massuda,

Eu utilizo o application.messagebox(...) da unit forms que esta encapsulando a windows.messagebox. Tem alguma vantagem ou é melhor de uma forma ou de outra ?

Fabio


GOSTEI 0
Massuda

Massuda

07/11/2007

[quote:3ec6e91675=´Fabio Ferreira´]Eu utilizo o application.messagebox(...)[/quote:3ec6e91675]Com relação ao problema que deu origem a este tópico, TApplication.MessageBox tem o mesmo problema que MessageDlg ou ShowMessage.


GOSTEI 0
Fabio Ferreira

Fabio Ferreira

07/11/2007

Estou com um problema que resolvi quebrando o galho, que deve ter relacao com esse topico.

Apos o codigo abaixo a mensagem simplesmente nao aparece :

Frmtroca:= TFrmtroca.create( nil );
result:= Frmtroca.showmodal = mrok;
Frmtroca.release;

retorno:= windows.messagebox( screen.activeform.handle, pchar( mensagem )....;

Neste caso a mensagem nao é apresentada para o usuario, pulando o comando, retornando com 0 (zero);

O que estamos fazendo e testando o ´retorno´ e se for iqual a zero apresenta a mensagem novamente e aí sempre aparece.

Esse problema somente acontece apos a chamada de um form, como no exemplo acima.

O messagebox foi testado tanto com a Windows. quanto com o Application.

Aonde esta o erro desse caso ?

Fabio


GOSTEI 0
POSTAR