2016-11-21 3 views
6

Je tente de créer un bouton personnalisé à partir d'un composant TPanel. Pour cela, j'ai fourni un override pour les événements onmousedown et onmouseup (pour faire un peu de dessin), et j'ai utilisé l'événement onclick pour gérer les clics.Impossible d'intercepter tous les clics lors de l'utilisation des événements onmousedown, onmouseup et click

Malheureusement, si je clique rapidement sur mon panneau, tous les autres clics sont "perdus", mais je n'arrive pas à comprendre pourquoi.

Même le plus simple des exemples échoue à cet égard. J'ai créé une nouvelle application VCL, ajouté une zone de liste, un panneau, et mis à exécution les événements comme suit:

procedure TForm1.Panel1Click(Sender: TObject); 
begin 
    listbox1.Items.Add('click'); 
end; 

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    listbox1.Items.Add('mouse down'); 
end; 

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    listbox1.Items.Add('mouse up'); 
end; 

Le résultat se présente comme suit:

mouse down 
click 
mouse up 
mouse down 
mouse up 

... etcetera Chaque deuxième clic est pas pris en compte mais je ne sais pas pourquoi.

Quelqu'un peut-il expliquer cela s'il vous plaît?

Répondre

9

Votre panneau traite les doubles-clics lorsque vous cliquez rapidement dessus. utiliser:

Panel1.ControlStyle := Panel1.ControlStyle - [csDoubleClicks] 

pour mapper les doubles-clics en clics. (dans votre ensemble de contrôle personnalisé ControlStyle dans son constructeur).

csDoubleClicks Le contrôle peut recevoir et répondre à double-cliquez sur messages. Sinon, mappez les doubles-clics en clics.

Voir TControl.ControlStyle