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

String 如何轉換為 TButton ?

答題得分者是:ccchen
zeusibson
一般會員


發表:3
回覆:2
積分:1
註冊:2002-08-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-27 17:56:41 IP:61.30.xxx.xxx 未訂閱
我想要用for迴圈將50個Button,name分別為btn1.....btn50一次統統disable掉 Procedure TForm1.Button1Click(Sender: TObject); Var intCount:Integer; objButton:TButton; begin For intCount:=1 to 50 do begin objButton:=TButton('btn' IntToStr(intCount)); objButton.Enabled:=false; end; end; 結果無法執行,我應該怎麼作ㄋ? 我是初學者,請各位多多指教!!!
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-27 18:13:40 IP:203.217.xxx.xxx 未訂閱
Procedure TForm1.Button1Click(Sender: TObject);
Var
  intCount:Integer;
  objButton:TButton;
begin
  For intCount:=1 to 50 do begin
    objButton:=TButton(FindChildControl('btn' IntToStr(intCount)));
    if objButton <> nil then 
      objButton.Enabled:=false;
  end;
end;
發表人 - ccchen 於 2002/08/27 18:14:30
zeusibson
一般會員


發表:3
回覆:2
積分:1
註冊:2002-08-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-29 04:54:01 IP:61.30.xxx.xxx 未訂閱
可是我發現在Delphi 5中這方法行不通耶....
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-29 07:57:28 IP:61.219.xxx.xxx 未訂閱
引言: 可是我發現在Delphi 5中這方法行不通耶....
也可以換個方法, 檢查form上之control若name為btn1...btn50則disable it
procedure Tfmdumy.button1Click(Sender: TObject);
var i,id:integer;
  bname:string;
begin
  for i:=0 to controlcount-1 do          //對form上之每一control
    if Controls[i] is TButton then begin //如果是TButton
      bname:=Controls[i].name;           //以下如開始檢查name是否在要disable
      if length(bname) > 3 then begin
        if compareText(copy(bname,1,3), 'btn')=0 then begin //前3個字'btn'
          try    //'btn'後之字元守將轉換成integer故須 確定能轉換
                 //以避免例如'btnaaa' 之button造成error
            id:=strtoint(copy(bname,4,length(bname)-3));
            if (id>=1) and (id <=50) then
              TButton(Controls[i]).Enabled:=False;
          except //若不能轉換, 直接忽略
          end;
        end;
      end;
    end;
end;
[note]若這些button 包含在form上其他元件中, 可將controlcount 改為componentcount, controls[i]改為components[i]
Jack0323
初階會員


發表:22
回覆:70
積分:28
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-10-13 22:17:52 IP:211.74.xxx.xxx 未訂閱
用FindCOmponent就可以了啊
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-10-14 08:31:17 IP:61.219.xxx.xxx 未訂閱
用FindCOmponent就可以了啊 所有TWinControl(包括Form)有兩個Array Components: 所有以此Wincontrol為owner之child Controls: 所有以此Wincontrol為parent之child owner關係負責管理Memory, 一般DesignTime放入之元件owner均為Form parent關係負責顯示,假設Form上有一Panel, Panel上有一button 則button之parent為panel, owner為form. 若你將panel.visible:=False, button也看不到了 如上述關係,FOrm之Controls array中無button1,故FindControl就找不到了, 但是由於預設狀態下所有Component之owner均為Form故form.findComponent找的到 所以你如果將50個button均放在一個Panel(或Group,或任何WinControl),上只要Disable此panel就可以了 發表人 - ccchen 於 2002/10/14 08:34:58
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-10-15 18:07:29 IP:202.123.xxx.xxx 未訂閱
引言: 所以你如果將50個button均放在一個Panel(或Group,或任何WinControl),上只要Disable此panel就可以了 發表人 - ccchen 於 2002/10/14 08:34:58
這種方法有個缺點, 就是若你只 Disable 了 Button 所屬的 Panel 的話, 程式使用者將看不出 Button 是處於 Disable 狀態的, 因為 Button 上的字並沒有如期的灰掉, 當然, 這時 Button 確是按不動的, 只是, 用戶可能會因此而感到困惑吧。 不過我也有用這種 Disable panel 的時候, 那就是當我想讓某些 TEdit/TDBEdit Disable 的時候, 我便會使用這種 Disable 方法, 原因是, 我覺得如果直接把 TEdit/TDBEdit Disable 掉的話, 它會連裡面顯示的文字都會灰掉, 我個人覺得不太好看, 所以會分別在 TEdit/TDBEdit 轉換其背景顏色, 然後又 Disable 其所屬的 Panel, 各位朋友可以試試, 會不會好看一點。 -- 小卜子 發表人 - diviner 於 2002/10/15 18:08:27
------
--
小卜子
Emulator
一般會員


發表:1
回覆:18
積分:8
註冊:2002-10-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-10-21 01:02:06 IP:211.74.xxx.xxx 未訂閱
我比較喜歡的作法.. 既然知道這n個Button是同一個屬性的.. 就直接塞在一個TList陣列內,要的時候,自己取一個出來用就好..//Type Cast當然還是得作 如果這些Button是死的話,乾脆就搞成array of TButton, 那樣操控更好作,速度也快。 如果用findComponent的話,速度在大量的search下全秏光了..:) = Delphi - Emulator =
------
= Delphi - Emulator =
系統時間:2024-04-30 15:08:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!