logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[delphi] Sortowanie labeli , listbox'a lub stringgrid'a

rafaelle1 13 Paź 2007 14:51 5912 22
REKLAMA
  • #1 4374747
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Witam
    mam problem jak posortować labele , mam ich 8 i chciałbym aby wyświetlało je od największego do najmniejszego

    pomóżcie bo stoję z tym już ponad tydzień :(
  • REKLAMA
  • #2 4375029
    Kabuto15
    Poziom 19  
    Posty: 336
    Pomógł: 30
    Ocena: 5
    Ale co chcesz zrobić? Co masz w tych labelach? Do sortowania danych raczej nie używa się labeli, tylko np. StringGrid itp.
    Jeśli koniecznie chcesz posortować labele, to musisz napisać algorytm np. bąbelkowy. Następnie po posortowaniu, musisz skorzystać z właściwości Top i odpowiednio je na ekranie umieścić.
    Jednak ja osobiście odradzam takie kombinacje. Lepiej użyć komponentów Delphi mających w sobie takie możliwości.
  • #3 4375041
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Jest 8 labeli (punkty w meczu)
    każdy to wynik jakiegoś meczu
    trzeba wyświetlić wynik od największego do najmniejszego

    każdy label przypisany jest do swojego editu ( w editach są nazwy drużyn)

    trzeba posortować według wyników drużyny które grają w danej kolejce
  • #4 4375077
    Kabuto15
    Poziom 19  
    Posty: 336
    Pomógł: 30
    Ocena: 5
    a nie możnaby zawartości Editów wysyłać do StringGrida? A tam sortowanie odbywa się automatycznie. A jego wygląd można dostosować do swoich potrzeb. Do tego jego "tabelaryczność" jest bardzo przystępna.
    Jeśli uparłeś się na te Labele poszukaj informacji o sortowaniu bąbelkowym. Polecam google (sortowanie bąbelkowe delphi).
  • #5 4375103
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Nigdy tego nie robiłem , nawet nie wiem jak to sie robi , chce tylko posegregować edity według punktów które są w labelach
  • REKLAMA
  • #6 4375152
    Kabuto15
    Poziom 19  
    Posty: 336
    Pomógł: 30
    Ocena: 5
    Przepraszam, pomyliłem się z tym StringGridem. On nie ma wbudowanego automatycznego sortowania, ale np. ListBox posiada taką opcje.

    Sposób użycia (dodania elementu):
     ListBox1.Items.Add("Not");
  • #7 4375211
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    mógłbym tak zrobić , ale na początku idea była inna i trochę dużo przerabiania będzie , wolałbym zostać przy editach i labelach

    Dodano po 25 [minuty]:

    Właśnie sprawdziłem listbox , sortuje ale tylko 1 (pierwszą)cyfrę

    jeśli jest 12 drużyna1 , 20 drużyna2 , 4 drużyna3 , 10 drużyna4 to posortowane jest :
    10 drużyna4
    12 drużyna1
    20 drużyna2
    4 drużyna3
    
  • #8 4377197
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Witam, do tego lepiej nada sie chyba ListView (Jeśli dobrze kojarzę, ListBox to tylko jedna kolumna, ListView pozwala umieścić ich więcej).

    Możesz użyć własnej funkcji do sortowania elementów, zamiast wbudowanej. Wtedy nie będzie problemów z sortowaniem.

    Pozdrawiam, Krzysztof.
  • #9 4377655
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Mam już zrobionego listboxa , sortuje tak jak pisałem wcześniej.

    czy można coś z tym zrobić i jak zrobić żeby sortował odwrotnie , od największej cyfry do najmniejszej

    zrobiłem tak :
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    listbox1.Items.Clear;
    
    listbox3.Items.Append(label1.Caption+'-'+edit1.Text);
    listbox3.Items.Append(label2.Caption+'-'+edit2.Text);
    listbox3.Items.Append(label3.Caption+'-'+edit3.Text);
    listbox3.Items.Append(label4.Caption+'-'+edit4.Text);
    listbox3.Items.Append(label5.Caption+'-'+edit5.Text);
    listbox3.Items.Append(label6.Caption+'-'+edit6.Text);
    listbox3.Items.Append(label7.Caption+'-'+edit7.Text);
    listbox3.Items.Append(label8.Caption+'-'+edit8.Text);
    end;
    

    czy da się coś dopisać żeby sortował tak jak ja chce ?
  • #10 4381938
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Witam , czy może mi ktoś pomóc posortować listboxa ?
    Pisze program do turnieji w którym ma być 8 drużyn (edit1 do 8 ) które zdobywają punkty (label1 do 8 ) , chciałem to posortować od największej ilości punktów do najmniejszej .
    Sam listbox sortuje tylko 1 cyfrę wpisu , czyli jak jest :
    12-drużyna1 , 20-drużyna2 , 4-drużyna3 , 10-drużyna4 to sortuje tak :
    10-drużyna4
    12-drużyna1
    20-drużyna2
    4-drużyna3
    



    zrobiłem tak :
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    listbox1.Items.Clear;
    
    listbox3.Items.Append(label1.Caption+'-'+edit1.Text);
    listbox3.Items.Append(label2.Caption+'-'+edit2.Text);
    listbox3.Items.Append(label3.Caption+'-'+edit3.Text);
    listbox3.Items.Append(label4.Caption+'-'+edit4.Text);
    listbox3.Items.Append(label5.Caption+'-'+edit5.Text);
    listbox3.Items.Append(label6.Caption+'-'+edit6.Text);
    listbox3.Items.Append(label7.Caption+'-'+edit7.Text);
    listbox3.Items.Append(label8.Caption+'-'+edit8.Text);
    end;
    

    czy da się coś dopisać jakąś procedurę żeby sortował tak jak ja chce ?

    jeśli można to prosiłbym o kod bo szukam już od ponad 2 tygodni i nic mi nie wychodzi :(
  • #12 4399916
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Witam
    Mam pytanie , jakie są metody sortowania w delphi
    pisze program i nie wiem czym posortować wpisy w editach
    chodzi o to ze mam edity w których będą drużyny i labele w których są punkty , czym posortować to od największej liczby punktów ?
    punkty nie koniecznie muszą być w labelach , mogą być również w editach
    tylko problem jak i w jakim komponencie je poukładać
    może ktoś podać jakiś kod , żebym miał punkt zaczepienia ?

    próbowałem liczyć w ten sposób :
    begin
    
     if ((strtoint(label1.Caption)>strtoint(label2.Caption))and
        (strtoint(label1.Caption)>strtoint(label3.Caption))and
        (strtoint(label1.Caption)>strtoint(label4.Caption))and
        (strtoint(label1.Caption)>strtoint(label5.Caption))and
        (strtoint(label1.Caption)>strtoint(label6.Caption))and
        (strtoint(label1.Caption)>strtoint(label7.Caption))and
        (strtoint(label1.Caption)>strtoint(label8.Caption))) then
     begin
     showmessage(edit1.Text+' '+label1.caption) ;
     end;
    begin
    
     if ((strtoint(label1.Caption)=strtoint(label2.Caption))and
        (strtoint(label1.Caption)>strtoint(label3.Caption))and
        (strtoint(label1.Caption)>strtoint(label4.Caption))and
        (strtoint(label1.Caption)>strtoint(label5.Caption))and
        (strtoint(label1.Caption)>strtoint(label6.Caption))and
        (strtoint(label1.Caption)>strtoint(label7.Caption))and
        (strtoint(label1.Caption)>strtoint(label8.Caption))) then
     begin
     showmessage(edit1.Text+' '+label1.caption+#10#13+edit2.Text+' '+label2.Caption) ;
     end;

    ale mam 8 editów i 8 labeli i jest to metoda która zajmuje dużo czasu i nie do końca bedzie poprawna , np w przypadku remisu
    w editach są nazwy drużyn , w labelach zdobyte przez nie punkty
    prosze o pomoc
  • REKLAMA
  • #14 4400298
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    nie za wiele z tego rozumiem , dopiero sie uczę pisać programy :(
  • #15 4401488
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Witam, pozwoliłem sobie scalić wszystkie 3 wątki dotyczące tego samego tematu.

    Co do samego sortowania. Będzie to problematyczne, ponieważ etykiety i edity nie służą do prezentacji rekordów. Do tego nadają się komponenety takie jak wspomniane wcześniej ListView (Ale tutal możesz mieć problemy z edycją, jeśli potrzebujesz edytować wartości w obydwu kolumnach - chyba że zastosujesz okno dialogowe), lub StringGrid. Tam sortowanie mozna zrobić prościej, więc myślę że najpierw powinieneś zainteresowac się tymi komponentami.

    Pozdrawiam, Krzysztof.
  • REKLAMA
  • #16 4402406
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Jeśli tak było trzeba :P

    Niestety nigdy nie robiłem nic na stringgrid , jest gdzieś jakiś tutorial do tego ?

    Znalazłem ładny kod , ale sortuje tylko 1 kolumnę , potrzebne mi są 2 kolumny , w 1 wpisze punkty w 2 nazwy drużyn z tym żeby sortowało mi całe wiersze według pierwszej kolumny
  • #18 4422915
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    No dobra tylko nadal nie wiem jak to posortować :(
    Teraz gdy mam już stringgrid i wpisy są zrobione chciałbym posortować rzędy według kolumny np 2
  • #20 4434631
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Widze że nie dostane tu odpowiedzi , zawsze tak piszecie ? masz i se poszukaj , nie znam wogule bcb , nie żebym nie próbował , ale nic z tego nie rozumiem , nie studiowałem informatyki , jestem samoukiem , ucze sie metodą prób i błędów , ale w bcb nic nie rozumiem i są tylko błędy :(

    prosiłem tylko o pomoc
  • #21 4434821
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Delphi oraz BCB wykorzystują tą samą bibliotekę, VCL. Więc wszystkie najważniejsze operacje są podobne (różnią się najwyżej kilkoma znakami). Dostałeś prawie gotowe rozwiązanie, które w łatwy sposób możesz dostosować do swoich potrzeb.

    Jeśli dostaniesz odpowiedź gdzie indziej, kod będzie podobny. Więc albo przeanalizuj jeszcze raz to co dostałeś, albo zainteresuj się ListView, w którym sortowanie wykonuje się o wiele prościej i o którym to wspominam już trzeci raz.

    Jeśli jesteś początkujący i nie rozumiesz zagadnienia sortowania StringGrid, to nie zarzucaj braku chęci tym którzy chcą Tobie pomóc.

    Pozdrawiam, Krzysztof.
  • #22 4434899
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    Sorki , ale naprawdę zależy mi na tym , a w bcb nie widzę nic co mógłbym wykorzystać
    enum TTypeSort {tsIncrease, tsDecrease};
    int __fastcall CustomSortIncrease(TStringList *Lista, int idx1, int idx2)
    {
     String cTemp1 = Lista->Strings[idx1];
     String cTemp2 = Lista->Strings[idx2];
     return CompareText(cTemp1, cTemp2);
    }
    int __fastcall CustomSortDecrease(TStringList *Lista, int idx1, int idx2)
    {
     String cTemp1 = Lista->Strings[idx1];
     String cTemp2 = Lista->Strings[idx2];
     return -CompareText(cTemp1, cTemp2);


    nie wygląda mi to na kod choćby podobny do delphi
    jakby mógł ktoś wytłumaczyć od czego zacząć byłbym wdzięczny

    Dodano po 3 [minuty]:

    znalazłem coś co mogłoby mi pomóc , jakby ktoś udzielił małej podpowiedzi jak to wykorzystać
    procedure TForm1.RadioButton16Click(Sender: TObject);
    var
    i,j : integer;
    begin
    StringGrid1.RowCount:=koniec+1;
    
    For J:=1 To koniec-2 Do // normalnie jest -1 ale ja dodałem pomocniczą na koniec
      For I:=1 To koniec-2 Do
        If StringGrid1.cells[1,i]>StringGrid1.cells[1,i+1] Then
          Begin
            StringGrid1.Rows[koniec+1]:=StringGrid1.Rows[i];
            StringGrid1.Rows[i]:=StringGrid1.Rows[i+1];
            StringGrid1.Rows[i+1]:=StringGrid1.Rows[koniec+1];
           End;
    
    StringGrid1.RowCount:=koniec;
    //Przykład sortowania
    {
    For J:=1 To n-1 Do
      For I:=1 To n-1 Do
        If Tab[I]>Tab[I+1] Then
          Begin
            Pom:=Tab[I];
            Tab[I]:=Tab[I+1];
            Tab[I+1]:=Pom;
          End;
    } end;


    nie rozumiem po co 2 zmienne skoro w kodzie wykorzystana jest tylko 1 .
    Jak użyłem tego kodu to czyści cały stringgrid , zostaje tylko pierwszy rząd i nic więcej
    jeszcze 1 , gdzie umieścić "koniec" dodałem do
      public
          koniec:  integer;
        { Public declarations }
    i otrzymałem taki rezultat jak opisałem wyżej , czyli skasowało mi wszystkie cele z stringgrida oprócz 1 rzędu
  • #23 4445005
    rafaelle1
    Poziom 12  
    Posty: 102
    Ocena: 12
    pomóżcie

Podsumowanie tematu

✨ Dyskusja dotyczy problemu sortowania wyników meczów wyświetlanych w komponentach Delphi, takich jak Label, Edit, ListBox oraz StringGrid. Autor posiada 8 etykiet (Label) z punktami drużyn oraz odpowiadające im pola Edit z nazwami drużyn i chce posortować wyniki od największego do najmniejszego. Wskazano, że sortowanie bezpośrednio na Labelach jest niepraktyczne i lepiej użyć komponentów dedykowanych do prezentacji danych tabelarycznych, takich jak StringGrid lub ListView. ListBox sortuje tylko alfabetycznie i niepoprawnie sortuje liczby wielocyfrowe, dlatego zalecane jest napisanie własnej funkcji sortującej lub użycie ListView z własnym mechanizmem sortowania. Podano linki do tutoriali i przykładów sortowania StringGrid, jednak autor ma trudności z ich zrozumieniem, gdyż jest początkującym programistą. Zwrócono uwagę, że Delphi i Borland C++ Builder (BCB) korzystają z podobnej biblioteki VCL, więc przykłady z BCB można adaptować do Delphi. Ostatecznie rekomendowane jest zainteresowanie się komponentami ListView lub StringGrid z własną funkcją sortowania, aby efektywnie posortować wiersze według kolumny z punktami, co jest bardziej odpowiednie niż manipulowanie Labelami i Editami.
Wygenerowane przez model językowy.
REKLAMA