Problemas no showModal após atribuir a SetParent (..)
-
27-09-2019 - |
Pergunta
Criei dois aplicativos MainApps e Subapps, o Subapps possui uma caixa de diálogo de tipo modal, como formulário de login/logout etc. e está funcionando bem.
Depois de conectá -lo ao MainApps, a caixa de diálogo modal mostra como o formulário de caixa normal. Ele se comporta como "dialog.show" em vez de "dialog.showmodal";
Estou usando o compilador Delphi
Subapps ButtonClick;
begin
with TfrmDialog.Create(Self, dtLogout) do
try
iMsgResult := ShowModal;
finally
Free;
end;
if iMsgResult = mrOk then
begin
dmVoca.FHomeworkXMLDoc.Active := False;
//Disabled Double Login
dmVoca.tmrDoubleLogin.Enabled := False;
................
end;
end;
Mairepps ButtonClick
begin
setparent(findwindow(nil,'SubApps'),TabSheet1.Handle);
.........
end;
Solução
Não se surpreenda, o que você está tentando é incomum na melhor das hipóteses. ShowModal
alcança o efeito modal, desativando todas as janelas do thread de chamada, mas o formulário modal. Como o seu formulário pai não pertence ao mesmo segmento, nem mesmo ao mesmo processo, ele não fica desativado. Ver DisableTaskWindows
nos formulários.
Você precisa criar seu próprio procedimento modal; Teste se o aplicativo está parental em uma janela de nível superior que não é a área de trabalho, desative essa janela se for esse o caso.
Mas se eu fosse você, pensaria no design primeiro, e se, FI, você fechar o formulário pai, como encerra o processo do formulário dos pais?
editar: Para o terceiro comentário abaixo - você pode tentar ter a forma modal "de propriedade" do formulário do MainApps. Similar às formas de propriedade do formulário principal do aplicativo enquanto
MainFormOnTaskbar
é verdade. Ver Janelas de propriedade sobre Recursos de janela Tópico de MSDN.
var
frmDialog: TfrmDialog;
begin
[...]
frmDialog := TfrmDialog.Create(Self, dtLogout);
try
SetWindowLong(frmDialog.Handle, GWL_HWNDPARENT, GetAncestor(Handle, GA_ROOT));
iMsgResult := frmDialog.ShowModal;
[...]
Eu humildemente sugiro que você faça uma pergunta sobre uma sugestão de um design para o que deseja alcançar, por exemplo, se se trata de reutilização de código, você pode hospedar seus formulários de Subapps em uma DLL ... Esse design é frágil, você Pode continuar a ter problemas com isso ...
Outras dicas
Tente fazer com que o Windows "System Modal" em vez de "Modal do Aplicativo". Na verdade, não tenho ideia se você pode fazer isso. Pode ser impossível, ou uma má ideia. De fato, toda a pergunta me dá o cheiro de "má idéia".