Я подозреваю, что вы удивляетесь, почему вместо второй кнопки, заполняющей эту область, остается место для второй кнопки.
Это потому, что вы устанавливаете свойства 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
не изменяется внутри цикла, поэтому откройте ключ один раз, прежде чем войти в цикл (как показано выше), а затем просто оставьте его открытым так долго, как вам нужно.