Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
type TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;					


Also habe ich eine Funktion
ausblenden 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?
ausblenden Delphi-Quelltext
1:
datumliste.customsort(datensortieren)					

geht nicht.

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt und weitere hinzugefügt :lol:
Moderiert von user profile iconGausi: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138

Win 98se und XP prof
D5Pers und D7Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 84

WIN 95, WIN 98, WIN ME, WIN NT, WIN 2000, WIN XP, VISTA
D2 Prof, D4 Prof,D2005 Prof, Delphi4Php
BeitragVerfasst: 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):

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
    // listbox1.Sorted := False !
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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:
ausblenden 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// datensortieren

// Aufruf
datumliste.CustomSort(@datensortieren);


@Pierre
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function SortInt(aListe:TStringList; idx1, idx2:Integer);
begin
  Result:=StrToInt(aListe.Strings[idx1])-StrToInt(aListe.Strings[idx2]);
end// SortInt

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Mi 29.06.05 14:55 
Hallo,

für eine ObjectList ist die Vorgehnesweise im Prinzip ähnlich.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TMyDatumObj=class
    Datum:TDateTime;
  end// TMyDatumObj
...
...
function MyDatumSort(Item1, Item2:TMyDatumObj);
begin
  Result:=Trunc(Item1.Datum-Item2.Datum);
end// MyDatumSort

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Pierre
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138

Win 98se und XP prof
D5Pers und D7Prof
BeitragVerfasst: Fr 01.07.05 00:30 
DANKE!
Carnivean
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36

Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
BeitragVerfasst: So 21.08.05 11:01 
user profile iconsmiegel hat folgendes geschrieben:
Hallo,

für eine ObjectList ist die Vorgehnesweise im Prinzip ähnlich.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TMyDatumObj=class
    Datum:TDateTime;
  end// TMyDatumObj
...
...
function MyDatumSort(Item1, Item2:TMyDatumObj);
begin
  Result:=Trunc(Item1.Datum-Item2.Datum);
end// MyDatumSort


Hi,
ich wollte verschiedene Strings miteinander vergleichen, um sie asc/des zu sortieren.

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36

Win 2000, Win Xp Prof
D3 Prof, D7 Prof, D2005 Pers
BeitragVerfasst: So 21.08.05 13:27 
Hi,
thx, war mitlerweile auf folgende Lösung gekommen, llerdings bin ich danach erstmal ins Bett gagangen ;):

ausblenden volle Höhe Delphi-Quelltext
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:
ausblenden Delphi-Quelltext
1:
Personenverwaltung.ShowSchueler.Sort(SortierenSchuelerVorname);					


Wobei ShowSchueler eine TObjectList ist :).

Gruß
Carni