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

請問,怎麼動態新增按鈕呀??

 
JASAM
一般會員


發表:4
回覆:4
積分:1
註冊:2002-03-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-05-18 18:19:26 IP:61.217.xxx.xxx 未訂閱
嗨!大家好: 方才查閱了一下先前的資料,發現有幾個動態新增元件的說明, 雖然依樣話葫蘆,但是還是沒有反應,傷腦筋,可以指點一下嘛? 目的:想要按一下按鈕就動態新增一個新的按鈕 我的原始碼: procedure TForm1.Button1Click(Sender: TObject); var btn : TButton; begin btn := TButton.Create(Self); Height := Height 40; btn.Top := Height-30; btn.Left := 8; btn.Height := 25; btn.Width := 137; btn.Visible := True; end;
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-05-18 19:56:08 IP:211.74.xxx.xxx 未訂閱
引言: 嗨!大家好: 方才查閱了一下先前的資料,發現有幾個動態新增元件的說明, 雖然依樣話葫蘆,但是還是沒有反應,傷腦筋,可以指點一下嘛? 目的:想要按一下按鈕就動態新增一個新的按鈕 我的原始碼: procedure TForm1.Button1Click(Sender: TObject); var btn : TButton; begin btn := TButton.Create(Self); btn.parent:=self; ------------>加上這行就會出現了^^ Height := Height 40; btn.Top := Height-30; btn.Left := 8; btn.Height := 25; btn.Width := 137; btn.Visible := True; end; 至於為什麼,不好意思,我也不知道,書上是這樣子的^^
JASAM
一般會員


發表:4
回覆:4
積分:1
註冊:2002-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-05-18 21:14:28 IP:61.217.xxx.xxx 未訂閱
嗨!!謝謝您的解答,試出來了!! 可以再請教一下嘛?? 像我產生那麼多動態的按鈕, 我怎麼針對他們一個個做屬性和事件的設定呀?! 例如,我一次新增十個按鈕後, 我想要針對他們一個一個設定Caption的屬性, 我應該怎麼做呢? 是不是有像是陣列的設定方式呢? 像是 btn[1].Caption 這樣?? 發表人 - JASAM 於 2002/05/18 21:30:42
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-05-19 02:14:36 IP:211.74.xxx.xxx 未訂閱
例如,我一次新增十個按鈕後, 我想要針對他們一個一個設定Caption的屬性, 我應該怎麼做呢? 是不是有像是陣列的設定方式呢? 像是 btn[1].Caption 這樣?? 我幫你找了一下相關的問題解答,請你自已試試噲^^ 我想主要的部份是 ComponentCount和 Components這二個用法,你了解了就 會吧^^ ===============這是hagar大大對別人的解答,我想你改一下,應該可以 var edt: TEdit; i: Integer; begin for i := 1 to 20 do begin edt := FindComponent('Edit' IntToStr(i)) as TEdit; edt.Text := '' end; end; =============這是別人的解答 BCB的,但我想delphi也一樣吧 由於動態建立元件, 都會指定Owner, 所以 在Owner裡, 一個一個比對, 如果是動態生成的元件, 就釋放 像這樣 for (int i=0;i{ if (Components[i]->Name="Button1") Components[i]->Free(); } ====================================mhwu1 procedure TForm1.Button1Click(Sender: TObject); var i: Integer; Btn: TButton; begin for i := 0 to 10 do begin Btn := TButton.Create(Self); Btn.Parent := Self; Btn.Top := i * 20; Btn.Left := i * 30; end; // 此處 TForm 為 Btn 的容器類別 for i := 0 to Self.ComponentCount - 1 do begin if Self.Components[i].ClassName = 'xxx' then // 利用 ClassName 或其他相關資訊找到你要的 Component end; end;
mihopaul
一般會員


發表:25
回覆:59
積分:16
註冊:2002-03-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-05-19 02:36:22 IP:211.74.xxx.xxx 未訂閱
你可以利用搜尋文章的功能去找,這應該是很多人問過的問題~~ 我下面的都是在深度歷險找到的,用動態二字就找的到了 這還有個相關的討論 http://forum.vclxx.org/topic.php?TOPIC_ID=3826&FORUM_ID=3&CAT_ID=2&Topic_Title=½аݥi¥H°ʺA«ü©w¤¸¥ó¦WºٶÜ? ex:form1.label(1.....10).caption&Forum_Title=Misc http://forum.vclxx.org/topic.php?TOPIC_ID=8120&FORUM_ID=4&CAT_ID=2&Topic_Title=¦p¦ó¦b°õ¦æ®ɴA°ʺAªº®ø·Àpanel¤Wªº¤¸¥ó©O?&Forum_Title=VCL http://forum.vclxx.org/topic.php?TOPIC_ID=8172&FORUM_ID=4&CAT_ID=2&Topic_Title=Ãö©ó°õ¦æ®ɴA°ʺA§R°£°ʺA·s¼Wªº¤¸¥ó(part ii)&Forum_Title=VCL 至於事件部份則有下面這個 http://forum.vclxx.org/topic.php?TOPIC_ID=2189&FORUM_ID=8&CAT_ID=2&Topic_Title=¦p¦ó°ʺA«ü©wEvent&Forum_Title=Pascal http://forum.vclxx.org/topic.php?TOPIC_ID=11398&FORUM_ID=4&CAT_ID=2&Topic_Title=½аÝDelphi¥i¥H°ʺA«ü©wEvent­n°õ¦檺Procedure¶Ü??&Forum_Title=VCL
JASAM
一般會員


發表:4
回覆:4
積分:1
註冊:2002-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-05-19 09:33:21 IP:61.217.xxx.xxx 未訂閱
收到好多資訊呀!! 得花點時間來試試,先謝謝大家,謝謝!
JASAM
一般會員


發表:4
回覆:4
積分:1
註冊:2002-03-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-05-19 13:13:26 IP:61.217.xxx.xxx 未訂閱
可以再發問嗎?! 就是呀,我已經動態新增了按鈕,並可以設定他們各自的屬性了,但是, 我要從哪裡設定他們的Events觸發事件呀!? ------------------------------------------------------------------- //假設我動態新增了一個按鈕叫做button2,接著試著想要設定它的事件... if self.Components[i] is TButton then if self.Components[i].Name = 'button2' then begin //像一般事件都是直接到Events的地方做觸發事件的設定,那麼, //假設現在這個Components[i]就是我想要設定的對象,我怎麼針對它做 //觸發事件的設定呢? end; -------------------------------------------------------------------
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-05-20 08:04:09 IP:61.219.xxx.xxx 未訂閱
請參見 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=3861 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
linkolong
一般會員


發表:4
回覆:35
積分:12
註冊:2002-04-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-05-28 14:06:30 IP:61.70.xxx.xxx 未訂閱
1.建立陣列 var BtnArray:Array [0..4] of TButton; 2.利用迴圈產生BtnArray,並指派屬性事件,並設定Tag值以檢索事件 var loop:integer; begin for loop:= 0 to 4 begin BtnArray[loop]:=TButton.Create(Self); with BtnArray[loop] do begin Parent :=self; //指定舥泊地點 Caption :=IntToStr(loop); Width :=50; Height :=25; Top :=30; Left :=(loop*60) 10; Tag :=loop; OnClick :=ButtonClick; end; end; 3.設定ButtonClick,並利用Tag值以檢索事件 procedure TForm1.ButtonClick(Sender: TObject); var t : Integer; begin t:=(Sender as TButton).Tag; MessageBox.Caption:='You pressed Button ' IntToStr(t); end; 另外,當然你也可以直接在2.中直接設定對應的事件,以下為部分程式碼 Top :=30; //見2.xxx之程式區塊敘述 Left :=(loop*60) 10; case loop of 0 :OnClick:=BCK0 ; //需設定BCK0,1,2,3,4滑鼠觸發事件以對應 1 :OnClick:=BCK1 ; //兩邊事件型態需符合 2 :OnClick:=BCK2 ; //也就是說不可將KeyEvent指派給mouseEvent 3 :OnClick:=BCK3 ; 4 :OnClick:=BCK4 ; end;
welkin
一般會員


發表:2
回覆:6
積分:1
註冊:2002-09-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-10-04 21:21:07 IP:61.61.xxx.xxx 未訂閱
小弟另外有個問題 小弟目前已經動態新增了按鈕陣列 但是要如何針對不同的按鈕設定事件呢? 譬如: 小弟希望按下第二排第一個按鈕(button name = W2L1) 系統可以自動將該按鈕設定成visable = False; 或是可以改變該按鈕的caption 該如何設定呢? 以下是小弟產生動態陣列的原始代碼 希望有前輩可以指導一下,謝謝. procedure Tnew_class_seat.Button1Click(Sender: TObject); var BtnArray:Array of Array of TButton; I,J : integer; Btn_front : TButton; begin setLength(BtnArray,25,25); for I := 1 to StrtoInt(EX.Text) do begin for J :=1 to StrToInt(EY.Text) do begin BtnArray[I,J]:=TButton.Create(Self); with BtnArray[I,J] do begin Parent :=self; Caption :=IntToStr(I) '-' IntToStr(J); Name :='W' IntToStr(I) 'L' IntToStr(J); Width :=25; Height :=25; Top :=(J*30) 60; Left :=(I*30) 150; Tag :=StrToInt(IntToStr(I) IntToStr(J)); OnClick :=ButtonClick; end; end; end; Btn_front:=TButton.Create(Self); Btn_front.Parent :=self; Btn_front.Caption :='黑板'; Btn_front.Width := StrtoInt(EX.Text)*30 - 5; Btn_front.Height :=25; Btn_front.Top := 60; Btn_front.Left :=180; end;
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-10-04 23:17:25 IP:211.23.xxx.xxx 未訂閱
可以用一個事件,設定每一個元件的TAG的值,在共用的事件判斷TAG執行不同的程式碼 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
welkin
一般會員


發表:2
回覆:6
積分:1
註冊:2002-09-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-10-05 15:32:03 IP:61.61.xxx.xxx 未訂閱
小弟已經大致完成了 謝謝各位大哥 不過還有個問題.... 如果要存入資料庫 要如何將動態產生的按鈕一筆一筆的置入資料庫呢? 另外 以後要如何從資料庫內叫出來 並排列成先前的陣列狀態呢?...謝謝~
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-10-06 22:53:07 IP:211.23.xxx.xxx 未訂閱
可將一些相關屬性存到資料庫,下次要使用時將資料讀出來設定相關的屬性即可......... @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
welkin
一般會員


發表:2
回覆:6
積分:1
註冊:2002-09-28

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-10-07 17:17:24 IP:61.61.xxx.xxx 未訂閱
是的...小弟也是這麼打算的 不過現在不知道該怎麼用語法.... 所以卡住了... 以下是程式的片段 不知道有哪位前輩可以指導一下 try mySQLTable1.Open; setLength(BtnArray,26,26); for I := 1 to StrtoInt(EX.Text) do begin for J :=1 to StrToInt(EY.Text) do begin mySQLTable1.Insert; Button_temp := 'W' IntToStr(I) 'L' IntToStr(J); mySQLTable1.FieldByName('classroom_id').Value := classroom_id.Text; mySQLTable1.FieldByName('classroom_name').Value := classroom_name.Text; mySQLTable1.FieldByName('classroom_id').Value := classroom_id.Text; mySQLTable1.FieldByName('EX').Value := EX.Text; mySQLTable1.FieldByName('EY').Value := EY.Text; mySQLTable1.FieldByName('seat_name').Value :=Button_temp; //mySQLTable1.FieldByName('seat_color').Value := PDJButton(Sender).color; //mySQLTable1.FieldByName('seat_font_color').Value := BtnArray[I,J].font.color; mySQLTable1.FieldByName('create_date').Value := strnow; mySQLTable1.post; end; end; showmessage('建立成功!!'); except showmessage('錯誤訊息'); abort(); end;
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-10-07 18:54:55 IP:203.204.xxx.xxx 未訂閱
引言: 小弟已經大致完成了 謝謝各位大哥 不過還有個問題.... 如果要存入資料庫 要如何將動態產生的按鈕一筆一筆的置入資料庫呢? 另外 以後要如何從資料庫內叫出來 並排列成先前的陣列狀態呢?...謝謝~
將整個元件存入資料庫的Text型態的欄位,要用再建立此元件即可。 如下是Delphi的Help
function ComponentToString(Component: TComponent): string;    var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;        end;
  finally
    BinStream.Free
  end;
end;    function StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result := BinStream.ReadComponent(nil);        finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
welkin
一般會員


發表:2
回覆:6
積分:1
註冊:2002-09-28

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-10-12 00:21:10 IP:61.13.xxx.xxx 未訂閱
呼~~總算把這部分寫好了 但是還是有個問題 沒辦法完整的釋放產生出來的物件 我現在只知道在關閉form的時候 加上 form.Close; form:= nil; 這兩段來把form整個釋放 但是不知道該怎麼單獨把在form上動態產生出來的Button 給一個個的消滅
系統時間:2024-07-02 16:37:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!