ショートカットのイベントとeditコンポーネント内のイベントを切り分けるには?

解決


みみ  2005-12-26 22:11:54  No: 19397

お世話になります。

今、ListViewの行を削除するためにPOPUPメニューコンポーネントを使おうと思っております。
そこで、POPUPの設定でDeLキーにショートカットを指定したのですが、それとは無関係なEDITコンポーネント(FORM上に存在する)内の編集時のDELキーにも反応してしまい、ショートカットが優先されてしまいます。

EDITコンポーネント内での編集時は通常の編集としてDELキーを使用したいのですが、どうすればショートカットから切り離すことができるのでしょうか。


Syake  2005-12-26 22:55:20  No: 19398

POPUPMENUは使ったことないので良くわかりませんが。
どこかでDeleteKeyを押されたときにMenuItemに対する処理が
書かれているんですよね。
ならば
if Key = VK_Delete then
begin
   if GetForcus <> Edit1.Handle then
   begin
      //ポップアップの処理 
      Word(#0);//←これ。
   end;
end;
ってのはどうでしょうか?
駄目かな?


みみ  2005-12-27 00:09:06  No: 19399

どうなっているかというと、Form上にTListViewが1つ、TPouupMenuが1つ、TEditが1ある状態で考えてください。
ListViewのPopupMenuプロパティに、PopupMenuコンポーネントを設定しています。さらに、PopupMenuのShortCutプロパティにDELキーを割り当てています。処理自体は、PopupMenuのアクションから飛ばしています。
ですので、DELキーを押された時というのが隠蔽されて(?)いて、自動的にショートカットとしての動作に行ってしまうのです。
自分でキーが押されたイベントを判断して不要なイベントを捨てるしかないのかな?


みみ  2005-12-27 00:36:02  No: 19400

ショートカットは使わず、以下の用にすることで解決できました。ありがとうございました。
ショートカット使っても、こうすればできる等ありましたら追記していただけると幸いです。

procedure TForm1.LViewKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Sender is TListView) and (Key = VK_DELETE) then
    //削除時の処理;
end;


Syake  2005-12-27 01:21:10  No: 19401

全然当たってませんでしたね。m(__)m

さてさて、どうしたもんでしょうか。
①Edit1にフォーカスがある時にPopUpが不要ならその場合だけTPopUpMenuを無効にしてしまう。
②混乱してしまいそうなShortCutを他に変える。
  (でも、意味あってそうしてらっしゃるのでしょうね)
③実行時にShortCutを設定(TextToShortCut)する。
  Edit1の各イベントで
  OnEnter
    xxx.ShortCut := ShortCut(Word(#0),[]);
  OnExit
    xxx.ShortCut := ShortCut(Word(VK_DELETE),[]);
④・・・・
う〜む。


Syake  2005-12-27 01:25:24  No: 19402

あっと、解決したのですね。
確かに、PopUp使わなくても良いなら、そいった解決策もあるのかな。(;_;)


みみ  2005-12-27 02:15:46  No: 19403

ちなみに、Popupは併用です。
Popupの処理用に関数を作成していたので、KeyUpからもそこに飛ばすようにしました。

ここをもう一度読んでいただけていたらですが、Word(#0);を実行するとどうなるのか教えていただけたらと思います。


みみ  2005-12-27 02:19:04  No: 19404

なるほど、①の手がありますね。
でも、ショートカットの設定は生きたままなのかしら。ショートカットを削除してしまえばよい?
なんだか、逆にスマートじゃなくなってきそうなので、ショートカットはやめてKeyUpイベントを使う方にしたいと思います。

ありがとうございました。


Syake  2005-12-27 02:38:20  No: 19405

>確かに、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割り当てを行ってないことになります。


みみ  2005-12-27 04:26:02  No: 19406

Word(#0):キーのnull値みたいなイメージですかね。キーバッファのクリア?いずれにしろそんな感じですね。

いろいろお勉強になりました。ありがとうございました。また困った際はよろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加