2010-09-22 5 views
1

HIDelphi MainFormOnTaskBar fenêtres modales bug

J'utilise Delphi 2007 et ont mis la propriété MainFormOnTaskBar true.

Le problème que j'ai est celui-ci.

Si vous ouvrez une fenêtre enfant à partir du formulaire principal, puis vous affichez une boîte de dialogue de message à partir de la fenêtre enfant que vous venez d'ouvrir. Lorsque vous fermez la boîte de dialogue de message, puis fermez la fenêtre enfant, le formulaire principal sera envoyé à l'arrière de toute autre application que vous avez sur l'écran. Cela se produit sous Windows Vista et Windows 7. Est-ce que quelqu'un sait pourquoi cela se produit et comment puis-je le réparer?

Répondre

2

J'ai résolu ce problème de deux façons.

Tout d'abord en ajoutant stdcall à la fin de DoFindWindow dans Forms.pas comme décrit par Andreas Hausladen. Cela gère quand un formulaire enfant est caché (CloseAction = caHide) au lieu de publié lors de la fermeture du formulaire.

Deuxièmement - copié le code de TCustomForm.CMShowingChanged qui appelle FindTopMostWindow, puis active la fenêtre qui a été retournée dans TCustomForm.CMRelease.

(Edit: bloc de code doit être en retrait par 4 espaces)

procedure TCustomForm.CMRelease; 
var 
    NewActiveWindow: LongInt; 
begin 
    if Application.MainFormOnTaskbar then 
    begin 
    NewActiveWindow := 0; 

    if (GetActiveWindow = Handle) and not IsIconic(Handle) then 
    begin 
     NewActiveWindow := FindTopMostWindow(Handle); 
    end; 

    if NewActiveWindow <> 0 then 
    begin 
     SetActiveWindow(NewActiveWindow); 
    end; 
    end; 

    Free; 
end; 

Cela semble avoir fait, je vais continuer à tester pour vous assurer.

5

Je suppose que ce serait QC66892-Closing forms deactivates the application, qui semble avoir été corrigé avec Delphi 2009 selon le rapport. Au bas du rapport QC vous trouverez un commentaire de Andreas Hausladen incluant un lien vers sa correction du bug. Mais vous voudriez vraiment utiliser son VCL Fix Pack qui inclut beaucoup d'autres corrections aussi bien.

+0

merci pour cela. Oui j'ai trouvé que cela se produit lors de la fermeture de n'importe quelle forme, pas seulement des formes modales. Par exemple, si j'ouvre un formulaire enfant à partir du formulaire principal, puis ouvrez un deuxième formulaire enfant à partir du premier formulaire enfant. Fermer le deuxième formulaire enfant et ensuite fermer le premier formulaire enfant enverra le formulaire principal à l'arrière de toutes les autres applications. –

+0

J'ai téléchargé le correctif pour le QC# 66892 et j'ai remarqué qu'il mentionnait qu'une directive stdcall manquante était à l'origine du problème. Donc plutôt que d'inclure l'unité de correction dans mon projet, j'ai simplement ajouté le stdcall à la fonction DoFindWindow de Forms.pas et recompilé le VLC. Fonctionne très bien, merci pour ça. –

+0

@no cuillère - De rien, mais le crédit est vraiment Andy. :) –

0

Les propriétés PopupMode et PopupParent ont été ajoutées spécifiquement à TForm pour résoudre ce problème. Avant d'afficher le formulaire enfant, définissez PopupParent sur le formulaire principal, et c'est PopupMode sur pmAuto. PopupParent affecte spécifiquement l'ordre Z des fenêtres lorsque d'autres fenêtres sont affichées.

L'aide de Delphi 2007 contient de la documentation sur ces deux propriétés, mais vous devez passer par TForm pour y accéder. Utilisez 'TForm, Pop' comme sujet de recherche (sans les guillemets, évidemment) pour y arriver. Les documents sont un peu déroutants à propos de PopupParent, car ils traitent de l'effet que PopupMode a sur l'attribution automatique de PopupParent. Un peu d'expérimentation après avoir lu les docs devrait être payante, cependant.

+0

Très bien, je vais y jeter un coup d'œil. –

Questions connexes