2017-04-19 48 views
5

Konum listesi içeren bir TListBox'um var (her biri adınız ve bulunduğunuz yerden bir mesafe). Kullanıcılara listeyi konum adına (yani alfabetik olarak) veya o anki konumlarına olan mesafeye göre sıralama seçeneği vermek istiyorum. Yer adı öğenin ItemData.Text değeri olarak depolanır ve geçerli konumdan uzaklık ItemData.Detail değeri olarak depolanır. Sorun, sıradan TListBox sıralama yönteminin (yalnızca ItemData.Text özelliği) sıralama sırasında ItemData.Detail özelliğini kullanmadığıdır. Her bir öğenin ItemData.Detail değerine göre sıralanan TListBox'a özel bir sıralama yöntemi eklemek mümkün mü?Delphi ItemData.Detail tarafından TListBox sırala?

ben aşağıdaki denedim ama çalışmıyor:

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

+1

Bunu istemiyorsanız standart sıralama neden kullanıyorsunuz? Neden Sıralı olarak ayarlandı? –

+0

Sırala, atadığınız Sıralama yöntemini kullanmıyor mu? –

+1

Hayır. Bir sıralama yöntemi atamazsınız. Birini orada kullanılan Sıralama'ya ve sonra listeyi sıralamak için geçirirsiniz. –

cevap

5

çağrı Sort performansı bakımından: Burada

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; 

ayrılacaktır bir örnek listesinin bir görüntü Karşılaştırma işlevinizi kullanarak sıralama. Sorted özelliği, listeyi varsayılan karşılaştırmayla belirlenen bir sırada tutmak için kullanılır.

Karşılaştırma işlevinizi kullanarak listeyi sıralamak için, yalnızca Sorted özelliğini ayarlayan kodu kaldırın.