通常は下記のように"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 ;
(Sender as TButton).name
って事ですかね?
こんなかんじ?
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;
すみません
TForm1.Button1Clickは間違いです
正しくは新しく定義した手続きです。
西海岸さん、TtPIPICHさん ご返答ありがとうございます。
TtPIPICHさんの返答の中で、>if AObject is TButton then がありますが、べつのオブジェクト(TOpenDialog等)の場合も考えて 'TButton' の部分も
変数にできないでしょうか?
何がしたいかを書いた方が、いろいろな答えが得られるのではないでしょうか?
if AObject is TButton then
begin...end
else
if AObject is TOpenDialog then
begin...end
では無理ですか?
どうも質問の内容が曖昧だったようで申し訳ありません。
たとえば、自作のコンポーネント'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文 がひたすら増えることになります。
これを回避したい、とゆうことでした。
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でキャストできます。
但しその場合扱えるのは共通のプロパティだけです。
詳しくはヘルプを..
TtPIPICHさん、ありがとうございます。
この方法でやってみます。
ツイート | ![]() |