Comment faire pour afficher une TPopupMenu lorsque vous cliquez sur un TButton?
Je veux montrer un popupmenu lors d'un clic sur un bouton, mais cette procédure a erreur dans Delphi XE.
procedure ShowPopupMenuEx(var mb1:TMouseButton;var X:integer;var Y:integer;var pPopUP:TPopupMenu);
var
popupPoint : TPoint;
begin
if (mb1 = mbLeft) then begin
popupPoint.X := x ;
popupPoint.Y := y ;
popupPoint := ClientToScreen(popupPoint); //Error Here
pPopUP.Popup(popupPoint.X, popupPoint.Y) ;
end;
end;
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
ShowPopupMenuEx(button,Button1.Left,Button1.Top,PopupMenu1); //Error Here
end;
lorsque cliquez sur le bouton afficher ce message d'erreur :
[DCC Erreur] Form1.pas(205): E2010 types Incompatibles: 'HWND" et "TPoint'
[DCC Erreur] Form1.pas(398): E2197 Constante objet ne peut pas être transmis en tant que paramètre var
[DCC Erreur] Form1.pas(398): E2197 Constante objet ne peut pas être transmis en tant que paramètre var
Est-il un meilleur moyen pour montrer popupmenu, lors d'un clic sur un bouton?
Pourquoi utilisez-vous le var-les paramètres de la ShopPopupMenuEx( )-procédure?
oups, c'est mon erreur, désolé.
oups, c'est mon erreur, désolé.
OriginalL'auteur User | 2010-10-21
Vous devez vous connecter pour publier un commentaire.
Il suffit de ne
Un peu plus de discussion
Si pour une raison besoin à utiliser
OnMosuseUp
, vous pouvez le faireVotre code ne fonctionne pas car
ClientToScreen
est une fonction de l'API Windows avec signatureMais, il y a aussi un
TControl.ClientToScreen
avec signatureDonc, si vous êtes dans une méthode de classe, la classe étant un decendant de
TControl
,ClientToScreen
va se référer à la dernière. Si non, il va se référer à l'ancien. Et ce, bien sûr, besoin de savoir qui de la fenêtre pour transformer les coordonnées de!Aussi, si vous déclarez
en tant que paramètre, alors qu'une variable de type
TMouseButton
sera accepté. Mais je ne vois aucune raison pourquoi vous voulez cette signature de votreShowPopupMenuEx
fonction. En fait, je ne vois pas la nécessité d'une telle fonction à tous les...Une Alternative
Mon code ci-dessus affichera le menu à l'aide du curseur pos. Si vous avez besoin de fixer le point par rapport à un coin de la touche, au lieu de cela, vous pouvez le faire
OriginalL'auteur Andreas Rejbrand
cette erreur est parce que votre code est l'appel de la
Windows.ClientToScreen
fonction de la place de laTControl.ClientToScreen
fonctionessayer quelque chose comme cela
ou déclarer votre procédure
ShowPopupMenuEx
à l'intérieur de votreTform1
de classe et de travail.Self.ClientToScreen
quand il y a unTButton.ClientToScreen
. Aussi, je vous battre avec huit minutes...essayez le code dont j'ai posté, et vous comprendrez pourquoi je l'appelle
Self.ClientToScreen
au lieu deTButton.ClientToScreen
Je suis désolé. Je ne la vois pas.
Mais je pense qu'il est mal vu de post un sous-ensemble de toutes les informations dans mon post huit minutes après que j'ai envoyé mon post. Désolé, je ne sens pas différent...
Votre code utilise la position actuelle du curseur tout en RRUZ code utilise le coin en bas à gauche du bouton. Donc, il y a une différence. Et à mon humble avis RRUZ de la version a l'air mieux. 😉
OriginalL'auteur RRUZ