コードでコンポーネントを追加するには?

解決


超初心者  2004-03-28 10:32:55  No: 7965

超初心者です。すみません、教えて下さい。
例えば、フォームにボタンを置いて、そのボタンをクリックするとフォームにラベルが追加されるようにするにはどうすればいいですか?


jok  2004-03-28 10:46:52  No: 7966

こんな感じです。

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    MyLabel:TLabel;  // 手書きで追加
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyLabel := TLabel.Create(self);
  MyLabel.Parent := self;
  MyLabel.Left := 10;
  MyLabel.Top := 10;
  MyLabel.Caption := 'コードで作成しました';
end;


るるとん@K  2004-03-28 18:54:01  No: 7967

MyLabelを操作するときは
if not MyLabel=nil then
という風にしたほうが無難です
Ownerが設定されていますので、アプリ終了でかってに解放してくれます


るるとん@K  2004-03-28 18:56:40  No: 7968

>MyLabelを操作するときはif not MyLabel=nil then
作成後、別のボタンで文字を変えたりする時の事で上のソースでは不要ですよ


jok  2004-03-28 19:25:11  No: 7969

> if not MyLabel=nil then

そうですね。OnCreate イベントハンドラのように最初に1回だけ必ず実行される
ハンドラで作成されたならその後の確認は不要だと思いますが、そうでない場合は
インスタンスに有無を確認してから操作すべきですね。普通は

if Assigned(MyLabel) then 

とすると思います。


るるとん@K  2004-03-28 22:27:30  No: 7970

そんな関数があったとは知らなかった..


超初心者  2004-03-29 23:24:30  No: 7971

jokさん、るるとん@Kさんありがとうございます。
返信が遅くなりすみません。

jokさんのコードできましたが、

> if not MyLabel=nil then
とすると、
この型には指定した演算子は使えません
とエラーがでます。

> if Assigned(MyLabel) then
とすると、Button1をクリックしてもラベルが追加されません。

すみません、教えて下さい。
6 Personalを使用してます。


jok  2004-03-29 23:40:46  No: 7972

こういうふうに使います。

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    MyLabel:TLabel;  // 手書きで追加
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyLabel := TLabel.Create(self);
  MyLabel.Parent := self;
  MyLabel.Left := 10;
  MyLabel.Top := 10;
  MyLabel.Caption := 'コードで作成しました';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(MyLabel) then
    MyLabel.Caption := 'キャプションを変更しました';
end;

Button1 を押してから、Button2 を押すと Caption が変更されます。
起動してすぐに、Button2 を押してもエラーにならないのは

if Assigned(MyLabel) then

で、MyLabel が作られているかどうか判断しているからです。


通りすがり(仮)  2004-03-29 23:43:06  No: 7973

if not (MyLabel1 = nil) then

こんな感じ。


jok  2004-03-29 23:45:53  No: 7974

Button1 を何回おしても、最初の一回だけ MyLabel をつくるには

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(MyLabel) then exit;
  MyLabel := TLabel.Create(self);
  MyLabel.Parent := self;
  MyLabel.Left := 10;
  MyLabel.Top := 10;
  MyLabel.Caption := 'コードで作成しました';
end;

とします。

if Assigned(MyLabel) then exit;

これの意味は、MyLabel が既につくられていたら、以下を実行しないですぐに
終了する、ということです。


超初心者  2004-03-30 00:10:08  No: 7975

jokさん、通りすがり(仮)さんありがとうございます。

るるとん@Kさんが、
>>MyLabelを操作するときはif not MyLabel=nil then
>作成後、別のボタンで文字を変えたりする時の事で上のソースでは不要ですよ
と書き込みされているのにButton1Clickに if Assigned(MyLabel) then を記述してました。

Button2を追加してやってみました。できました。

通りすがり(仮)さんが書き込みしてくださった
> if not (MyLabel1 = nil) then
もできました。

jokさん、るるとん@Kさん、通りすがり(仮)さん誠に有り難うございました。
これからコードエディタでF1を押しまくって勉強します。


超初心者  2004-03-30 00:15:05  No: 7976

jokさんありがとうございます。

順番が逆になりましたが、
>Button1 を何回おしても、最初の一回だけ MyLabel をつくるには
ができると思い、Button1Clickに if Assigned(MyLabel) then を記述してました。


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

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






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