2016-12-03 16 views
0

A. VCLフォームアプリケーションを作成します。TForm.OnKeyDownのKeyPreviewでのキー処理は、TListBoxで動作しません。

enter image description here

C.設定フォームのKeyPreviewプロパティTrueへ:

enter image description here

B.は、たとえば、フォーム上にTListBoxコンポーネントを入れて、デザイン時にいくつかの項目に記入します

D.フォームのOnKeyDownイベントハンドラでは、次のコードを記述してください。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
    if Key = VK_BACK then 
    begin 
    if ListBox1.Focused then 
    begin 
     Key := 0; 
     CodeSite.Send('ListBox1 is focused!'); 
    end; 
    end; 
end; 

E.プログラムを実行し、それをクリックすることでItem5を選択:

enter image description here

今ListBox1がフォーカスを持っています。

F.これで、「バックスペース」キーを押します。おそらく、フォームのOnKeyDownイベントハンドラーのKey := 0;を設定すると、BackspaceキーがListBox1コントロールによって処理されないようにブロックする必要があります。しかし、これはあなたが見ることができるように、動作しません:BackSpaceキーはItem5からアイテム1に選択を変更させ:

enter image description here

それでは、どのように私は集中ListBoxコントロールに処理されてからBackSpaceキーを防ぐことができますし、リストボックスの選択を変更するには?

デルファイ10.1ベルリンアップデート2
のWindows 7のx64 SP1

+0

WM_GETDLGCODE –

+1

について読む@DavidHeffernan:あなたはそのメッセージから何を返すことを提案しますか?バックスペースキーストロークを無視するというフラグはありません。 'DLGC_WANTALLKEYS'フラグや' DLGC_WANTCHARS'フラグを無効にする、あるいは 'DLGC_WANTMESSAGE'フラグを有効にすることを考えていますか?あなたはより具体的にする必要があります。 –

+1

TranslateMessageはメッセージループのDispatchMessageの前に呼び出されるため、WM_CHAR(WM_KEYDOWNから変換されたもの)をリストボックスに投稿することはできません。したがって、レミーの答え.... –

答えて

2

代わりOnKeyPressイベントを使用します。

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    if Key = #8 then 
    begin 
    if ListBox1.Focused then 
    begin 
     Key := #0; 
     CodeSite.Send('ListBox1 is focused!'); 
    end; 
    end; 
end; 

あなたはいつもOnKeyDownのすべてをブロックすることはできません。

+0

ありがとう、それは動作します。しかし、これは素晴らしいことです。「OnKeyDown」が**発生する前に** OnKeyPress'であり、 'OnKeyDown'でALTHOUGH' Key'が明示的にゼロに設定されていると、 'OnKeyPress'というイベントが呼び出されます!私はいつも 'BACKSPACE'のようなキーは' OnKeyPress'を引き起こさないと確信していました。 – user1580348

+0

通常、 'OnKeyDown'がキーを拒否した場合、' OnKeyPress'は呼び出されません。私の答えは、** OnKeyDown'の代わりに 'OnKeyPress' **を使うことになっています。いずれの場合でも、 'OnKeyDown/Up'の' Key'は*仮想キーコード*ですが、 'OnKeyPress'の' Key'は*翻訳された文字*なので、常に同じ値であるとは限りません(この場合、 )です。 –

+0

不思議なことに、 'OnKeyDown'の' Key:= 0; 'で' HOME'キーと 'END'キーをブロックすると、これらのキーでOnKeyPressイベントがトリガーされません。どうして?なぜこれらのキーのこの異なる扱いですか? – user1580348

関連する問題