Pergunta

Eu tenho um aplicativo Delphi 7 que possui duas visualizações de um documento (por exemplo,uma edição HTML WYSIWYG pode ter uma visualização WYSIWYG e uma visualização de origem - não minha aplicação real).Eles podem ser abertos em janelas separadas ou encaixados em guias na janela principal.

Se eu abrir uma caixa de diálogo modal a partir de um dos formulários separados, o formulário principal será trazido para a frente e mostrado como a janela selecionada na barra de tarefas do Windows.Digamos que o formulário principal seja a visualização WYSIWYG e a visualização de origem seja exibida.Você vai para um ponto específico na visualização de origem e insere uma tag de imagem.Uma caixa de diálogo aparece para permitir que você selecione e insira as propriedades desejadas para a imagem.Se a visualização WYSIWYG e a visualização de origem se sobrepuserem, a visualização WYSIWYG será trazida para a frente e a visualização de origem será ocultada.Assim que a caixa de diálogo for encerrada, a visualização de origem volta à vista.

Tentei definir o proprietário e as propriedades ParentWindow para o formulário ao qual está relacionado:

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

Como posso resolver este problema?O que mais devo tentar?

Dado que as pessoas parecem estar tropeçando no meu exemplo, talvez eu possa tentar um exemplo melhor:um editor de texto que permite abrir mais de um arquivo ao mesmo tempo.Os arquivos que você abriu estão em abas (como no Delphi IDE) ou em sua própria janela.Suponha que o usuário abra a caixa de diálogo de verificação ortográfica ou de localização.O que acontece é que se o arquivo estiver sendo editado em uma janela própria, essa janela será enviada abaixo do formulário principal na ordem z quando a caixa de diálogo modal for mostrada;assim que a caixa de diálogo for fechada, ela retornará à sua ordem z original.

Observação:Se você estiver usando Delphi 7 e procurando uma solução para esse problema, veja minha resposta mais abaixo na página para ver o que acabei fazendo.

Foi útil?

Solução

Eu usaria esse código ...(Basicamente o que Lars disse)

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();

Outras dicas

Acabei encontrando o responder usando Grupos do Google.Resumindo, todas as caixas de diálogo modais precisam ter o seguinte adicionado a elas:


procedure TDialogForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style or WS_POPUP;
  Params.WndParent := (Owner as TWinControl).Handle;
end;

Suponho que isso equivale às respostas de Lars e Marius no Delphi 7.

A caixa de diálogo é mostrada usando ShowModal ou apenas Show?Você provavelmente deve definir a propriedade PopupMode correta na sua caixa de diálogo.pmAuto provavelmente seria sua melhor escolha.Veja também se você precisa definir a propriedade PopupParent.

Em primeiro lugar, não tenho certeza se entendi. Talvez seja necessário fornecer alguns detalhes adicionais para nos ajudar a entender o que está acontecendo e qual é o problema.Acho que não tenho certeza se entendi exatamente o que você está tentando realizar e qual é o problema.

Segundo, você não precisa definir o pai da caixa de diálogo, pois é essencialmente isso que está acontecendo com a chamada para Create (passando o pai).Os diálogos que você está descrevendo parecem que precisam ser "repensados" um pouco, para ser honesto.Esta caixa de diálogo para inserir as propriedades da imagem é filha da janela de origem ou da janela WYSIWYG?

Não tenho certeza se entendi muito bem o que você quer dizer, mas aqui estão algumas coisas que posso sugerir que você tente ...

  1. Esse comportamento muda entre diferentes versões do Delphi.Eu sugeriria que isso se deve aos obstáculos que eles superaram para oferecer suporte ao Windows Vista no Delphi 2007.
  2. Se você estiver usando Delphi 2007, tente remover a linha do arquivo fonte do projeto que define a variável booleana Application.MainFormOnTaskBar.
  3. Com isso removido, você poderá usar os vários métodos BringToFront/SendToBack do Form para obter a ordem Z que deseja.

Suspeito que o que você descobriu foi discutido em esse linkClaro, posso ter perdido totalmente o seu argumento, então peço desculpas antecipadamente!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top