Solved

TList sort 2 items

Posted on 2004-08-25
4
244 Views
Last Modified: 2010-04-05
I'm making a class that looks like this...

type
  TUserInfo = class
  private
    Ffirst_name : string;
    Flast_name  : string;
    Fdid_ext    : string;
    Fdirect_no  : string;
    Fmobile_no  : string;
    Ftitle      : string;
    Fmail_addr  : string;
    Fdepartment : string;
  public
      property first_name : string
          read Ffirst_name;
      property last_name : string
          read Flast_name;
      property did_ext : string
          read Fdid_ext;
      property direct_no : string
          read Fdirect_no;
      property mobile_no : string
          read Fmobile_no;
      property title : string
          read Ftitle;
      property mail_addr : string
          read Fmail_addr;
      property department : string
          read Fdepartment;

      constructor Create(const Ffirst_name : string; const Flast_name  : string;
                         const Fdid_ext    : string; const Fdirect_no  : string;
                         const Fmobile_no  : string; const Ftitle      : string;
                         const Fmail_addr  : string; const Fdepartment : string);
  end;


I want to be able to sort this stuff on the fly in two scenarios..

Scenario 1: Sort by Last name
Scenario 2: Sort by Department (alphabetically) then by Last name

How would I go about doing this?

Also, what's the best way to clear the contents of a tlist in one shot?

0
Comment
Question by:gwarguitar
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 2

Expert Comment

by:gary_williams
ID: 11897648
Write a sort-compare function that you can pass as an argument into TList.CustomSort.

The easiest way to clear a TList is to call the "Clear" method of TList.
0
 
LVL 2

Expert Comment

by:gary_williams
ID: 11897680
function SortCompareByLastName(Item1, Item2: Pointer): Integer;
var
  UserInfo1: TUserInfo;
  UserInfo2: TUserInfo;
begin
  UserInfo1 := Item1; // no typecast needed
  UserInfo2 := Item2;
  Result := CompareText(UserInfo1.Last_Name, UserInfo2.Last_Name);
end;

Then call List.Sort(SortCompareByLastName);

To sort by department and then by last name, call Sort twice, first passing SortCompareByLastName, then SortCompareByDepartment (which would be very similar).
0
 

Author Comment

by:gwarguitar
ID: 11898090
the first part works, but calling sort twice only resorts it back to whatever the last one called is.

any ideas there?

also, clear doesn't seem to work, anytime i rebuild a listview with tlist info, all my tlist info is displayed again...
i am calling the clear on the listview as well...
0
 
LVL 2

Accepted Solution

by:
gary_williams earned 250 total points
ID: 11899064
TList.Clear removes all items from the list.  You can watch List.Count before and after the call and you'll see for yourself.  The problem must lie elsewhere, but without seeing your code, I can't help much.

Sorting by the minor field and then by the major field should have the intended effect.  However, TList.Sort uses the QuickSort algorithm, and we really need at least the last of the two sorts to be stable (e.g. use ShellSort, etc.).

An alternative is to combine the two sorts into one SortCompare function.

 function SortCompareByDepartmentAndLastName(Item1, Item2: Pointer): Integer;
var
  UserInfo1: TUserInfo;
  UserInfo2: TUserInfo;
begin
  UserInfo1 := Item1; // no typecast needed
  UserInfo2 := Item2;
  Result := CompareText(UserInfo1.Department, UserInfo2.Department);
  if (Result = 0) then
    Result := CompareText(UserInfo1.Last_Name, UserInfo2.Last_Name);
end;
0

Featured Post

Enroll in June's Course of the Month

June’s Course of the Month is now available! Experts Exchange’s Premium Members, Team Accounts, and Qualified Experts have access to a complimentary course each month as part of their membership—an extra way to sharpen your skills and increase training.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
In this video we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…
Monitoring a network: how to monitor network services and why? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the philosophy behind service monitoring and why a handshake validation is critical in network monitoring. Software utilized …

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question