2010-08-05 2 views
0

나는 1 행에 5 개의 동적 버튼을 만들고 버튼 정보 (캡션, isActive 등)를 레지스트리에 저장합니다. 레지스트리에서 IsActive = TRUE 일 때 양식의 단추를 표시합니다. 결과는 아래와 같다 (각 버튼 A * 기호로 표시)특정 조건에 대해서만 레지스트리 키를 읽는 방법은 무엇입니까?

* ** * 
: 나 단추 2 및 버튼 4에 대한이 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); 

당신이 원하는 것을 할 수있는 더 좋은 방법이 있습니다. 델파이가 충분히 최신 버전이라면 TFlowPanel 또는 TGridPanel을 사용하십시오. 그들은 자동으로 서로 옆에 버튼을 정렬합니다. Delphi 버전에 해당 컨트롤이 없으면 대신 TToolBar를 사용하여 TToolButton 컨트롤로 채 웁니다.

귀하의 질문은 실제로 레지스트리와 관련이 없지만 어쨌든 레지스트리를 더 잘 활용할 수 있습니다. 매번 동일한 키를 다시 열 필요가 없습니다. sKeyName의 값은 루프 내부에서 변경되지 않으므로 루프를 입력하기 전에 키를 한 번 연 후 (위 그림 참조) 필요한만큼 길게 둡니다.

관련 문제