using TlistSortCompare to sort Tlist

Hi, I know you can write a custom sorting function for Tlists but I can't work out how you actually define/call it.  I have defined Tjob as an object and one of its properties is StartTime :TdateTime.  I then have a list JobList:TJobList full of Tjob instances (or pointers to).  Please can you tell me how to call Joblist.sort() so that it calls a custom function to sort these all by starttime.  I know I have to create a TlistSortCompare function but just not sure how!  Thanks v much, P.
 
LVL 1
PandoraAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
AvonWyssConnect With a Mentor Commented:
Try this:


function JobListCompare(Item1, Item2: Pointer): Integer;
var
    Job1: TJobItem absolute Item1;
    Job2: TJobItem absolute Item2;
begin
    if Job1.StartTime<Job2.StartTime then
        Result:=1
    else if Job1.StartTime>Job2.StartTime then
        Result:=-1
    else
        Result:=0;
end;

[...]
    JobList.Sort(JobListCompare);
[...]
0
 
AvonWyssCommented:
function JobListCompare(Item1, Item2: Pointer): Integer;
var

begin
     if TJobItem(Item1).StartTime>
end;
0
 
SlavakCommented:
you can write it shorter:

function JobListCompare(Item1, Item2: Pointer): Integer;
var
   Job1: TJobItem absolute Item1;
   Job2: TJobItem absolute Item2;
begin
 Result := Job2.StartTime - Job1.StartTime;
end;



0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
AvonWyssCommented:
Slavak, TDateTime is not an integer. Thus your version will fail. However, the following could be used:

function JobListCompare(Item1, Item2: Pointer): Integer;
var
    Job1: TJob absolute Item1;
    Job2: TJob absolute Item2;
    Temp: TDateTime;
begin
    Temp:=Job2.StartTime-Job1.StartTime;
    Result:=Ord(Temp>0)-Ord(Temp<0);
end;
0
 
rondiCommented:
I thought the rules were
Item1 < Item2 -> -1
Item1 > Item2 -> 1
Item1 = Item2 -> 0

So shouldn't it be

   if Job1.StartTime < Job2.StartTime then
       Result := -1
   else if Job1.StartTime > Job2.StartTime then
       Result := 1
   else
       Result := 0;

???

which could be re-written as:

   Result := -1 + (2 * (Job1.StartTime > Job2.StartTime)) + (Job1.StartTime = Job2.StartTime);


rondi
0
 
AvonWyssCommented:
rondi, it depends whether the newest or the oldest dates should be listed first. However, the basic idea should be visible pretty well. BTW, you forgot to add "Ord()" around your boolean equations, and if you want to do two comparisons why not do it like this:

  Result:=Ord(Job1.StartTime>Job2.StartTime)-Ord(Job1.StartTime<Job2.StartTime);

If StartTime is a property which is not a field (e.g. involves a function call), this will be less efficient than storing the result in a temp variable. Since comparisons are called quite often when sorting, I think that speed could become an issue.
0
 
PandoraAuthor Commented:
Call me old fashioned but I'm gonna go for the long hand version!  Thanks v much for all your comments, I would never have got the 'absolute' part! Best wishes, P.
0
 
AvonWyssCommented:
Pandora, the "absolute" part is not an absolute neccesity but rater to make things easier. You could also use typecasts to cast the pointers to your TJob classes, but the result would be the same.
0
 
PandoraAuthor Commented:
Gotcha - thanks v much! P :)
0
 
rondiCommented:
Avon: I stand corrected :)
0
All Courses

From novice to tech pro — start learning today.