2010-03-17 5 views
3

Voici l'affaire. Le formulaire principal est défini sur fsNormal. Cette forme principale est agrandie en plein écran avec une barre d'outils flottante. La barre d'outils est de forme normale avec le style défini sur fsStayOnTop.Delphi fsStayOnTop oddity

Le plus souvent, cela fonctionne comme prévu. La forme principale s'affiche et la barre d'outils flotte au-dessus.

Parfois (c'est un bougre de trouver un ensemble reproductible d'étapes) lorsque alt-Tabulation vers et à partir d'autres applications (ou en cliquant sur l'icône de l'application Delphi sur la barre des tâches), les symptômes suivants peuvent se produire:

  1. Lorsque l'alt-tabulation loin de l'application Delphi le formulaire flottant supérieur fsStayOnTop reste au-dessus des autres applications. Donc, si je alt-tab pour Firefox, le menu flottant reste également sur Firefox. En cas de tabulation alt d'une autre application vers l'application Delphi, le menu flottant n'est pas visible (car il est derrière la mainform fsNormal).

Est-ce un bogue connu ou existe-t-il des hacks pour le forcer à fonctionner? Cela semble également se produire le plus souvent lorsque plusieurs copies de l'application sont en cours d'exécution (elles n'ont aucune interaction entre elles et devraient être exécutées dans leur propre "sandbox"). C'est comme si Delphi devenait confus quelle fenêtre est censée être sur le dessus et les échange ou change la forme flottante pour rester sur le mode tout le temps. Ou ai-je mal compris? fsStayOnTop? Je suppose que la définition d'un style de formulaire à fsStayOnTop le fait rester au-dessus de tous les autres formulaires dans l'application actuelle et pas toutes les fenêtres à travers d'autres applications en cours d'exécution.

Répondre

0

Un peu plus d'informations et une solution possible.

Définissez la forme flottante sur fsnormal.

Lorsque l'événement mainform.activate se déclenche, appelez floatingform.bringtofront.

Mais j'utilise aussi stayontop pour toutes les autres boîtes de dialogue d'applications. Lorsque plusieurs copies de l'application sont en cours d'exécution, les boîtes de dialogue affichent le même problème (par exemple, si une boîte de dialogue est ouverte avec app1 et qu'elle est décalée par rapport à la boîte de dialogue, elle reste au-dessus de tous les autres programmes).

+0

Encore une question. Comment puis-je définir un style de formulaire pour rester au-dessus de SEULEMENT un autre formulaire (dans ce cas la mainform)? Ensuite, je peux changer les dialogues pour ne pas fsstayontop et quand ils activent je peux leur dire de rester seulement au-dessus de la mainform? PS, désolé d'avoir répondu à ma propre question. Je n'avais pas réalisé que j'aurais dû commenter plutôt que de répondre. – TallGuy

+3

oui, vous devriez déplacer toute cette information en éditant votre question. –

0

Je ne connais pas de bogue dans ce domaine.

Permettez-moi tout d'abord vous expliquer comment fonctionne le processus:

Delphi utilise premier style fsStayOnTop lors de la création de la fenêtre qui tient la forme, en invoquant la fonction win32 SetWindowPos avec le paramètre HWND_TOPMOST.

Voir http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx pour une explication détaillée de SetWindowPos. Delphi énumère toutes les formes les plus élevées pour normaliser les formes (normaliser est le terme que vcl utilise pour dire que les fenêtres les plus hautes sont tournées au plus haut) et maintient un interne à chaque fois que l'application est désactivée ou minimisée. liste de toutes les fenêtres qui étaient le plus haut à ce moment-là.

Chaque fois que l'application est activée ou restaurée, Delphi utilise les informations stockées dans la liste des plus hautes fenêtres, de restaurer toutes les plus hautes formes (à l'aide setWindowPos avec le paramètre HWND_TOPMOST)

Donc, pour moi les problèmes semble être en la façon dont Delphi stocke les informations lors de l'énumération des fenêtres lorsque l'application est réduite.

Je piraterais la fonction de minimisation ou de désactivation et vérifierais si la liste de fenêtres la plus haute (c'est sur Application.FTopMostList) est correctement listée.

+0

Quelques informations supplémentaires. Il y a des bugs connus identiques à ceux que j'ai initialement montrés avec fsstayontop de google recherches. Mon problème est maintenant de régler toutes les boîtes de dialogue sur fsnormal. Ensuite, sous mainform.onactivate, j'ajoute ce code if (floatingmenu <> nil) et (floatingmenu.visible = true) puis SetWindowPos (menu flottant, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE ou SWP_NOMOVE ou SWP_NOSIZE) ; Cela fonctionne comme prévu maintenant et échappe à toutes les bizarreries de Delphes avec la façon dont il gère les formulaires fsstayontop. – TallGuy

-1

J'ai eu un problème similaire et ce lien me aider beaucoup: Delphi: Balloon Form with fsStayOnTop not working in Win7

Quand j'appelle la fonction Application.NormalizeTopMosts(), puis les formes les plus hautes se comportent comme je le pense.

+0

Envisagez d'élargir votre réponse avec un extrait de la page référencée. Voir [Comment répondre] (http://stackoverflow.com/questions/how-to-answer) pour plus de détails sur les raisons pour lesquelles les liens nus ne sont pas considérés comme de bonnes réponses. – bytebuster