お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"メソッドでソートするList"

この発言に対し以下のコメントが寄せられています
#01061 TN さん メソッドでソートするList

TListのSortメソッドは比較関数に「ただの関数」を使うので,複数のListを同時 に生成して別々のデータが入っていたりするとき,区別する機能がありません. 言い換えるとオブジェクト指向が不十分で不便です.リエントラントにするのも ロックするのが関の山.  そこで,Sortの引数にメソッドポインタを取る派生型を作りました. 使い方はSortの引数に入れる比較関数をオブジェクトのメソッドとして作る以外, TListとまったく同じです. ex. function SComp( Item1, Item2: Pointer ): integer; 注)SortもQuickSortも override できないので,このリストのインスタンス を扱う人が派生もとの TList 扱いしてSortした場合,新メソッドは呼ばれません. ///////////////////////////////////////////////////////////////////////////// type TListSortCompareMethod = function(Item1, Item2: Pointer):Integer of object; TObjSortList = class(TList) protected procedure QuickSort( SortList: TList; L, R: Integer; SCompare: TListSortCompareMethod ); public procedure Sort( Compare: TListSortCompareMethod ); end; ///////////////////////////////////////////////////////////////////////////// procedure TObjSortList.QuickSort( SortList: TList; L, R: Integer; SCompare: TListSortCompareMethod ); var I, J: Integer; P, T: Pointer; begin repeat I := L; J := R; P := SortList[(L + R) shr 1]; repeat while SCompare(SortList[I], P) < 0 do Inc(I); while SCompare(SortList[J], P) > 0 do Dec(J); if I <= J then begin T := SortList[I]; SortList[I] := SortList[J]; SortList[J] := T; Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(SortList, L, J, SCompare); L := I; until I >= R; end; procedure TObjSortList.Sort(Compare: TListSortCompareMethod); begin if Count > 0 then QuickSort(Self, 0, Count - 1, Compare); end; TN(CQJ01721) Original document by TN 氏 ID:(CQJ01721)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum