как прочитать ключ реестра только для определенных условий? - PullRequest
0 голосов
/ 05 августа 2010

Я создал 5 динамических кнопок в 1 строке и сохранил информацию о кнопке (заголовок, 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;

1 Ответ

0 голосов
/ 05 августа 2010

Я подозреваю, что вы удивляетесь, почему вместо второй кнопки, заполняющей эту область, остается место для второй кнопки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...