2011-08-12 9 views
10

クリップボードにテキストをコピーするためにCtrl + Cを押したときにキャプチャしようとしています。ユーザーが故意にCtrlを押して保持している場合は、Cを押して登録します。Delphi:ユーザーがシーケンスをあまりに速く押すとCtrl + Cをキャプチャできない

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; 

これが発生している理由はありますか?

ありがとうございます!

+10

メニュー項目またはそのコマンドに関連付けられたアクションの 'Shortcut'プロパティを設定したとお考えですか?次に、手動で可能なショートカットを手動で確認する必要はありません。 Ctrl + Cだけが必要なときに、誤ってCtrl + Shift + Alt + Cを受け入れることについても心配する必要はありません。 –

+0

私はこれがDevExpressコンポーネントだと言及するのを忘れました。私には通常のコンポーネントと同じオプションはありません。私は他のコンポーネントのことを念頭に置いておきます。ありがとう! – CodeSlinger512

答えて

19

はCtrl + C:ロブは(誤って他のシフトキーを受け入れる)言ったことを考慮して


は、にあなたのコードを変更します。

procedure <anObject>.KeyPress(Sender: TObject; var Key: Char); 
begin 
    if Key = ^C then 
    begin 
     // Copy code 
    end; 
end; 


アップデート:私は何が起こっていると考えている はこれです:だから、より良い(WM_CHARに応じて発射される)OnKeyPressハンドラを使用素早く押すと、ユーザーが「Ctrlキー」を押していると、 'C'を押してから 'Ctrl'を離し、最後に 'C'を離します。 「C」のOnKeyUpが起動されたときに表示されるように、「Ctrl」キーはすでにリリースされています。 OSが 'コピ​​ー'キーを登録してからOnKeyPressを起動すると、翻訳されたメッセージにこの種の問題はありません。

2

これはシーケンスではなく、キーの組み合わせです。これは、CtrlとCを同時にを押す必要があることを意味します。ユーザーがそれをしないと、Ctrl + Cとしてキャプチャーすることはできません。

しかし、私は推測しています。私はユーザーが何をしているのか分からない。おそらくキーボードやドライバの問題もあります。文字メッセージに変換され

if (Shift = [ssCtrl]) and (Upcase(Char(Key)) = 'C') then 
+0

私は間違いなくShift = ...をやっています。ポインタありがとう! – CodeSlinger512

4

通常、このようなコンボの場合、OnKeyDownがOnKeyupよりも優先されます。ユーザーは通常、そのシフトキーをcharキーの前に押すことを知っていますが、最初に解放する厳密な感覚はありません。また、varキーを0に変更すると、他のレベルのキーイベントによってキーをさらに解釈して、デフォルトの動作を無効にできなくなります。

+0

私はそれを考慮していませんでしたが、正しいです、OnKeyDownはこのコードを置くのに良い場所のようです。 – CodeSlinger512

0
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; 
+1

ここに投稿したコードを説明してください... –

関連する問題