2010-08-05 82 views
0

我在1行創建了5個動態按鈕,並在註冊表中存儲按鈕信息(標題,isActive等)。它從註冊表中顯示IsActive = TRUE時窗體中的按鈕。其結果是,如下(每個按鈕由符號*表示):如何只讀取某些條件的註冊表項?

***** 

當我設置IsActive = FALSE爲BUTTON2和將Button4,按鈕被除去,放置下方的空間:

* ** * 

任何想法來解決這個問題?源代碼如下:

procedure TfrmPOS.CreateDynamicBtn;  
    var 
     Reg : TRegIniFile; 
     lstKey : TStringList; 
     sKeyName : String; 
     bActive : boolean; 
     btn1  : TBitBtn; 
     i, k, iIcon : integer; 
    begin 
     lstKey := TStringList.Create; 
     Reg  := TRegIniFile.Create; 
     try 
     //clear bitbtn 
     if ScrollBox2.ControlCount > 0 then begin 
      for k := ScrollBox2.ControlCount - 1 downto 0 do begin 
       with ScrollBox2.Controls[k] AS TBitBtn do begin 
       Free; 
       end; 
      end; 
     end; 

sKeyName := Sysmem.RegKeyRoot+'\POSConfig\ItemSetting\'; 
Reg  := TRegIniFile.Create(sKeyName); 
Reg.GetKeyNames(lstKey); //button1, button2,... 
for i := 0 to lstKey.Count - 1 do begin 
    Reg.OpenKeyReadOnly(sKeyName); 
    bActive := Reg.ReadBool(lstKey.Strings[i], 'IsActive', TRUE); 
    if bActive = TRUE then begin 
    //create dynamic bitbtn 
    btn1 := TBitBtn.Create(self); 
    btn1.Parent := ScrollBox2; 
    btn1.Height := 82; 
    btn1.Width := 82; 
    btn1.Left := ((i mod 5) * btn1.Width); 
    btn1.Top  := (Trunc((i div 5)) * btn1.Height); 
    btn1.Caption := Reg.ReadString(lstKey.Strings[i], 'Caption', ''); 

    iIcon := Reg.ReadInteger(lstKey.Strings[i], 'IconImage', 0); 
    imglstIcon.GetBitmap(iIcon, btn1.Glyph); 
    btn1.Layout := blGlyphTop; 
    btn1.Name := lstKey.Strings[i]; 
    btn1.OnClick := OnButtonClick; 
    end; 
    Reg.CloseKey; 
end; 

finally 
    lstKey.Free; 
    Reg.Free; 
    end; 
end; 
+0

你做了什麼調試,使得你認爲你的問題與註冊表有什麼關係?如果註冊管理機構實際上與您的問題相關,那麼您在解釋問題所在方面做得不是很好。如果我在答案中沒有正確猜測,請澄清你的問題。 – 2010-08-05 04:47:13

回答

0

我懷疑你想知道爲什麼第二個按鈕的空間仍然存在,而不是第三個按鈕填補這一領域。

這是因爲你設置的按鈕Left屬性,雖然所有的按鈕都在那裏:

btn1.Left := ((i mod 5) * btn1.Width); 

i = 1,你跳過它,因爲該按鈕是不可見的。但是,如果i = 3,則計算其位置與按鈕2可見時的位置相同。保持一個可見按鈕計數器從列表迭代器分離,並用它來定位你的按鈕:

BtnIndex := 0; 
Reg.OpenKeyReadOnly(sKeyName); 
for i := 0 to lstKey.Count - 1 do begin 
    bActive := Reg.ReadBool(lstKey.Strings[i], 'IsActive', TRUE); 
    if bActive then begin 
    //create dynamic bitbtn 
    btn1 := TBitBtn.Create(self); 
    btn1.Parent := ScrollBox2; 
    btn1.SetBounds(BtnIndex mod 5 * 82, BtnIndex div 5 * 82, 82, 82); 
    Inc(BtnIndex); 

有更好的方法做你想要什麼。如果您有足夠新的Delphi版本,請使用TFlowPanelTGridPanel。他們會自動爲你安排你的按鈕。如果你的Delphi版本沒有附帶這個控件,那就試試TToolBar,然後用TToolButton控件填充它。

你的問題實際上與註冊表無關,但你可以更好地使用註冊表。無需每次都重新打開相同的密鑰。 sKeyName的值在循環內不會改變,所以在進入循環之前打開一次鍵(如上所示),然後只要您需要它就打開它。