プログラムで作った、ボタンってどうやってクリアするの?

解決


スパムちゃんVV  2010-09-28 08:36:04  No: 39239

プログラムでボタンを作る事はできたのですが・・・、

たとえば、ボタンを押すと、プログラム的にラベルを100個作ったとします。
位置も重ならないようにずらします。

ただ、このボタンをもう一度押すと、再度ラベルが100個できるって事ですよね?
3回押せば、300のラベルが。(まぁ、同じ位置にすれば、200は下に隠れる事になると思うのですが。

プログラムで作ったラベルって、どうやって消せばいいんでしょうか?
ご教授お願い致します。


Delphi大好き  2010-09-28 11:10:03  No: 39240

以下のサンプルででどうでしょうか?
一つ目のボタンを押すと10個のラベルを生成し、
二つ目のボタンを押すと生成したラベルを消します。

procedure TForm1.Button1Click(Sender: TObject);
var
  Labels:TLabel;
  i:integer;
begin
  i := 0;
  while 10 > i do begin
    Labels := TLabel.Create(self);
    Labels.parent := self;
    Labels.Top :=100 + (i * 20);
    Labels.Left := 10;
    Labels.Caption := 'L' + inttostr(i);
    labels.Name := 'L' + inttostr(i);
    i := i + 1;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Lables: TComponent;
  i:integer;
begin
  i := 0;
  while 10 > i do begin
    Lables := FindComponent('L' + inttostr(i));//動的に生成したコンポーネントを探す
    if Lables <> nil then//コンポーネントが見つかった場合
      Lables.free;//解放する
    i := i + 1;
  end;
end;


tor  2010-09-29 01:37:50  No: 39241

> ただ、このボタンをもう一度押すと、再度ラベルが100個できるって事ですよね?
> 3回押せば、300のラベルが。(まぁ、同じ位置にすれば、200は下に隠れる事になると思うのですが。
ここだけ読むと、ボタンが押されたかどうか覚えておいて2回目以降は何もしなければいいのではないか、と思うのですが。

まあ、一番簡単で確実なのは、自分で作ったものは自分で覚えておくことです。
配列を使ってもいいですが、TObjectListを使うと便利です。

たとえばクラスのフィールドとして
  private
    FLabels: TObjectList;
とでも定義しておいて、フォームの初期化処理(コンストラクタかOnCreate)で
  FLabels := TObjectList.Create(true); // trueを指定すると、オブジェクトを自動的に解放する
としてリストを作成します。(終了処理でこのリストをFreeするのを忘れずに)

ラベルを生成したらそれをリストに入れておきます。
  for i := 0 to 99 do
  begin
    lbl := TLabel.Create(Self);
    ...
    FLabels.Add(lbl);
  end;

こうしておけば、生成したラベルを削除するのは簡単にできます。
  FLabels.Clear; // リストに入っているラベルをすべて解放
(すべて削除したくない場合は、消したい要素だけ選んでRemoveしていきましょう)


D  2010-09-29 04:53:45  No: 39242

こんな手もあります。

  private
    { Private 宣言 }
    F_Owner: TComponent;

  ...

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  l_Label: TLabel;
begin
  if (F_Owner = nil) then begin
    //ラベル作成
    F_Owner := TComponent.Create(Self);
    for i := 0 to 5 do begin
      l_Label := TLabel.Create(F_Owner);
      with l_Label do begin
        Parent := Self;
        Name := Format('Label_%d', [i]);
        Left := i * 20;
        Top  := i * 20;
      end;
    end;
  end else begin
    //ラベル削除。
    //オーナー削除でラベルも一緒に自動で削除される。
    F_Owner.Free;
    F_Owner := nil;
  end;
end;


スパムちゃんVV  2010-09-29 05:09:26  No: 39243

いろいろな方法を書いて頂き、とっても参考になりました。

まぁ、比喩として一番シンプルな形で質問したんですが、確かに、100個作って、名前を付けたら、消さずに、Captionを変えればいいんですね。^^;

とはいえ、とても参考になりました。
ありがとうございました。


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

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






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