Sortowanie lisbox'a a właściwie to dwóch

0

Witam sortuje sobie tak listboxa:

 
function SortujRosnaco(List : TStringList; Index1, Index2 : Integer ) : Integer ;
var
  I1, I2 : integer ;
begin
  if (TryStrToInt (List[Index1], I1)) and TryStrToInt (List[Index2], I2) then
  begin
    if I1 < I2 then
      Result := -1
    else
      if I1 > I2 then
        Result := 1
      else
        Result := 0;
  end
  else
  begin
    Result := AnsiCompareText (List[Index1], List[Index2]);
  end;
end;

procedure TForm1.sortujClick(Sender: TObject);
var
  SL : TStringList;
begin
  SL := TStringList.Create;
  try
    kasa.Sorted := False;
    SL.Assign(kasa.Items);
    SL.CustomSort(SortujRosnaco);
    kasa.Items.Assign(SL);
  finally
    SL.Free
  end;
end;

Przed sortowaniem item 1 w listboxie 'kasa' odpowiadał itemowi 1 w listbox 'skuter' no i jak sobie posortuje to mi już się miesza, dałoby się zrobić tak żeby 'skuter' zmienił się tak jak 'kasa' ?

0

podpowie ktoś?

0

Jak chcesz sortować to czemu nie zrobisz tak? Nie wiem za bardzo co chcesz osiągnąć.

ListBox1.Sorted := True;
0

w skuter (listbox) jest nazwa a w kasa (listbox) jest jakaś liczba i to jest jakby sparowane tzn w pozycja 1 w kasa odpowiada pozycji 1 w skuter no i jak sobie posortuje kase od największej bo tak chce mieć to mi skuter zostaje taki sam a chciałbym żeby też się przemieści żeby znowu się zgrało....

rozumiesz ? ;)

0

Nie wiem jak by to zrobić z wykorzystaniem metody CustomSort.
Zamiast tego polecam Ci normalne sortowanie, np bąbelkowe, w pętli.
Sortujesz porównując elementy z kasa. W przypadku zamiany elementów z kasy równocześnie zamieniaj elementy z skuter. Oczywiście ustaw kasa.Sorted:=False i skuter.Sorted:=False

0

nie da się zrobić tak z customsort ? żeby zmieniając pozycję jakiegoś elementu w kasa tak samo zmieniało w skuter ?

0

pomoże ktoś ? myślę jak to zrobić i nic....

0

Nie wiem co wy tutaj odstawiacie, ale sposób sortowania nijak ma się do tematu wątku; Czy to ważne jaką metodę się wykorzysta? Co to za różnica, czy to będzie bąbelkowe, czy przez wybór, itemy i tak zostaną właściwie poukładane pod warunkiem, że algorytm będzie zaimplementowany prawidłowo;

Według mnie autorowi chodzi o to, że ma problem z poukładaniem itemów w dwóch listach jednakowo, żeby nie pomieszać cen ze skuterami;

Jeśli przesuwasz, zamieniasz czy cokolwiek innego w pierwej liście, to samo rób w drugiej; Jeżeli musisz zamienić miejscami itemy o indeksach 0 i 1, zrób to w obu listach jednocześnie:

procedure Sort(lbScooter, lbPrice: TListBox);

  procedure _ReplaceItems(lbScooter, lbPrice: TListBox; Index1, Index2: Word);
  begin
    { LISTA SKUTERÓW }
    lbScooter.Items.Exchange(Index1, Index2);
    { LISTA CEN }
    lbPrice.Items.Exchange(Index1, Index2);
  end;

begin
  { TU PISZESZ ALGORYTM SORTUJĄCY, W KTÓRYM   }
  { ZA ZAMIANĘ ITEMÓW W OBU LISTACH ODPOWIADA }
  { PROCEDURA _ReplaceItems                   }
end;

Dzięki temu podczas gdy potrzebujesz zamienić itemy, ta procedura zamieni je w dwóch listach; Jej przykładowe wywołanie:

{ ZAMIANA ITEMÓW O INDEKSACH 0 I 1 }
_ReplaceItems(lbScooter, lbPrice, 0, 1);

Inaczej będziesz miał bałagan; Sortowanie zaprogramuj sam, nie wykorzystując wbudowanego w kontrolkę, bo nie masz żadnej kontroli nad przenoszonym itemem podczas sortowania; Jeśli napiszesz go sam (pełno tego w sieci, opisy także na Wikipedii) będziesz mógł ręcznie przesuwać każdy item jednocześnie w dwóch listach, wykorzystując taki lub podobny algorytm jak opisałem wyżej; Podałem Ci tylko przykład zamiany itemów, właściwy algorytm sortujący napisz sam, bo dalej nie wiem z jakiego będziesz chciał skorzystać;


Poza tym, jeśli chcesz mieć coś na zasadzie tabelki, zamiast dwóch komponentów z klasy TListBox utwórz sobie jeden z klasy TListView; Sortowanie przeprowadzisz na itemach, które pamiętają swoje komórki; Nie sprzężysz dwóch ListBox pod jedno sortowanie, za to w ListView będzie działać tak, jak sobie zaplanowałeś;

0

@norbert95
Wykorzystajmy na przykład procedurę sortowania bąbelkowego http://pl.wikisource.org/wiki/Sortowanie_b%C4%85belkowe/kod bo nie chce mi się myśleć.

//zakładam że masz
  kasa,skuter:TListBox;
//i oczywiście
//kasa.Items.Count=skuter.Items.Count
//...
procedure TForm1.sortujClick(Sender: TObject);
var
   i, j : Integer;              //zmienne dla petli
   l, m : Integer;              //zmienne z dlugoscia
   temp : string;              //zmienna tymczasowa
begin
 l := kasa.Items.Count - 1;          //Przypisanie dlugosci tablicy
 m := l - 1;                    //Ustalenie maksymalnej ilosci przejsc
 
 for i := 0 to m do
   for j := i + 1 to l do
     if  StrToInt(kasa.Items[j]) > StrToInt(kasa.Items[i]) then   //Porównanie dwóch elementów tablicy
      begin
        //zamiana kasy
        temp := kasa.Items[i];         //Rozpoczęcie zamiany elementów
        kasa.Items[i] := kasa.Items[j];
        kasa.Items[j] := temp;         //Koniec zamiany elementów
        //zamiana skuterów
        temp := skuter.Items[i];         //Rozpoczęcie zamiany elementów
        skuter.Items[i] := skuter.Items[j];
        skuter.Items[j] := temp;         //Koniec zamiany elementów
      end;
 
end;
0

Mała poprawka, komponent posiada metodę Exchange, która odpowiada za zamianę elementów miejscami; Tak więc ten kod:

      begin
        //zamiana kasy
        temp := kasa.Items[i];         //Rozpoczęcie zamiany elementów
        kasa.Items[i] := kasa.Items[j];
        kasa.Items[j] := temp;         //Koniec zamiany elementów
        //zamiana skuterów
        temp := skuter.Items[i];         //Rozpoczęcie zamiany elementów
        skuter.Items[i] := skuter.Items[j];
        skuter.Items[j] := temp;         //Koniec zamiany elementów
      end;

można skrócić do tego:

      begin
        //zamiana kasy
        kasa.Items.Exchange(i, j);
        //zamiana skuterów
        skuter.Items.Exchange(i, j);
      end;

choć Twój kod oczywiście działa; :]

0
Furious Programming napisał(a)

(TStrings) posiada metodę Exchange

Wyspałem się i też przypomniałem sobie o tej metodzie :)

W sumie to można by wykorzystać wbudowane sortowanie z małą poprawką.

function SortujRosnaco(List : TStringList; Index1, Index2 : Integer ) : Integer ;
var
  I1, I2 : integer ;
begin
{...
  tutaj kod obliczający wartość Result
...}
  if Result>0 then skuter.Items.Exchange(i1,i2);
end;

Funkcję SortujRosnaco wywoływałaby kasa

1 użytkowników online, w tym zalogowanych: 0, gości: 1