我在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;
答案 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,请使用TFlowPanel
或TGridPanel
。他们会自动为您排列按钮。如果您的Delphi版本没有附带该控件,那么请尝试使用TToolBar并使用TToolButton控件填充它。
您的问题实际上与注册表无关,但无论如何您都可以更好地使用注册表。每次都不需要重新打开相同的密钥。 sKeyName
的值在循环内部不会改变,因此在进入循环之前打开键一次(如上所示),然后只要你需要它就打开它。