Vários aplicativos e diálogos Delphi em formulários
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.
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 ...
- 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.
- Se você estiver usando Delphi 2007, tente remover a linha do arquivo fonte do projeto que define a variável booleana Application.MainFormOnTaskBar.
- 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!