Announcement

Collapse
No announcement yet.

Listbox sortieren - Bug in Delphi 2005 ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Listbox sortieren - Bug in Delphi 2005 ?

    Hallo Leute,

    ich freue mich, daß es ein solches Forum gibt, das Hilfe bei Problemen in verschiedenen Programmiersprachen ermöglicht. Eine gelungene Sache, dafür erst einmal meine Hochachtung. :-)

    Nun zu meinem Problem. Ich versuche, eine Listbox zu sortieren. Dafür gibt es verschiedene Algorythmen. Bei einer bestimmten Routine werde ich stutzig und frage mich, ob mein Delphi irgendwo fehlerhaft ist.

    Es werden im Programm 400 ZufallsDatums mit Randomize erstellt, und in der Listbox unsortiert ausgegeben und sollen nun sortiert werden, ohne 'Listbox.sorted'.


    Immer wieder derselbe Error:

    [IMG][/IMG]

    Ich versuche, den Fehler zu finden.

    Egal, wie ich es mache, hier ein paar Beispiele, wo es hängt:

    Code:
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
    MStr:TStrings;                                                               //<-(TStrings
    Lo,Hi:integer; 
    begin 
    MStr:=TStrings.Create; 
    Lo:=0; 
    Hi:=Listbox1.items.count-1; 
    Mstr:=TStrings(Listbox1.Items.Objects[(Lo + Hi)div 2]);  // <- Hier der <- EStringListERROR
    
    MStr.Destroy; 
    end;
    und hier:
    Code:
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
    MStr:TStringlist;                                                            //<-(TStringList
    Lo,Hi:integer; 
    begin 
    MStr:=TStringlist.Create; 
    Lo:=0; 
    Hi:=Listbox1.items.count-1; 
    Mstr:=TStringlist(Listbox1.Items.Objects[(Lo + Hi)div 2]);    //<- EStringListERROR
    
    MStr.Destroy; 
    end;
    und das geht auch nicht:
    Code:
    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 
      List: TStringlist; 
    begin 
      ZufallsDatumHinzufuegen; 
      List := TStringlist.Create; 
      try 
        ListBox1.Items.BeginUpdate; 
        try 
          List.Assign(ListBox1.Items); 
          List.CustomSort(@CompareDates);     //<- EStringListERROR
          ListBox1.Items.Assign(List); 
        finally 
          ListBox1.Items.EndUpdate; 
        end; 
      finally 
        List.Free; 
      end; 
    end;
    Es ist immerderselbe Fehler, wobei das hier funktionieren würde:

    Code:
    procedure TForm1.Button2Click(Sender: TObject); 
    var 
    MStr:string;                                                   //<-StringVariable
    Lo,Hi:integer; 
    begin 
    Lo:=0; 
    Hi:=Listbox1.items.count-1; 
    Mstr:=(Listbox1.Items[(Lo + Hi)div 2]);        //<- das geht
    Label2.caption:=MStr; 
    end;
    Was ist da mit meinem Delphi, oder was mache ich da noch falsch?

  • #2
    Listbox1.Items.Objects

    Objects ist nur relevant, wenn du der Liste einen Stringwert hinzufügst UND dabei diesen String noch ein Object zuordnest. Da du das wahrscheinlich nicht machst, gibt es keine Object in der Liste. Aus diesem Grund funktioniert das letzte Beispiel. Lies in der Hilfe unter TStrings nach

    Für das Compare-Beispiel
    List.Assign(ListBox1.Items);

    List.AddStrings benutzen
    Christian

    Comment

    Working...
    X