コントロールの動的生成について


まさ  2018-10-09 04:18:05  No: 49557

コンポーネントの動的生成時に下記のような構文がよくありますが
このTButtonの部分を文字列で代入することは出来ないでしょうか?

 with TButton.Create(Self) do begin

var s:string;
s:='tmemo';

 with (s).Create(Self) do begin


通りすがり  2018-10-09 07:43:35  No: 49558

これですか?

System.Classes.FindClass - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.Classes.FindClass


まさ  2018-10-10 00:50:31  No: 49559

通りすがり様、ありがとうございます。

まさにそれです!!ありがとうございます。

早速やってみたところ、それを使うには下記のように宣言が必要で
今度はRegisterClassesの下記のtmemoの部分をstring型で登録する方法を模索しないといけない状態になってしまいました(>_<)

RegisterClasses([tmemo, TForm]);

TPersistentClassに tmemoを文字列し、下記のような感じで利用したく思っております。

https://stackoverflow.com/questions/701049/is-there-a-way-to-instantiate-a-class-by-its-name-in-delphi/701080

おわかりになりますでしょうか。


通りすがり  2018-10-10 01:40:18  No: 49560

何をしたいのかがよくわからないのですが、結局作るクラスそのものはどこかに存在しなければならないのは当然のこととして、その*クラス参照*を

System.Classes.RegisterClass - RAD Studio API Documentation
http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.Classes.RegisterClass

で登録しておく必要がある、ということなわけですが、さてあなたの"TMemo"はどのユニットにあるどのTMemoクラスなんですか?
この問題を解決できないので、
> RegisterClassesの下記のtmemoの部分をstring型で登録する方法
ってのは難しいと思いますね。一番簡単なのは必要なコンポーネントを全種類一つずつフォームに貼っちゃうことかな?


AAA  2018-10-10 11:23:06  No: 49561

S := 'TBUTTON';
    with S.Create(Self) do

いちおうできるんだけど・・・・・・・

  TStringHelper = record helper for String
  private
    function Create(AOwner: TComponent): TControl;
  end;

function TStringHelper.Create(AOwner: TComponent): TControl;
var
  CRef : TPersistentClass;
begin
  CRef := GetClass(Self);
  if CRef<>nil then
  begin
     Result := TControl(TControlClass(CRef).Create(AOwner));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    S: String;
begin

    RegisterClasses([TButton]);

    begin
      Parent := Form4;
      Width  := 150;
      Height := 30;
      Left := 100;
      Top := 100;
      Caption := 'BUTTON';   //TControl にCaption が無い為 Formに設定される
    end;
end;

function Create(AOwner: TComponent): TControl;
なので
    with S.Create(Self) do
以下で設定できるので TControl のプロパティのみ
TWinControlにすれば TWinControl (ちょっとふえるかも)

with TButton(S.Create(Self)) do
のように TButtonで囲むか

function Create(AOwner: TComponent): TButton;
にすれば TButton のプロパティも設定できるが、汎用性はなくなる

Sの内容によって 返り値の型を変えるって事ができないから


AAA  2018-10-10 11:24:45  No: 49562

抜けてた

procedure TForm4.Button1Click(Sender: TObject);
var
    S: String;
begin

    RegisterClasses([TButton]);

    S := 'TBUTTON';
    with S.Create(Self) do
    begin
      Parent := Form4;
      Width  := 150;
      Height := 30;
      Left := 100;
      Top := 100;
      Caption := 'BUTTON';   //TControl にCaption が無い為 Formに設定される
    end;
end;


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








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