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

解決


東海岸  2004-12-23 03:28:15  No: 12452

通常は下記のように"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

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


TtPIPICH  2004-12-23 04:07:29  No: 12454

こんなかんじ?
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

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


東海岸  2004-12-23 05:23:56  No: 12456

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


HOta  2004-12-23 05:26:13  No: 12457

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


TtPIPICH  2004-12-23 05:27:29  No: 12458

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


東海岸  2004-12-23 23:11:34  No: 12459

どうも質問の内容が曖昧だったようで申し訳ありません。
たとえば、自作のコンポーネント'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

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

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


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

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






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