![]() |
Re: Listbox nach Datum sortieren
Zitat:
Du hast den Code ja an Deine Umgebung angepasst, da ist ein Fehler passiert. Poste, wie Du Toms Code bei Dir implementiert hast... |
Re: Listbox nach Datum sortieren
Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TData = class Datum: TDateTime; DatumStr: String; end; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } procedure RandomizeArrays; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin BorderIcons := [biSystemmenu]; RandomizeArrays; end; //----------------------------------------------------------------------- procedure TForm1.RandomizeArrays; var i:integer; begin randomize; Listbox1.Clear; for i:= 0 to (400-1) do begin Listbox1.items[i]:= DatetoStr(Random(42000)); end; Label1.Caption:= inttostr(i)+' '+'Zufallsdatums erzeugt!'; end; function CompareDates(List: TStringList; Index1, Index2: Integer): Integer; var d1, d2: TDateTime; begin d1 := StrToDate(List[Index1]); d2 := StrToDate(List[Index2]); if d1 < d2 then Result := -1 else if d1 > d2 then Result := 1 else Result := 0; end; procedure TForm1.Button1Click(Sender: TObject); var //sl: TStringList; List: TStringList; begin { sl := TStringList.Create; try // listbox1.Sorted := False ! sl.Assign(listbox1.Items); sl.CustomSort(CompareDates); //<- ERROR listbox1.Items.Assign(sl); finally sl.Free end; } List:=TStringlist.Create; try ListBox1.Items.BeginUpdate; try List.Assign(ListBox1.Items); List.CustomSort(@CompareDates); //<-Error ListBox1.Items.Assign(List); finally ListBox1.Items.EndUpdate; end; finally List.Free; end; end; end. |
Re: Listbox nach Datum sortieren
Das liegt daran, das Deine ListBox1 auch leer ist! Dabei darfst Du Dich nicht von der Anzeige täuschen lassen...
Delphi-Quellcode:
Du beschreibst Listbox Items, die gar nicht da sind (keine Ahnung warum da noch nicht der Fehler kommt). Damit bleibt ListBox1.Items.Count auch auf -1, was später zum Fehler führt.
procedure TForm1.RandomizeArrays;
var i:integer; begin randomize; Listbox1.Clear; for i:= 0 to (400-1) do begin Listbox1.items[i]:= DatetoStr(Random(42000)); // Riesen Fehler end; Label1.Caption:= inttostr(i)+' '+'Zufallsdatums erzeugt!'; end; Bau Deine Zufalls-Liste so auf
Delphi-Quellcode:
€: das wäre dann auch die Stelle, wo Dein Code von toms Beispiel abweicht ;)
Listbox1.items.add(DatetoStr(Random(42000)));
|
Re: Listbox nach Datum sortieren
Zitat:
Mit 'Items.add' gehts. Aber noch was: Ich habe vor diesen letzten Versuchen mit QuickSort, ectra, die im hiesigen Forumthread beschriebenen 'ShellSort'- und 'BubbleSort' Routinen probiert und die funktionieren eben auch mit 'Listbox1.items[i]. Ist das nicht merkwürdig? |
Re: Listbox nach Datum sortieren
Die Stringliste der Listbox ist da etwas zu Fehler resistent (da würde man sich eigentlich eine Exception wünschen). Die Einträge werde scheinbar auch bei Zuweisen über Count gespeichert, aber Variablen wie Count nicht korrekt neu gesetzt.
Wenn Du dann mir Deinen eigenen Sortierroutinen auf die Liste zugegriffen hast, eben auch an Variablen wie Count vorbei operiert. Die Listbox schießt sich quasi selbst ins Bein, dass Sie an einer Stelle Fehler resistent ist und an anderer Stelle nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz