例えばEditAとEditBがあるとします。
この2つのKeyPressイベントに同じ関数を指定した場合
procedure TMainForm.OnKeyPress(Sender: TObject; var Key: Char);
var
Item:TEdit;
begin
Item := TEdit(Sender); //・・・・※ここ
if (ItemE.Name = 'EditA') then begin
;
end
else if (ItemE.Name = 'EditB') then begin
;
end;
end;
等とすると、「今どっち?」というのがわかりますよね。
これと同じようにEdit、Label、Memo、ComboBoxにも同じ
関数を用意し「今どれ?」というのを判定したいんです。
しかし、※の部分をどうしてよいのかわかりません。
上記の例ではEditA、EditBと、同じコンポーネントだから納得できるんですけど、
コンポーネントが違う場合は何でキャストすればよいのでしょうか?
一応、試してみて、Label、Memoなどにも上記の関数を指定してやって、
EditでキャストしてもNameプロパティを参照する上で問題ないように見えましたが
LabelやMemoをEditでキャストするのはどうなんだろう??という疑問が残ってしまいます。特に問題ないのでしょうか?
EditA、EditBはEditコンポーネント
Memoはメモコンポーネントだとして・・・
procedure TMainForm.OnKeyPress(Sender: TObject; var Key: Char);
var
Item:TEdit;
begin
Item := TEdit(Sender); //Editでキャストしてるのに・・・
if (ItemE.Name = 'EditA') then begin
;
end
else if (ItemE.Name = 'EditB') then begin
;
end
//メモってどうなのかと・・・
else if (ItemE.Name = 'Memo') then begin
;
end;
end;
NameプロパティはTComponentで定義されています。
そしてTEditやTLabel、TMemoはTComponentを継承していますので
TComponentでキャストするとうまく動くのではないでしょうか?
Tag に数値を入れておけば、 case TComponent(Sender).Tag of で簡単に分かるよ
うわ・・即決でした。またくだらない質問をしてしまったようで・・・
takeさんどうもありがとうございました。
あわわ・・・。
リロードしたら・・・Nameではなくtagバージョンみたいな感じですね。
参考になります。jokさんありがとうございました。
case sender of
EditA:〜;
EditB:〜;
の方が分かりやすいのでは
るるとん@K さんへ
試してみました? case 文の文法を見てください。
普通に
if Sender = Edit1 then
・・・・
else
・・・・
で行けるかと...
そう書くのが面倒だからということでは?
NameやTagを使用しなくてもSender自体をifやcaseで使えばいいです
> NameやTagを使用しなくてもSender自体をifやcaseで使えばいいです
if はともかく、case は型チェックもなしで使えるわけない。
そもそも順序型でもないし。動作するコードを見せてください。
Senderでやる場合、2つの問題が発生します。
1.順序型でないSenderを、順序型に型変換。
2.定数式でないButton1などを、定数式に変換。
1はすぐに解決できますが、2は思いつきませんでした。
るるとん@Kさんには出来たのでしょうね。
後学のためコードを提示していただければ嬉しいのですが。
失礼。上の発言は、caseでの場合です。
ifでの場合は、先述のとおり、煩雑で面倒ですから。
フォームにEdit1、Edit2、Button1、Button2を配置して
以下のようにコードを書きました。
Edit1、Edit2、Button1、Button2のOnKeyPressイベントを
OnKeyPressAllに割り当てると望み通りの動作になりますが
Tagを使った方が無難ですね
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Edit2: TEdit;
procedure OnKeyPressAll(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private 宣言 }
FList : TList;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
tbl : array[0..3] of string = ('入力1','入力2','ボタン1','ボタン2');
implementation
{$R *.DFM}
procedure TForm1.OnKeyPressAll(Sender: TObject; var Key: Char);
begin
Caption := tbl[FList.IndexOf(Sender)];
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList.Create;
FList.Add(Edit1);
FList.Add(Edit2);
FList.Add(Button1);
FList.Add(Button2);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FList.Free;
end;
ツイート | ![]() |