Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Listbox nach Datum sortieren (https://www.delphipraxis.net/134814-listbox-nach-datum-sortieren.html)

Satty67 4. Jul 2009 22:32

Re: Listbox nach Datum sortieren
 
Zitat:

Zitat von Codix32
kriege schon wieder diese Fehlermeldung, daß ich das Maximum überschreite.

Der Code von toms funktioniert bei mir auch einwandfrei.

Du hast den Code ja an Deine Umgebung angepasst, da ist ein Fehler passiert. Poste, wie Du Toms Code bei Dir implementiert hast...

Codix32 4. Jul 2009 23:11

Re: Listbox nach Datum sortieren
 
Zitat:

Zitat von Satty67
Zitat:

Zitat von Codix32
kriege schon wieder diese Fehlermeldung, daß ich das Maximum überschreite.

Der Code von toms funktioniert bei mir auch einwandfrei.

Du hast den Code ja an Deine Umgebung angepasst, da ist ein Fehler passiert. Poste, wie Du Toms Code bei Dir implementiert hast...

Hier das ganze Dingens:

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.

Satty67 4. Jul 2009 23:28

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:
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;
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.

Bau Deine Zufalls-Liste so auf
Delphi-Quellcode:
Listbox1.items.add(DatetoStr(Random(42000)));
€: das wäre dann auch die Stelle, wo Dein Code von toms Beispiel abweicht ;)

Codix32 4. Jul 2009 23:54

Re: Listbox nach Datum sortieren
 
Zitat:

Zitat von Satty67
Das liegt daran, das Deine ListBox1 auch leer ist! Dabei darfst Du Dich nicht von der Anzeige täuschen lassen...
Delphi-Quellcode:
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;
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.

Bau Deine Zufalls-Liste so auf
Delphi-Quellcode:
Listbox1.items.add(DatetoStr(Random(42000)));
€: das wäre dann auch die Stelle, wo Dein Code von toms Beispiel abweicht ;)

Satty67, Du hast recht. :cheers: Menno, ich hatte die Zufallsdatums also garnicht in die Listbox aufgenommen.
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?

Satty67 5. Jul 2009 00:03

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.
Seite 5 von 5   « Erste     345   

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