J'essaie de capturer lorsqu'un utilisateur appuie sur Ctrl kbd> + C kbd> afin de copier du texte dans le presse-papiers. Si l'utilisateur appuie délibérément et contient Ctrl kbd> ... puis appuie sur C kbd> il enregistrera. procedure <anObject>.KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (ssCtrl in Shift) and (upcase(Char(key)) = 'C')
then
begin
//Copy code
end;
end;
4 Réponses :
Ce n'est pas une séquence, c'est une combinaison clé. Cela signifie que CTRL et C doivent être pressés mais je devine. Je ne peux pas dire ce que l'utilisateur fait. Peut-être qu'il y a aussi un problème avec le clavier ou le pilote pour cela. P> Pour rendre compte de ce que Rob a dit (accepter accidentellement d'autres clés de décharge), modifiez votre code sur: P>
if (Shift = [ssCtrl]) and (Upcase(Char(Key)) = 'C') then
Je vais certainement faire changer = ... au lieu de la façon dont je l'ai fait. Merci pour le pointeur!
Ctrl + C est traduit en un message de caractère. Donc, vous feriez mieux d'utiliser un OnKeyPress CODE> Handler (qui est tiré en réponse à un wm_char code>):
: strong>
Je crois ce qui se passe est la suivante: lorsque vous appuyez rapidement sur "Ctrl", appuyez sur "CTRL", puis sur "C", puis relâche "Ctrl", relâchant enfin "C". Comme vous pouvez le constater lorsque la touche ONKEYUP pour 'C' est tirée, la touche "Ctrl" est déjà publiée. Vous n'aurez pas ce genre de problème avec le message traduit, si le système d'exploitation a enregistré la touche "Copie", alors onKeyPress sera tiré. P> p>
généralement, onKeyDown est plus préférable qu'on fonctionne pour un tel combo. Parce que les utilisateurs savent généralement appuyer sur ces touches de décalage avant la touche de charme, mais n'ont pas de sens strict dont une à libérer en premier. En outre, vous pouvez modifier la clé VaR sur 0 pour empêcher les clés d'être interprétées davantage par d'autres niveaux d'événements clés pour remplacer certains comportements par défaut. P>
Je n'avais pas envisagé cela, mais vous avez raison, il semble que ce soit comme un meilleur endroit pour mettre ce code
Procedure TForm1.StringGrid1KeyPress (Sender: TObject; var Key: Char);
Var
Sel: TGridRect; // Selecting the Scenes
St: String; // Stroke
R, c: word; // Row-Stroke, Col-Column
Begin
If Key = ^ C then
Begin
St: = ''; / / A full explanation of the structure
Sel: = StringGrid1.Selection; // Wait a while for a loose ticket
For r: = Sel.Top to Sel.Bottom do // query the lines of the first row
Begin
For c: = Sel.Left to Sel.Right do // query the number of lines in the foreground
// Scribble in the Stroke of a Distributor
If c = Sel.Right then St: = St + StringGrid1.Cells [c, r] else St: = St + StringGrid1.Cells [c, r] + # 9;
St: = St + # 13 # 10; // the pattern of the stencil
End;
ClipBoard.AsText: = St; // Displays the alarm
End;
End;
Avez-vous envisagé de définir simplement le raccourci code> de la propriété de l'élément de menu ou de l'action associée à cette commande? Ensuite, vous n'avez pas à vérifier chaque raccourci possible comme cela. Vous n'aurez pas non plus à vous soucier d'accepter accidentellement Ctrl + Shift + Alt + C lorsque vous ne vouliez que CTRL + C.
Je voudrais mais j'ai oublié de mentionner qu'il s'agit d'un composant de DevExpress. Cela ne me permet pas les mêmes options que des composants réguliers. Je garderai cela à l'esprit pour d'autres composants. Merci!
Si l'étrange chose à Delphi est, si l'ALT est pressé, puis contrôler, le contrôle de l'utilisateur ne tire pas, pas encore sûr pourquoi. Peut-être que Shift State peut être utilisé pour obtenir avec précision l'état de la clé de contrôle = D Nope toujours ne fonctionne toujours pas, c'est bizarre. Appuyez d'abord sur ALT, puis de déclencher des gestionnaires pour le contrôle ... Je suppose que l'alt est peut-être causant une sorte d'activation de VCL pour aller au contrôle suivant ou quelque chose d'étrange ou d'activation du menu de forme ou de quelque chose.
ou (msg.message = wm_sysykedown) aide.