2009-05-18 6 views
1

La situation est un peu difficile à expliquer, je ferai de mon mieux.Delphi ListView 'coincé' dans l'événement souris

J'ai un ListView, qui a un menu clic droit. L'un des éléments du menu ouvre un nouveau formulaire non modal. Habituellement, l'utilisateur clique sur l'élément de menu, un nouveau formulaire apparaît et va bien.

Cependant, si l'utilisateur ouvre le menu contextuel en cliquant sur une zone de ListView dans laquelle il n'y a pas d'affichage ListItem, par ex. ci-dessous le dernier ListItem, puis cliquez sur l'élément de menu, le formulaire non modal apparaît, mais le curseur semble être coincé dans un état bouton gauche de la souris dans la ListView, à savoir la forme non modale est à l'avant, mais quand Je déplace la souris, elle fait glisser ces rectangles dans la ListView en arrière-plan, comme si le bouton de la souris était enfoncé.

J'ai essayé d'utiliser divers BringToFront, SetFocus et essayé d'utiliser SendMessage pour simuler des clics de souris pour contourner le problème sans succès.

+0

Avez-vous essayé Windows.mouse_event()? –

+0

Comment affichez-vous le menu contextuel? A-t-il été affecté à la propriété PopupMenu de TreeView? –

+0

Cela doit être quelque chose de spécifique, car ce n'est pas une opération rare. Peut-être que vous devriez essayer une application de test minimale et voir comment vous pouvez le reproduire avec le moins de code possible. –

Répondre

0

J'ai trouvé le problème. Après une enquête plus approfondie, ListView était en fait un descendant personnalisé de TListView, et il avait sa propre façon (buggy) de gérer les menus contextuels. Je l'ai changé pour utiliser TListView.PopupMenu par défaut de TListView et cela fonctionne tout doux. Merci Lars Truijens pour avoir suggéré de construire une application de test minimale, qui m'a conduit dans la bonne direction.

0

Semble à moi comme l'affichage de la liste ne gère pas correctement le message WM_CANCELMODE qui lui indique qu'il a perdu le focus alors qu'il avait la capture de la souris. Je ne sais pas comment vous pouvez résoudre ce problème, sauf peut-être en lui envoyant un message de souris.

Questions connexes