2017-04-19 61 views
5

Mam TListBox zawierający listę lokalizacji (każdy z nazwą i odległości od bieżącej lokalizacji). Chciałbym dać użytkownikom opcję sortowania listy według nazwy lokalizacji (tj. Alfabetycznie) lub odległości od ich bieżącej lokalizacji. Nazwa lokalizacji jest zapisywana jako wartość ItemData.Text elementu, a odległość od bieżącej lokalizacji jest zapisywana jako wartość ItemData.Detail. Problem polega na tym, że zwykła metoda sortowania TListBox nie używa właściwości ItemData.Detail podczas sortowania (tylko właściwość ItemData.Text). Czy jest możliwe dodanie niestandardowej metody sortowania do TListBox, która sortuje według wartości ItemData.Detail każdego elementu?Delphi Sortuj TListBox przez ItemData.Detail?

Próbowałem następujących, ale nie działa:

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; 

Oto obraz z listy np które byłyby klasyfikowane:

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

+1

Dlaczego używasz sortowania standardowego, jeśli go nie chcesz? Dlaczego warto ustawić Sorted to True? –

+0

Czy sortowane nie używa metody sortowania, którą przypisujesz? –

+1

Nie. Nie przypisujesz metody sortowania. Przekazujesz jeden do Sortowania, który jest tam używany, a następnie sortujesz listę. –

Odpowiedz

5

Wezwanie do Sort preform sortowanie za pomocą funkcji porównania. Właściwość Sorted służy do utrzymywania listy w kolejności określonej przez porównanie domyślne.

Aby zamówić listę za pomocą funkcji porównania, po prostu usuń kod, który ustawia właściwość Sorted.