プログラムでボタンを作る事はできたのですが・・・、
たとえば、ボタンを押すと、プログラム的にラベルを100個作ったとします。
位置も重ならないようにずらします。
ただ、このボタンをもう一度押すと、再度ラベルが100個できるって事ですよね?
3回押せば、300のラベルが。(まぁ、同じ位置にすれば、200は下に隠れる事になると思うのですが。
プログラムで作ったラベルって、どうやって消せばいいんでしょうか?
ご教授お願い致します。
以下のサンプルででどうでしょうか?
一つ目のボタンを押すと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;
> ただ、このボタンをもう一度押すと、再度ラベルが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していきましょう)
こんな手もあります。
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;
いろいろな方法を書いて頂き、とっても参考になりました。
まぁ、比喩として一番シンプルな形で質問したんですが、確かに、100個作って、名前を付けたら、消さずに、Captionを変えればいいんですね。^^;
とはいえ、とても参考になりました。
ありがとうございました。
ツイート | ![]() |