Announcement

Collapse
No announcement yet.

Spalte einer ListView sotieren

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

  • Spalte einer ListView sotieren

    Hi,
    ich möchte eine Spalte einer ne ListView sotieren. In der Spalte steht immer datum+uhrzeit z.b. 03.03.03 12:30:02
    Wenn ich dass mit SortType mache, dann sotiert dass Programm völlig verkehrt.
    THX david

  • #2
    Moin David,<br>
    meine Erfahrung mit TListview ist, dass man getroßt auf die internen Sortierungmechanismen verzichten kann.<br>
    TListView sortiert nämlich alles alphbetisch. Zum Glück kennt TListView aber die Ereignisse OnColumnClick<br>
    und OnCompare. In OnColumnClick mußt Du Dir den Spaltenindex merken und die Methode Alphasort<br>
    aufrufen. TLisView löst dann während der Sortierung das Ereignis OnCompare auf. Dies ist die Stelle, an der<br>
    Du eingreifen kannst, in dem Du Dir eine eigene Compare-Fuktion schreibst. Wenn eine Spalte eine Datum enthält,<br>
    so kannst Du das Datum vor dem Vergleich in einen TDatetime-Wert umwandeln. Dann klappt auch die Sortierung.<br>
    Hier jetzt der Code:<br>
    <pre>
    <font face="Verdana" size="1" color="#000000">unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ComCtrls;

    type
    TForm1 = class(TForm)
    ListView1: TListView;
    procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn);
    procedure ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
    Data: Integer; var Compare: Integer);
    procedure FormCreate(Sender: TObject);
    private
    { Private-Deklarationen }
    FSortColumnIndex : Integer;
    FSortDir : Boolean;
    function CompareInteger(ColumnIndex : Integer; Item1,Item2 : TListItem) : Integer;
    function CompareDateTime(ColumnIndex : Integer; Item1,Item2 : TListItem) : Integer;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
    begin
    FSortColumnIndex:=Column.Index; // Spalte merken
    (Sender as TCustomListView).AlphaSort;
    FSortDir:=Not FSortDir; // Für den nächsten Klick Sortierrichtung umkehren
    end;

    procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
    Data: Integer; var Compare: Integer);
    begin
    Case FSortColumnIndex of
    0 : Compare:=CompareInteger(FSortColumnIndex,Item1,Ite m2); // erste Spalte enthält einen Integer
    1 : Compare:=CompareDateTime(FSortColumnIndex,Item1,It em2); // zweite Spalte enthält ein Datum
    end;
    If Not FSortDir then // Sortierrichtung berücksichtigen
    Compare := Compare * (-1);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    var
    iCnt : Integer;
    Item : TListItem;
    begin
    For iCnt:=0 to 19 do
    begin
    Item:=ListView1.Items.Add;
    Item.Caption:=IntToStr(iCnt+1);
    Item.SubItems.Add(IntToStr(Random(31)+1)+'.'+IntTo Str(Random(12)+1)+'.2002');
    end;
    end;

    function TForm1.CompareDateTime(ColumnIndex: Integer; Item1,Item2: TListItem): Integer;
    var
    SubItemIndex : Integer;
    V1 : TDateTime;
    V2 : TDateTime;
    begin
    Result:=0;
    If ColumnIndex=0 then
    begin
    V1:=StrToDate(Item1.Caption);
    V2:=StrToDate(Item2.Caption);
    end
    else
    begin
    SubItemIndex:=ColumnIndex-1;
    V1:=StrToDate(Item1.SubItems[SubItemIndex]);
    V2:=StrToDate(Item2.SubItems[SubItemIndex]);
    end;
    If V1>V2 then
    Result:=1
    else
    If V1<V2 then
    Result:=-1;
    end;

    function TForm1.CompareInteger(ColumnIndex: Integer; Item1,Item2: TListItem): Integer;
    var
    SubItemIndex : Integer;
    V1 : Integer;
    V2 : Integer;
    begin
    Result:=0;
    If ColumnIndex=0 then
    begin
    V1:=StrToInt(Item1.Caption);
    V2:=StrToInt(Item2.Caption);
    end
    else
    begin
    SubItemIndex:=ColumnIndex-1;
    V1:=StrToInt(Item1.SubItems[SubItemIndex]);
    V2:=StrToInt(Item2.SubItems[SubItemIndex]);
    end;
    If V1>V2 then
    Result:=1
    else
    If V1<V2 then
    Result:=-1;
    end;

    end.</font>
    </pre&gt

    Comment


    • #3
      Moin David,<br>
      jetzt noch das Formular<br>
      <pre>
      <font face="Verdana" size="1" color="#000000">object Form1: TForm1
      Left = 209
      Top = 107
      Width = 283
      Height = 480
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object ListView1: TListView
      Left = 36
      Top = 28
      Width = 204
      Height = 389
      Columns = &lt;
      item
      Caption = 'ID'
      end
      item
      Alignment = taRightJustify
      Caption = 'Datum'
      Width = 150
      end&gt;
      TabOrder = 0
      ViewStyle = vsReport
      OnColumnClick = ListView1ColumnClick
      OnCompare = ListView1Compare
      end
      end</font>
      </pre&gt

      Comment


      • #4
        Hallo Jens ;o)...
        läßt sich diese Funktion auch für ein StringGrid anwenden und wenn ja wie kann ich dies machen. Ich habe bisher verschiedene Routinen für das sortieren von Datumswerten eines StringGrid's ausprobiert und bisher hat nichts wirklich funktioniert.
        Ich bedanke mich schon für eine mögliche Lösung, Gruß Mari

        Comment

        Working...
        X