引数TObjectからNameを取得するには

解決


まろ  2004-01-24 01:27:47  No: 6895

例えば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;


take  2004-01-24 01:38:09  No: 6896

NameプロパティはTComponentで定義されています。
そしてTEditやTLabel、TMemoはTComponentを継承していますので
TComponentでキャストするとうまく動くのではないでしょうか?


jok  2004-01-24 01:55:17  No: 6897

Tag に数値を入れておけば、 case TComponent(Sender).Tag of  で簡単に分かるよ


まろ  2004-01-24 01:56:58  No: 6898

うわ・・即決でした。またくだらない質問をしてしまったようで・・・
takeさんどうもありがとうございました。


まろ  2004-01-24 02:00:02  No: 6899

あわわ・・・。
リロードしたら・・・Nameではなくtagバージョンみたいな感じですね。
参考になります。jokさんありがとうございました。


るるとん@K  2004-01-24 02:54:58  No: 6900

case sender of
EditA:〜;
EditB:〜;
の方が分かりやすいのでは


jok  2004-01-24 02:57:31  No: 6901

るるとん@K さんへ

試してみました? case 文の文法を見てください。


えび  2004-01-24 03:39:35  No: 6902

普通に

if Sender = Edit1 then
  ・・・・
else
  ・・・・

で行けるかと...


にしの  2004-01-24 03:45:00  No: 6903

そう書くのが面倒だからということでは?


るるとん@K  2004-01-24 06:32:35  No: 6904

NameやTagを使用しなくてもSender自体をifやcaseで使えばいいです


jok  2004-01-24 06:55:37  No: 6905

> NameやTagを使用しなくてもSender自体をifやcaseで使えばいいです

if はともかく、case は型チェックもなしで使えるわけない。
そもそも順序型でもないし。動作するコードを見せてください。


にしの  2004-01-24 07:40:39  No: 6906

Senderでやる場合、2つの問題が発生します。
1.順序型でないSenderを、順序型に型変換。
2.定数式でないButton1などを、定数式に変換。

1はすぐに解決できますが、2は思いつきませんでした。
るるとん@Kさんには出来たのでしょうね。
後学のためコードを提示していただければ嬉しいのですが。


にしの  2004-01-24 07:42:05  No: 6907

失礼。上の発言は、caseでの場合です。
ifでの場合は、先述のとおり、煩雑で面倒ですから。


take  2004-02-03 22:57:24  No: 6908

フォームに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;


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

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






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