You spoil me Walter! That works perfectly and gets rid of all that 'unpleasantness' - Thanks a million.
Now, all I have to do is find that memory leak..... Regards Dave Walter Prins wrote: >----- Original Message ----- >From: "Dave Sellers" <[EMAIL PROTECTED]> >To: <[email protected]> >Sent: Friday, June 03, 2005 2:13 PM >Subject: [list] [delphi-en] TObjectList.Sort issues > > > > >>I'm using TObjectList.Sort successfully but, I suspect, not particularly >>elegantly. In fact, I have a suspicion I'm doing something dumb.. >> >> > >I've gone ahead and knocked up an extended TObjectList class, to support >object method comparison methods. Apologies if this source is longer than >should be posted to the list. > >Regards > >Walter > > >================================== >unit uObjectListEx; > >{ 04/06/2005: The TObjectListEx extends TObjectList to allow slightly more >object > oriented delegation of the sort responsibility (ie, it expects an object >method to be > supplied to the Sort call, as opposed to a pure function pointer, as >present in TObjectList.) > A pure funtion pointer is sometimes problematic in contexts where the sort >operation requires access > to context held in an object. This extension help avoid some of that >awkwardness, though it > still requires typecasting in the supplied sort method to get at sort >object properties. } > >interface > >uses Contnrs; > >type > TObjectListSortCompareMethod = function (Obj1, Obj2 : TObject) : Integer >of Object; > TObjectListEx = class(TObjectList) > private > procedure QuickSort(L, R: Integer; > SCompare: TObjectListSortCompareMethod); > public > procedure Sort(CompareMethod: TObjectListSortCompareMethod); > end; > >implementation > >{ TObjectListEx } > >procedure TObjectListEx.QuickSort(L, R: Integer; > SCompare: TObjectListSortCompareMethod); >var > I, J: Integer; > P, T: Pointer; >begin > { 04/06/2005: This method is based on QuickSort procedure from >Classes.pas, (c) Borland Software Corp. > but modified to be part of TObjectListEx class. It implements the >standard quicksort algorithm, > delegating comparison operation to an object method. The Borland >version delegates to a pure function > pointer, which is problematic in some cases.} > repeat > I := L; > J := R; > P := List^[(L + R) shr 1]; > repeat > while SCompare(TObject(List^[I]), P) < 0 do > Inc(I); > while SCompare(TObject(List^[J]), P) > 0 do > Dec(J); > if I <= J then > begin > T := List^[I]; > List^[I] := List^[J]; > List^[J] := T; > Inc(I); > Dec(J); > end; > until I > J; > if L < J then > QuickSort(L, J, SCompare); > L := I; > until I >= R; >end; > >procedure TObjectListEx.Sort(CompareMethod: TObjectListSortCompareMethod); >begin > if (List <> nil) and (Count > 0) then > QuickSort(0, Count - 1, CompareMethod); >end; > >end. >================================== >unit uObjectListExTestForm; > >{Demo/Test form for TObjectListEx} > >interface > >uses > Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, > Dialogs, uObjectListEx, StdCtrls; > >type > // a little class used for demo/testing > TSortObj = class > Name : String; > constructor Create(AName : String); > end; > > TObjectListExTestForm = class(TForm) > Memo: TMemo; > SortButton: TButton; > PopulateMemoButton: TButton; > procedure FormCreate(Sender: TObject); > procedure FormDestroy(Sender: TObject); > procedure SortButtonClick(Sender: TObject); > procedure PopulateMemoButtonClick(Sender: TObject); > private > { Private declarations } > FObjectlist : TObjectListEx; > function MyCompareMethod(Obj1, Obj2 : TObject) : Integer; > public > { Public declarations } > end; > >var > ObjectListExTestForm: TObjectListExTestForm; > >implementation > >{$R *.dfm} > >{ TSortObj } > >constructor TSortObj.Create(AName: String); >begin > Name := AName; >end; > >{ TObjectListExTestForm } > >procedure TObjectListExTestForm.FormCreate(Sender: TObject); >begin > FObjectList := TObjectListEx.Create; > FObjectList.OwnsObjects := True; > FObjectList.Add(TSortObj.Create('John')); > FObjectList.Add(TSortObj.Create('Peter')); > FObjectList.Add(TSortObj.Create('Zelda')); > FObjectList.Add(TSortObj.Create('Amelie')); >end; > >procedure TObjectListExTestForm.FormDestroy(Sender: TObject); >begin > FObjectlist.Free >end; > >procedure TObjectListExTestForm.SortButtonClick(Sender: TObject); >begin > FObjectlist.Sort(MyCompareMethod); >end; > >function TObjectListExTestForm.MyCompareMethod(Obj1, Obj2: TObject): >Integer; >var > SortObj1, SortObj2 : TSortObj; >begin > SortObj1 := TSortObj(Obj1); > SortObj2 := TSortObj(Obj2); > result := CompareStr(SortObj1.Name, SortObj2.Name); >end; > >procedure TObjectListExTestForm.PopulateMemoButtonClick(Sender: TObject); >var > ObjIndex : Integer; >begin > Memo.Lines.Clear; > for ObjIndex := 0 to FObjectlist.Count -1 do > Memo.Lines.Add(TSortObj(FObjectList[ObjIndex]).Name); >end; > >end. > > > > > >----------------------------------------------------- >Home page: http://groups.yahoo.com/group/delphi-en/ >To unsubscribe: [EMAIL PROTECTED] >Yahoo! Groups Links > > > > > > > > > > ----------------------------------------------------- Home page: http://groups.yahoo.com/group/delphi-en/ To unsubscribe: [EMAIL PROTECTED] Yahoo! Groups Links <*> To visit your group on the web, go to: http://groups.yahoo.com/group/delphi-en/ <*> To unsubscribe from this group, send an email to: [EMAIL PROTECTED] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/

