2012-05-07 7 views
3

Delphi Xe2. 큰 목록 항목이있는 Listview (Lv1). Lv1은 standartart 프로 시저 "TForm1.lv1Compare"를 비교합니다. 정렬은 표준 프로 시저 lv1.AlphaSort에 의해 시작됩니다. 모든 작품은 정상적으로 정렬됩니다. 질문 : 필요한 경우 정렬 작업을 즉시 중단하는 방법은 무엇입니까?정렬을 중지하는 방법 ListView.AlphaSort

예 :

procedure tform1.button1.onclick(..); 
begin 
lv1.AlphaSort; // start sorting 
end; 

procedure tform1.button2.onclick(..); 
begin 
//lv1.StopSort; // stop sorting ??? 
end; 

또는 정지의 명령이 OnCompare 절차에있을 수 있습니까?

답변

4

TListView.AlphaSort 내부에 ListView_SortItems 매크로가 호출되었지만 참조 (콜백 함수를 통해조차도)에서 정렬 프로세스를 중지하는 방법에 대한 언급이 없으므로 이것이 가능하지 않습니다. 최소한 규칙적인 방식으로). 대신 뷰 TListView의

var 
    YouWantToAbortSort: Boolean; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    YouWantToAbortSort := False; 
    ListView1.AlphaSort; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    YouWantToAbortSort := True; 
end; 

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; 
    Data: Integer; var Compare: Integer); 
begin 
    if YouWantToAbortSort then 
    Abort; 
    // some sorting function here ... 
    Application.ProcessMessages; 
end; 
+2

일반 'OnCompare'를 사용하여 예외를 발생시킬 수 있습니다. –

+1

안전합니까? 이런 경우 목록보기 데이터가 합리적인 상태가됩니까? 부분적으로 정렬되지 않습니까? –

+0

@David - 설명서에 내용이 불안정하다고 나와 있습니다 * 정렬 중에 *. AFAICS 내 작은 테스트와 함께 중단 후 부분 정렬이 없습니다. –

2

사용 VirtualTreeView 다른 스레드에서 데이터의 종류를 수행 한 가지 가능한 해결 방법은 OnCompare 이벤트 내부 자동 예외를 발생 할 수 있습니다로

처럼 Sertac는 그의 의견에 제안 . 그런 다음 언제든지 중지 할 수 있습니다.

+1

가상 모드의'TListView'도 똑같이 작동합니다. –