いつもお世話になっています。Terry(寺田)たまに「まも」ですm(_ _)m
ユーザーがショートカットに「Ctrl+H」を割り当て、そのアクションが無効になっていて
TEdit にフォーカスがあるときデフォルトの BackSpace が発生します
(以下最小コードです)
procedure TForm1.FormCreate(Sender: TObject);
begin
Action1.ShortCut:=TextToShortCut('Ctrl+H');
end;
procedure TForm1.Action1Update(Sender: TObject);
begin
(Sender as TAction).Enabled:=Edit1.Text='';
end;
procedure TForm1.Action1Execute(Sender: TObject);
begin
//当該ソフトではここでツリーノードの移動をしています
Edit1.Text:='Hoge';
Edit1.SelStart:=4;
end;
そのユーザーの望むところは無効になっているときは「何もしないでほしい」なのですが
BS として働いて欲しい人もいると思いますし OnUpdate を無くすとメニューやボタンの表示に支障が出るしで
「Ctrl+H」飛んできたら登録されているショートカット全部調べて……とかするしかないのでしょうか?
「Ctrl+M」とかは影響出るコントロール無いだろうなとか(p_q )
以上、よろしくお願いいたしますm(_ _)m
//Action2 は ActionManagerに登録のみで表示させない
//CheckBox1 True 任意の動作 False 何もしない
//CheckBox2 True CheckBox1 の動作 False Default動作
procedure TForm3.Action1Execute(Sender: TObject);
begin
//任意の動作
Edit1.Text:='Hoge';
Edit1.SelStart:=4;
end;
procedure TForm3.Action2Execute(Sender: TObject);
begin
//何もしない
Exit;
end;
procedure TForm3.CheckBox1Click(Sender: TObject);
begin
Action1.Enabled := CheckBox1.Checked;
Action1.Update;
if CheckBox2.Checked = True then
begin
if CheckBox1.Checked = False then
begin
Action1.ShortCut:=0;;
Action2.ShortCut:=TextToShortCut('Ctrl+H');
end
else
begin
Action1.ShortCut:=TextToShortCut('Ctrl+H');
Action2.ShortCut:=0;;
end;
end
else
begin
Action1.ShortCut:=0;;
Action2.ShortCut:=0;;
end;
end;
KHE00221 さんお返事ありがとうございます
何もしないダミー Action に飛ばしてしまうのですね
ショートカットを登録できる Action が多数あるため
登録されたときに「Ctrl+H」だけ探してここへ飛ばせばいいんですね
あ、それより(ちょっと最近飲んでる薬の副作用で頭が回らないのです(x.x))
全てのAction.OnUpdateで一度外の関数に飛ばして
function CheckCtrlH(Action:TAction):Boolean;
これが True なら関数の中で処理して False なら通常の Enabled 処理
といっった感じでしょうか
あとで試してみたいと思います
ツイート | ![]() |