お世話になります。
今、ListViewの行を削除するためにPOPUPメニューコンポーネントを使おうと思っております。
そこで、POPUPの設定でDeLキーにショートカットを指定したのですが、それとは無関係なEDITコンポーネント(FORM上に存在する)内の編集時のDELキーにも反応してしまい、ショートカットが優先されてしまいます。
EDITコンポーネント内での編集時は通常の編集としてDELキーを使用したいのですが、どうすればショートカットから切り離すことができるのでしょうか。
POPUPMENUは使ったことないので良くわかりませんが。
どこかでDeleteKeyを押されたときにMenuItemに対する処理が
書かれているんですよね。
ならば
if Key = VK_Delete then
begin
if GetForcus <> Edit1.Handle then
begin
//ポップアップの処理
Word(#0);//←これ。
end;
end;
ってのはどうでしょうか?
駄目かな?
どうなっているかというと、Form上にTListViewが1つ、TPouupMenuが1つ、TEditが1ある状態で考えてください。
ListViewのPopupMenuプロパティに、PopupMenuコンポーネントを設定しています。さらに、PopupMenuのShortCutプロパティにDELキーを割り当てています。処理自体は、PopupMenuのアクションから飛ばしています。
ですので、DELキーを押された時というのが隠蔽されて(?)いて、自動的にショートカットとしての動作に行ってしまうのです。
自分でキーが押されたイベントを判断して不要なイベントを捨てるしかないのかな?
ショートカットは使わず、以下の用にすることで解決できました。ありがとうございました。
ショートカット使っても、こうすればできる等ありましたら追記していただけると幸いです。
procedure TForm1.LViewKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Sender is TListView) and (Key = VK_DELETE) then
//削除時の処理;
end;
全然当たってませんでしたね。m(__)m
さてさて、どうしたもんでしょうか。
①Edit1にフォーカスがある時にPopUpが不要ならその場合だけTPopUpMenuを無効にしてしまう。
②混乱してしまいそうなShortCutを他に変える。
(でも、意味あってそうしてらっしゃるのでしょうね)
③実行時にShortCutを設定(TextToShortCut)する。
Edit1の各イベントで
OnEnter
xxx.ShortCut := ShortCut(Word(#0),[]);
OnExit
xxx.ShortCut := ShortCut(Word(VK_DELETE),[]);
④・・・・
う〜む。
あっと、解決したのですね。
確かに、PopUp使わなくても良いなら、そいった解決策もあるのかな。(;_;)
ちなみに、Popupは併用です。
Popupの処理用に関数を作成していたので、KeyUpからもそこに飛ばすようにしました。
ここをもう一度読んでいただけていたらですが、Word(#0);を実行するとどうなるのか教えていただけたらと思います。
なるほど、①の手がありますね。
でも、ショートカットの設定は生きたままなのかしら。ショートカットを削除してしまえばよい?
なんだか、逆にスマートじゃなくなってきそうなので、ショートカットはやめてKeyUpイベントを使う方にしたいと思います。
ありがとうございました。
>確かに、PopUp使わなくても良いなら
すいません、これは間違ってますね。ショートカットですね。
で、
>Word(#0);
この時点で、Key(メッセージ!?)が無効というか初期化されるというか
(表現が変ですが気持ちわかりますよね。)になります。
私は良く使います。
たとえばEnterなどでKeyを次のEditにFocusする際(DOS的な使い方)
何もしないと音がしますよね。
で、KeyPressなどで
if Key = Chr(VK_Return) then
begin
//処理処理
Key := #0;//KeyDown等のときはWord(#0)
end;
他、当たり前と言ったら当たり前で申し訳ないのですが、期待した
動作後に標準の動作をしてしまって、うっとうしい場合なども処理後
の最後に加えて使用します。
>ShortCut(Word(#0),[]);
は、Key割り当てを行ってないことになります。
Word(#0):キーのnull値みたいなイメージですかね。キーバッファのクリア?いずれにしろそんな感じですね。
いろいろお勉強になりました。ありがとうございました。また困った際はよろしくお願いいたします。
ツイート | ![]() |