以前から使っている自作プログラムなのですが、TRadioGroupでOnKeyDown,PnkeyPressedなどのキーボード操作関係のイベントを拾う方法はないでしょうか?
コンポーネント作成でなければ
http://migaro.co.jp/contents/support/ml/backnumber/101.txt
さっそくありがとうございます。
ご指摘のようにやってみましたが、うまくいきません。そこで、何もコンポーネントのないフォームを1枚作って試すとうまく拾えますが、何かしらコンポーネントを置くと拾えません。
Delphiのバージョンにもよるのでしょうか? Delphi6でやっています。
TForm.KeyPreview = True ですか?
> TForm.KeyPreview = True
明示的に設定したら拾えるようになりました。ただ、ひとつのフォームにTRadioGroupが複数ある場合、どのコンポーネントでイヴェントが発生したかを区別する方法が見つかりません。
> どのコンポーネントでイヴェントが発生したかを区別する方法が見つかりません。
ActiveControlが分かるんだから、それは自明だと思うけど?
これで伝わりますか?
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ActiveControl.ClassName = 'TGroupButton' then
case Key of
//RadioGroup を操作
VK_RETURN:with TRadioGroup(ActiveControl.Parent) do
ShowMessage(Items[ItemIndex]);
//ボタン自体を操作
VK_ESCAPE:TRadioButton(ActiveControl).Checked:=False;
end;
end;
それが、TeditだとActiveControl.Nameでコンポーネント名が帰ってくるのですが、Tradiogroupだと名前が帰ってこないところで考え込んでいます。
せっかくの回答のどこを見てるの?
ぜんぜん見てないんじゃない?
ちゃんとActiveControl.Parentって書いてあるのに。
こっちのほうがわかりやすいか?
type
TForm3 = class(TForm)
RadioGroup1: TRadioGroup;
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
procedure RadioGroupKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I:=0 to RadioGroup1.Items.Count -1 do
begin
RadioGroup1.Buttons[I].OnKeyDown := RadioGroupKeyDown;
end;
end;
procedure TForm3.RadioGroupKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Exit;
end;
いろいろ教えていただいた方法に従って、思い通りの動作をさせることができました。ありがとうございました。
ツイート | ![]() |