Autor |
Beitrag |
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 10.02.03 15:34
ich habe eine Stringliste, die ich nicht nur alphabetisch, sondern auch anders sortieren möchte. (Nämlich den string als datum interpretieren und dann nach Datum sortieren)
In der Online Hilfe steht zur customsort method by TStringlist:
procedure CustomSort(Compare: TStringListSortCompare), wobei
Delphi-Quelltext 1:
| type TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer; |
Also habe ich eine Funktion
Delphi-Quelltext 1:
| function datensortieren(meineliste:TStringlist;index1,index2:integer):integer; |
definiert, die irgendeinen Wert zurückliefert (der hängt dann von meiner gewünschten Sortierung ab).
Wie kann ich dann damit die Liste sortieren?
Delphi-Quelltext 1:
| datumliste.customsort(datensortieren) |
geht nicht.
Moderiert von Gausi: Code- durch Delphi-Tags ersetzt und weitere hinzugefügt Moderiert von Gausi: Topic aus VCL (Visual Component Library) verschoben am Mi 29.06.2005 um 14:59
Zuletzt bearbeitet von Gausi am Mi 29.06.05 14:31, insgesamt 1-mal bearbeitet
|
|
Pierre
      
Beiträge: 138
Win 98se und XP prof
D5Pers und D7Prof
|
Verfasst: Mi 29.06.05 13:43
Hallo,
ich habe heute genau dieses Problem bekommen,
hast Du es rausgefunden, wie man die Sortierung beeinflußt?
Per default kann ich Namen sortieren, nur bei Zahlen kommt folgende
Reihenfolge zustande:
1
10
12
2
20
usw.
Dies will ich abstellen.
Gruß Pierre
|
|
direction4delphi
      
Beiträge: 84
WIN 95, WIN 98, WIN ME, WIN NT, WIN 2000, WIN XP, VISTA
D2 Prof, D4 Prof,D2005 Prof, Delphi4Php
|
Verfasst: Mi 29.06.05 14:17
Hallo Leute
Hier ein eifaches Bleispiel für datum sortierung (integer weicht ein wenig ab sollte aber kein pürob mehr sein):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button2: TButton; procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1; ListBox1: TListBox; function SortDatum(List: TStringList; Index1, Index2: Integer): Integer; implementation
{$R *.dfm} function SortDatum(List: TStringList; Index1, Index2: Integer): Integer; var dat1, dat2: TDateTime; begin dat1 := StrToDate(List[Index1]); dat2 := StrToDate(List[Index2]); if dat1 < dat2 then Result := -1 else if dat1 > dat2 then Result := 1 else Result := 0; end;
procedure TForm1.Button2Click(Sender: TObject); var temp: TStringList; begin temp := TStringList.Create; try temp.Assign(listbox1.Items); temp.CustomSort(SortDatum); listbox1.Items.Assign(temp); finally temp.Free end; end;
procedure TForm1.FormCreate(Sender: TObject); begin
ListBox1 := TListBox.Create(Self); with ListBox1 do begin Name := 'ListBox1'; Parent := Self; Left := 38; Top := 184; Width := 121; Height := 97; ItemHeight := 13; Items.Clear; Items.Add('21.12.2003'); Items.Add('12.12.2001'); Items.Add('17.04.1002'); Items.Add('29.05.2005'); TabOrder := 1; end;
end;
end. |
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Mi 29.06.05 14:24
Hallo,
@Gausi:
Angenommen, das Datum steht in der Form "TT.MM.JJJJ" in der Strinliste, dann kannstz Du folgendes verwenden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function datensortieren(meineliste:TStringlist; index1, index2:integer):Integer; begin Result:=Trunc(DateToStr(meinliste.Strings[index1])-DateToStr(meineListe.Strings[index2])); end; datumliste.CustomSort(@datensortieren); |
@Pierre
Delphi-Quelltext 1: 2: 3: 4:
| function SortInt(aListe:TStringList; idx1, idx2:Integer); begin Result:=StrToInt(aListe.Strings[idx1])-StrToInt(aListe.Strings[idx2]); end; |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Gausi 
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 29.06.05 14:46
Nur zur Zwischeninfo: Ich weiss nicht, wie ich das Problem damals gelöst habe. Ich weiss noch nicht mal mehr genau, wo ich das gebraucht habe.
Ich glaube aber, dass ich von der Stringlist weg bin, und die Sort-Methode von TObjectlist genommen habe, da ich nicht nur Strings benötigte, sondern etwas kompliziertere Objekte.
_________________ We are, we were and will not be.
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Mi 29.06.05 14:55
Hallo,
für eine ObjectList ist die Vorgehnesweise im Prinzip ähnlich.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TMyDatumObj=class Datum:TDateTime; end; ... ... function MyDatumSort(Item1, Item2:TMyDatumObj); begin Result:=Trunc(Item1.Datum-Item2.Datum); end; |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Pierre
      
Beiträge: 138
Win 98se und XP prof
D5Pers und D7Prof
|
Verfasst: Fr 01.07.05 00:30
|
|
Carnivean
      
Beiträge: 36
Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
|
Verfasst: So 21.08.05 11:01
smiegel hat folgendes geschrieben: | Hallo,
für eine ObjectList ist die Vorgehnesweise im Prinzip ähnlich.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TMyDatumObj=class Datum:TDateTime; end; ... ... function MyDatumSort(Item1, Item2:TMyDatumObj); begin Result:=Trunc(Item1.Datum-Item2.Datum); end; | |
Hi,
ich wollte verschiedene Strings miteinander vergleichen, um sie asc/des zu sortieren.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function SortierenSchuelerVornameDes(Item1, Item2: TPerson): Integer; begin Result := AnsiCompareText(Item1.Vorname, Item2.Vorname); Result := -Result; end;
function SortierenSchuelerVorname(Item1, Item2: TPerson): Integer; begin Result := AnsiCompareText(Item1.Vorname, Item2.Vorname); end; |
Das sind zwei Beispielfunktionen, die ich benute, wie muss dazu der Funktionsufruf aussehen?
Wenn ich folgendes mache:
Delphi-Quelltext 1:
| ShowLehrer.Sort(SortierenSchuelerVornameDes); |
Bekomme ich eine Fehlermeldung, Incompatbile Types Pointer und TPerson. Ist ja auch klar(ShowLehrer ist eine TObjectList mit vielen TLehrern, die abgeleitet sind von TPerson) , aber ich hab keine Ahnung, wie der Funktionsusruf aussehen muss, sitz da jetzt schon 2 Stunden dran und seh es einfach nicht. Wäre nett, wenn ihr ihr mir etwas auf die Sprünge helfen könntet...
Carnivean
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 21.08.05 13:12
Moin!
Klar, du kannst ja nicht den erwarteten Typ des Parameters nachträglich ändern; also mußt du deine Prozedur entsprechend anpassen:
Delphi-Quelltext 1: 2: 3: 4:
| function SortierenSchuelerVornameDes(Item1, Item2: Pointer): Integer; begin Result := -AnsiCompareText((Item1 as TPerson).Vorname, (Item2 as TPerson).Vorname); end; |
Das sollte so gehen; das andere Sortieren analog ohne Minuszeichen vor dem Ansi...
cu
Narses
|
|
Carnivean
      
Beiträge: 36
Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
|
Verfasst: So 21.08.05 13:27
Hi,
thx, war mitlerweile auf folgende Lösung gekommen, llerdings bin ich danach erstmal ins Bett gagangen  :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| function SortierenSchuelerVorname(Item1, Item2: Pointer): Integer; Var Items1, Items2: TSchueler; begin Items1 := TSchueler(Item1); Items2 := TSchueler(Item2);
if Items1.VorName < Items2.VorName then Result := -1;
if Items1.VorName > Items2.VorName then Result := 1;
if Items1.VorName = Items2.VorName then Result := 0;
end;
function SortierenSchuelerVornameDes(Item1, Item2: Pointer): Integer; Var Items1, Items2: TSchueler; begin Items1 := TSchueler(Item1); Items2 := TSchueler(Item2);
if Items1.VorName < Items2.VorName then Result := 1;
if Items1.Name > Items2.Name then Result := -1;
if Items1.VorName = Items2.VorName then Result := 0;
end; |
Aufruf:
Delphi-Quelltext 1:
| Personenverwaltung.ShowSchueler.Sort(SortierenSchuelerVorname); |
Wobei ShowSchueler eine TObjectList ist  .
Gruß
Carni
|
|
|