2014-09-19 4 views
0

TCheckListBox 항목 상태를 토글하려고 시도하고 있으므로 항목이 선택되어 있으면 선택 취소하고 반대로 선택하십시오. 이것은 대개 물리적 상자 자체를 클릭 할 때만 전환되지만 사용자가 항목 행의 아무 곳이나 클릭 할 때 전환 할 수 있습니다.CheckListBox 항목을 클릭하여 해당 항목의 체크 상태를 토글합니다.

아래 코드는 작동하지만 항목이 실제 상자에서 클릭 할 때 전환 할 수 없도록합니다 (예 : 현재 선택 해제 된 상태에서 상자를 클릭하면 선택 취소됩니다).

코드에서 두 가지 동작 또는 잘못된 동작을 모두 사용할 수 있습니까?

procedure TMainFrm.CheckListBoxModulesMouseDown(Sender: TObject; 
    Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
var 
    APoint: TPoint; 
    Index: integer; 
begin 
    if (Button = mbLeft) then 
    begin 
    APoint.X := X; 
    APoint.Y := Y; 
    Index := CheckListBoxModules.ItemAtPos(APoint, True); 

    if(Index > -1) then 
    begin 
     CheckListBoxModules.Checked[Index] := not CheckListBoxModules.Checked[Index]; 
    end;  
    end;  
end; 
+1

'if y> 16 then Begin ... End' – bummi

+0

음, 그런 것 같아요. X가합니다. – ikathegreat

답변

1

상태를 전환 한 후에는 체크가 된 이후로 상자 자체가 다시 전환됩니다.

해결 방법이 내장 된 체크 행동을 취소하는 것입니다 :

procedure TMainFrm.CheckListBoxModulesClickCheck(Sender: TObject); 
begin 
    CheckListBoxModules.Checked[CheckListBoxModules.ItemIndex] := 
     not CheckListBoxModules.Checked[CheckListBoxModules.ItemIndex]; 
end; 


당신이 코드에 의해 체크 상태를 변경할 때 OnClickCheck 해고되지 않기 때문에이 작동합니다. 단, 체크 상자에서 마우스 클릭으로 인한 상태 변경은 취소됩니다.


더 나은 솔루션은 클릭이 확인란에있을 때 상태를 전혀 전환하지 않는 것입니다. 이 솔루션을 구현하기로 결정한 경우 VCL에서 확인란 크기를 결정하는 방법은 TCheckListBox.GetCheckSize의 코드를 참조하고 위치 결정 방법은 TCheckListBox.MouseDown을 참조하십시오.

1

이것은 약간의 적중 테스트가 도움이되는 유형의 유형입니다. 사용자가 체크 박스를 클릭하면 체크 상태를 수동으로 토글하지 마십시오. TCheckListBox이 내부적으로 사용하는 것과 유사한 논리를 사용하여 사용자가 확인란을 클릭하고 있는지 여부를 결정할 수 있습니다. 마우스가 체크 상자 위에있는 경우 TCheckListBox이 클릭을 처리하게하십시오. 수동으로 달리 토글하십시오. 예 :

0

Sertac의 대답에 약간의 코드를 추가하여 마녀 키를 확인한 다음 키보드로 위아래로 이동할 수 있습니다.

procedre TfrmRelBalanceteGerencial.cklGrupoContasClick(Sender: TObject); 
begin 
inherited; 
    if HiWord(GetKeyState(VK_UP)) <> 0 or HiWord(GetKeyState(VK_DOWN)) then 
    begin 
    // do nothing 
    end 
    else 
    begin 
    cklGrupoContas.Checked[cklGrupoContas.ItemIndex] := not cklGrupoContas.Checked[cklGrupoContas.ItemIndex]; 
    end; 
end;