2013-10-28 6 views
2

클릭 무시 나는 이벤트가 목록에서 항목에 일어난 여부를 표시 확인란을 사용하려는 TListview이 있습니다.뷰 TListView 확인란

본인은 체크 박스의 상태를 설정,하지만 내가 정말하고 싶은 마우스 클릭을 사용하여 상태를 변경할 수있는 사용자의 능력을 비활성화입니다 수 있습니다.

TCheckList 들어 I는 TListview 작동하지 않는

동일 OnClickCheck

를 이용하여 역으로 checked 상태를 설정할 수있다. 그 순간 나는 ... 확인란을 OnMouseDown 표적이되었지만 겪고에서 클릭을 해제 할 수

procedure TMF.ListViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
var 
    MyHitTest : THitTests; 
begin 
    MyHitTest := (Sender as TListView).GetHitTestInfoAt(X,Y); 
    if htOnStateIcon in MyHitTest then 
     (Sender as TListView).OnMouseDown := nil; 
end; 

제안을 볼 수 있습니까?

+0

거짓 도움에 뷰 TListView의 Enabled 속성을 설정합니까? –

+0

아니요. 개별적으로 클릭 할 수있는 항목이 필요합니다. ('Rowselect '를 사용하고 있습니다.) 체크 박스의 상태가 내 컨트롤에 있어야합니다. –

+4

여기에서 시스템과 싸우고 있습니다. 너를 그렇게시키지 않기를 바란다. 귀하의 입장에서 나는 체크 박스가 내장되어 있지 않은 솔루션을 찾고있을 것입니다. –

답변

2

Onchanging 이벤트를 사용하고 AllowChangeFalse으로 설정하십시오.

procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem; 
    Change: TItemChange; var AllowChange: Boolean); 
begin 
    AllowChange := False; 
end; 

업데이트 : OP 사용자가 항목을 선택할 수있게하려고합니다. 그래서, 어쩌면 조금 해킹 OnItemChecked 이벤트를 사용하여 할 수 있습니다.

procedure TForm1.ListView1ItemChecked(Sender: TObject; Item: TListItem); 
begin 
    if TComponent(Sender).Tag = 0 then 
    begin 
    TComponent(Sender).Tag := 1; 
    Item.Checked := not Item.Checked; 
    TComponent(Sender).Tag := 0; 
    end; 
end; 

갱신 2 :이 트릭을 사용하는 문제는 모든 항목의 상태를 변경하기 전에 당신이 그것을 사용하지 않도록해야한다는 것입니다. 예를 들어 :

Procedure LoadListViewItems; 
begin 
    //Let's permit modification in ListView Items. 
    ListView1.OnItemChecked := nil; 
    try 
    //put Load Items code Here! 
    finally 
    //User cannot change Items statuses 
    ListView1.OnItemChecked := ListView1ItemChecked; 
    end; 
end; 
+0

모든 변경을 맹목적으로 허용하지 않기 전에'Change' 매개 변수를 확인해야합니다 :'Change = ctState then AllowChange : = False; ' –

+0

이것을 시도하면 ctState 커버가 선택되거나 선택되지 않고 체크 박스 상태로 선택되지 않습니다 변경. 나는 OnMouseDown에 booelan을 추가하려고 시도했으나, * OnChanging 후에 * 발동되었습니다. –

+0

@RemyLebeau는 이것 외에도 단 한 가지 예였습니다. 왜 그런지 이해하지 못합니다. 변경 사항을 언제든지 허용하고 싶지 않으면 그 차이점은 무엇입니까? – EMBarbosa

1

당신은 항목이 어떤 VCL 이벤트 처리하기 전에 상태를 확인 강제로 창 PROC 후크 수 제자리 취

TForm1 = class(TForm) 
    ... 
    private 
    fLVWndProc: TWndProc; 
    end; 


    procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    // Save the original window proc and install the hook 

    fLVWndProc := Listview1.WindowProc; 
    Listview1.WindowProc := LVWndProcHook; 
    end; 



    procedure TForm1.LVWndProcHook(var aMessage: TMessage) ; 
    var 
    notify: PNMListView; 
    bItemState: Boolean; 
    begin 
    if (aMessage.Msg = CN_NOTIFY) 
    and (PNMHdr(aMessage.LParam).Code = LVN_ITEMCHANGED) then 
    begin 
     notify := PNMListView(aMessage.LParam); 

     if ((notify.uChanged and LVIF_STATE) <> 0) then 
     begin 
     // Determine actual item state and re-apply it before continuing 
     bItemState := GetUnderlyingItemState(notify.iItem); 
     ListView_SetCheckState(notify.hdr.hwndFrom, notify.iItem, bItemState); 
     end; 
    end; 

    //original ListView message handling 
    fLVWndProc(aMessage) ; 
    end; 
0

또는 다음과 같이 할 수 있습니다

procedure TForm1.ListItemChecked(Sender: TObject; Item: TListItem); 
begin 
if not CheckBoxesEnabled then begin 
    List.OnItemChecked:=nil; 
    Item.Checked:=not Item.Checked; 
    List.OnItemChecked:=ListItemChecked; 
end; 
end; 

목록은 뷰 TListView이며, 를 사용하거나 checkbo을 해제 부울 변수를 CheckBoxesEnabled xes.