如何仅针对特定条件读取注册表项?

时间:2010-08-05 04:01:13

标签: delphi registry

我在1行中创建了5个动态按钮,并将按钮信息(标题,isActive等)存储在注册表中。当注册表中的IsActive = TRUE时,它会显示表单中的按钮。结果如下(每个按钮用*符号表示):

*****

当我为button2和button4设置IsActive = FALSE时,按钮被删除并留下如下空格:

* ** *

有什么想法解决这个问题吗?源代码如下:

    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;

1 个答案:

答案 0 :(得分: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的值在循环内部不会改变,因此在进入循环之前打开键一次(如上所示),然后只要你需要它就打开它。