全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1829
推到 Plurk!
推到 Facebook!

如何釋放動態生成的Button控件

尚未結案
linken
一般會員


發表:23
回覆:37
積分:22
註冊:2004-11-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-07 16:39:15 IP:61.146.xxx.xxx 未訂閱
那位高手幫我解決如下問題: 我在一個Form中動態生成一個Button控件 為了能測試出效果,我用一個Bitbtn的控件觸發 當第一次點Bitbtn時能夠實現結果但第二次點 Bitbtn時就會出錯,是不是要釋放原先創建的Button 才能再次生成呢?? 有什麼辦法??請各位高手助教!!! ken
------
ken
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-07 17:34:16 IP:218.174.xxx.xxx 未訂閱
button的onclick事件有沒有給?
tonytop
中階會員


發表:6
回覆:114
積分:89
註冊:2003-12-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-07 18:26:01 IP:210.64.xxx.xxx 未訂閱
會不會是你每次生成的「位置」都一樣所以看不到呢?要調整唷!    
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  tBtn:TButton;
begin
  tBtn:=TButton.Create(Application);
  tBtn.Parent:=Form1;
  tBtn.Left:=100;//調整生成位置
  tBtn.Top:=100; //調整生成位置
end;
我正確的mail:h832214@hotmail.com
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-07 18:33:42 IP:220.130.xxx.xxx 未訂閱
 
procedure TForm1.Button1Click(Sender: TObject);
var
  I, W, H: Integer;
begin
  W := 40;
  H := 30;
  for I := 0 to 15 do
    with TButton.Create(Self) do
    begin
      Parent := Form1;
      Visible := True;
      BoundsRect := Rect(W * (I mod 4),
                         H * (I div 4),
                                W * (I mod 4   1),
                                H * (I div 4   1));
      //Name不能重複,你也可以不指定,但是要自己負責Free的動作
      Name := 'btn'   IntToStr(I);
      Caption := Name;
      Tag := I;
      OnClick := DOClick;
    end;
end;    procedure TForm1.DoClick(Sender: TObject);
begin
  if Sender is TButton then
    ShowMessage(IntToStr(TButton(Sender).Tag));
end;    procedure TForm1.Button2Click(Sender: TObject);
var
  C: TButton;
  I: Integer;
begin
  for I := 0 to 15 do
  begin
    C := TButton(FindComponent('btn' IntToStr(I)));
    if Assigned(C) then FreeAndNil(C);
  end;
end;
linken
一般會員


發表:23
回覆:37
積分:22
註冊:2004-11-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-08 07:31:28 IP:61.146.xxx.xxx 未訂閱
jow謝謝你們的回復,可是對於你的 程序好像用現有的Bitbtn控件來觸發 生成動態的Button控件喲.是不是啊??? ken
------
ken
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-08 14:35:23 IP:220.130.xxx.xxx 未訂閱
(1)我想重點是動態生成的控件,交付與Owner管理時,如果 Name 屬性重複的話將會發生Exception的狀況; 也就是說如果你要動態產生一組有指定Name的控件,應該在使用後自行Free它,以便下一次的動作.    (2)也可以不指定Name Property,但是如果交付給某個Owner時,則每次動作產生的元件勢將一直累積,直到Owner 被Free的時候.    (3)理論上Owner(Form1)在Destroy 時應該會透過ComponentCount和Components,去釋放屬於它的所有元件.    (4)Owner也可以是nil喔!    
  Buttons: array of TButton;
  SetLength(Buttons,10);
  for I := 0 to Length(Buttons)-1 do
  begin
    Buttons[I] := TButton.Create(nil);
    with Buttons[I] do
    begin
      BoundsRect := Rect(...);
      Parent := ...;
      ...
    end;
  end;      for I := 0 to Length(Buttons)-1 do
    if Assigned(Buttons[I]) then
      FreeAndNil(Buttons[I]);      Buttons := nil;    關於程式上動態配置的資源(如 Memory),總要有適當的方法將它釋放,除非你知道哪些情況下Delphi的哪些機制會自動幫你清除.
系統時間:2024-07-03 4:08:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!