2017-04-19 3 views
5

위치 목록 (각 위치에 현재 위치에서 이름과 거리가있는)이 포함 된 TListBox가 있습니다. 사용자에게 위치 이름 (예 : 사전 순) 또는 현재 위치로부터의 거리를 기준으로 목록을 정렬 할 수있는 옵션을 제공하고 싶습니다. 위치 이름은 항목의 ItemData.Text 값으로 저장되고 현재 위치로부터의 거리는 ItemData.Detail 값으로 저장됩니다. 문제는 정렬 할 때 (ItemData.Text 속성 만) 일반 TListBox 정렬 메서드는 ItemData.Detail 속성을 사용하지 않는다는 것입니다. 각 항목의 ItemData.Detail 값에 따라 정렬하는 TListBox에 사용자 정의 정렬 방법을 추가 할 수 있습니까?델파이 TListBox를 ItemData.Detail로 정렬 하시겠습니까?

나는 다음을 시도했지만 작동하지 않습니다 :

Here is an image of an example list that would be sorted

+1

표준 정렬을 사용하지 않는 이유는 무엇입니까? Sorted를 True로 설정하는 이유는 무엇입니까? –

+0

정렬 된 정렬 방법을 사용하지 않습니까? –

+1

아니요. 정렬 방법을 지정하지 마십시오. Sort에 하나를 전달한 다음 Sort를 사용하여 목록을 정렬합니다. –

답변

5

호출 Sort 수행에 : 여기

procedure TFrmSelect.btnSortLocationClick(Sender: TObject); 
var Compare: TFMXObjectSortCompare; 
begin 
    btnSortLocation.Enabled := False; 
    btnSortAlpha.Enabled := True; 
    Compare := function(item1, item2: TFmxObject): Integer 
    begin 
    Result := TListBoxItem(item1).ItemData.Detail.CompareTo(TListBoxItem(item2).ItemData.Detail); 
    end; 
    self.ListBox.Sort(Compare); 
    self.ListBox.Sorted := False; 
    self.ListBox.Sorted := True; 
end; 

정렬 될 것이다 예를 들어 목록의 이미지입니다 비교 함수를 사용한 정렬. Sorted 속성은 기본 비교에 의해 결정된 순서로 목록을 유지 관리하는 데 사용됩니다.

비교 기능을 사용하여 목록을 정렬하려면 Sorted 속성을 설정하는 코드를 제거하십시오.