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/
 


Reply via email to