一つの変数に別々のクラス(オブジェクト)を割り当てるには?

解決


東海岸  2004-12-23 03:28:15  No: 12452  IP: [192.*.*.*]

通常は下記のように"var"にクラスを記述しますが、これを"Sender"のクラスを持つ変数(?)を作成することはできないものでしょうか?  

procedure TForm1.RadioGroup1Click(Sender: TObject);
var TSumClass: TButton; //<--通常ここに定義しますが、なしでできないか?
begin
    TSumClass := 'Sender'のクラス(オブジェクト); //<--ここで定義
    以降、'Sender'がTButton(NameはBtn1)ならTSumClass.Caption  := 'abc'
         ,TOpenDialog(NameはOpenDialog1)なら
           w1 := TSumClass.FileName 等の記述が可能
end;
//- - - - - - - - - - - - - - - - - - - - - - - - - 
下記ステップでNameとClassNameがわかるので、できそうな気がするのですが?
     wName  := Tform1(Sender).name ;
     wClass := Tform1(Sender).classname ;

編集    削除
西海岸  2004-12-23 04:00:16  No: 12453  IP: [192.*.*.*]

(Sender as TButton).name
って事ですかね?

編集    削除
TtPIPICH  2004-12-23 04:07:29  No: 12454  IP: [192.*.*.*]

こんなかんじ?
procedure TForm1.Button1Click(Sender: TComponent);
var
AClass:TComponentClass;
AObject:TObject;
begin

AClass:=TComponentClass(Sender.ClassType);
ShowMessage(AClass.ClassName);
AObject:=AClass.Create(Self);

if AObject is TButton then
begin
TButton(AObject).Top:=0;
TButton(AObject).Left:=0;
TButton(AObject).Parent:=Self;
end;

end;

編集    削除
TtPIPICH  2004-12-23 04:08:47  No: 12455  IP: [192.*.*.*]

すみません
TForm1.Button1Clickは間違いです
正しくは新しく定義した手続きです。

編集    削除
東海岸  2004-12-23 05:23:56  No: 12456  IP: [192.*.*.*]

西海岸さん、TtPIPICHさん  ご返答ありがとうございます。
TtPIPICHさんの返答の中で、>if AObject is TButton then がありますが、べつのオブジェクト(TOpenDialog等)の場合も考えて 'TButton' の部分も
変数にできないでしょうか?

編集    削除
HOta  2004-12-23 05:26:13  No: 12457  IP: [192.*.*.*]

何がしたいかを書いた方が、いろいろな答えが得られるのではないでしょうか?

編集    削除
TtPIPICH  2004-12-23 05:27:29  No: 12458  IP: [192.*.*.*]

if AObject is TButton then
begin...end
else
if AObject is TOpenDialog then
begin...end
では無理ですか?

編集    削除
東海岸  2004-12-23 23:11:34  No: 12459  IP: [192.*.*.*]

どうも質問の内容が曖昧だったようで申し訳ありません。
たとえば、自作のコンポーネント'TwBotton','TwLabel',
'TwImage'がありそれぞれ first,secound,therd とゆうプロ
パティを持っているとします。そしてフォームのボタン
が押されたとき、これら3つのプロパティをプログラム
から変更しようとしたとき、
Sel:TComponentが現在選択されているコンポーネントだ
とすると,

if Sel is TwBotton then 
  TwBotton(Sel).first := '******'
  TwBotton(Sel).secound := '+++++'
  TwBotton(Sel).therd := '?????'
else
if Sel is TwLabel then 
  TwLabel(Sel).first := '******'
  TwLabel(Sel).secound := '+++++'
  TwLabel(Sel).therd := '?????'
else
if Sel is TwImage then 
  TwImage(Sel).first := '******'
  TwImage(Sel).secound := '+++++'
  TwImage(Sel).therd := '?????';

となり変更は可能ですが、コンポーネントが増えた場合
 if文 がひたすら増えることになります。
これを回避したい、とゆうことでした。

編集    削除
TtPIPICH  2004-12-24 01:44:27  No: 12460  IP: [192.*.*.*]

Delphiはオブジェクト指向なので継承というすばらしい手段があります。

TMyClass=Class(TComponent)
public
First,Secound,Third:string;
end;

TMyClassA=Class(TMyClass)
public
OnlyA:integer;
end;

TMyClassB=Class(TMyClass)
public
OnlyB:integer;
end;

TMyClassC=Class(TMyClass)
public
OnlyC:integer;
end;

この例ではTMyClassA..CはすべてTMyClassでキャストできます。
但しその場合扱えるのは共通のプロパティだけです。

詳しくはヘルプを..

編集    削除
東海岸  2004-12-24 05:30:16  No: 12461  IP: [192.*.*.*]

TtPIPICHさん、ありがとうございます。
この方法でやってみます。

編集    削除