Rob and guys,

Rob,

Here is the solution, I had the code writen when I asked the question, 
what I was missing was doing wrong was using this declaration:

TListViewItemComparer = Class(IComparer)

Which should really be:

TListViewItemComparer = Class(TObject, IComparer)

Here is the full code if some one needs it:

unit ListViewComparerClass;

(*
Things to do:

  TWinFormMain = class(System.Windows.Forms.Form)
    ......
    Private
      ListViewItemComparer: TListViewItemComparer;
      ....
  End;

  constructor TWinFormMain.Create;
  Begin
    .....
    ListViewItemComparer := TListViewItemComparer.Create;
     Self.ListViewAddressManager.ListViewItemSorter := 
ListViewItemComparer;
    ....
  End;

   
{========================================================================
======}
   procedure TWinFormMain.ListViewAddressManager_ColumnClick(sender: 
System.Object; e: System.Windows.Forms.ColumnClickEventArgs);
   
{========================================================================
======}
  begin
    If (e.Column = ListViewItemComparer.SortColumn) Then
    Begin
      If (ListViewItemComparer.SortOrder = SortOrder.Ascending) Then
      Begin
        ListViewItemComparer.SortOrder := SortOrder.Descending;
      End
      Else
      Begin
        ListViewItemComparer.SortOrder := SortOrder.Ascending;
      End;
    End
    Else
    Begin
      ListViewItemComparer.SortColumn := e.Column;
      ListViewItemComparer.SortOrder := SortOrder.Ascending;
    End;
    ListViewAddressManager.Sort;
  end;

*)

interface

Uses
   System.Drawing, System.Collections, System.ComponentModel, 
System.Reflection,
  System.Windows.Forms, System.Data, System.Resources, System.IO;

Type
  TListViewItemComparer = Class(TObject, IComparer)
  Private
    fColumnToSort: Integer;
    fOrderOfSort: SortOrder;
    ObjectCompare: CaseInsensitiveComparer;
  Protected
  Public
    Property SortColumn: Integer Read fColumnToSort Write fColumnToSort;
     Property SortOrder: System.Windows.Forms.SortOrder Read 
fOrderOfSort Write fOrderOfSort;
    Constructor Create;
    //Destructor Free;
    Function Compare(x, y: TObject): Integer;
  End;

implementation

{========================================================================
======}
Constructor TListViewItemComparer.Create;
{========================================================================
======}
Begin
  Inherited Create;
  fColumnToSort := 0;
  fOrderOfSort := System.Windows.Forms.SortOrder.None;
  ObjectCompare := CaseInsensitiveComparer.Create;
End;

{========================================================================
======}
Function TListViewItemComparer.Compare(x, y: TObject): Integer;
{========================================================================
======}
Var
  listviewX, listviewY: ListViewItem;
  iCompareResult: Integer;


Begin
  listviewX := ListViewItem(x);
  listviewY := ListViewItem(y);
   iCompareResult := 
ObjectCompare.Compare(listviewX.SubItems[fColumnToSort].Text, 
listviewY.SubItems[fColumnToSort].Text);
  If (fOrderOfSort = System.Windows.Forms.SortOrder.Ascending) Then
  Begin
    Result := iCompareResult
  End
  Else
  Begin
    If (fOrderOfSort = System.Windows.Forms.SortOrder.Descending) Then
    Begin
      Result := (iCompareResult * -1);
    End
    Else
    Begin
      Result := 0;
    End;
  End;
End;

end.



Bjarne \v/
Bjarne's Virtual Office at http://www.go2nts.com/bwtoday.html

------------------------------

Message: 7
Date: Mon, 09 Jan 2006 14:19:10 -0600
From: Rob Kennedy <[EMAIL PROTECTED]>
Subject: Re: ListView Column sort under Delphi Dot Not (2005 or 2006)
To: "Borland's Delphi Discussion List" <[email protected]>
Message-ID: <[EMAIL PROTECTED]>
Content-Type: text/plain; charset=UTF-8; format=flowed

[EMAIL PROTECTED] wrote:
> I am using the ListView on a form and I want to sort the columns.  
You
> can do that by creating a ListViewItemCompare class driven from the
> IComparer interface. However when I try to do so in Delphi Dot Net I
> get and error that it does not know what the IComparer is. Do you 
know
> how to do this in Delphi Dot Net?

It looks like you should use the ListView object's ListViewItemSorter
property, in conjunction with the Sort property. ListViewItemSorter is 
a
System.Collections.IComparer, which has a Compare method that takes two
Objects and returns an Integer.

Write any class you want, and make sure it implements the IComparer
interface. Then assign an instance of that class to the
ListViewItemSorter property.

--
Rob


_______________________________________________
Delphi mailing list -> [email protected]
http://www.elists.org/mailman/listinfo/delphi

Reply via email to