お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"xコラム目でソートする例"



X以上の項目数を持つCSV形式のレコード複数をTStringListに持っています。
StringLIst[0] は 21,32,ada,4534
StringList[1] は 33,53,gsd,2522
 ・
 ・
 てなかんじ。

そこで、Xコラム目をキーにしてソートしたい というときに使うUnitです。
今回のサンプルのように文字列同士を単純に比較するのであればTListを使わず、
TStringListにAddObjectした方が楽ですが、汎用性を持たせるためにTListを使
いました。ですから、降順にしたいとか、値でソートしたいとかいう場合は
function ColumnSortCompareの比較式を変更すればOK。



unit ColumnSorts;

interface
uses classes;

procedure ColumnSort(target: TStringList; Column: integer);

implementation

type
   TSortRec=Record
      FKey,FContent:String; end;
   PSortRec=^TSortRec;

//用途に応じて比較内容を変更して下さい
function ColumnSortCompare(item1,item2:pointer):integer;
begin
   if PSortRec(item1)^.FKey>PSortRec(item2)^.FKey then result:=1
   else if PSortRec(item1)^.FKey=PSortRec(item2)^.FKey then result:=0 
else result:=-1;
end;

procedure ColumnSort(target: TStringList; Column: integer);
var
   i:integer;
   SL:TStringList;
   List:TList;
   procedure AddToList(item:string);
   var
      SR:PSortRec;
   begin //分解してColumn目をFKeyに入れListに登録
      New(SR);
      SR^.FContent:=item;
      SL.CommaText:=item;
      SR^.FKey:=SL[Column];
      List.Add(SR);
   end;
begin
   List:=TList.Create;
   try
   SL:=TStringList.Create;
   try
      for i:= 0 to target.Count-1 do
         AddToList(target[i]);
   finally
      SL.Free;
   end;
   List.Sort(ColumnSortCompare);
   target.Clear;
   for i:= 0 to List.Count-1 do
      target.Add(PSortRec(List[i])^.FContent);
   finally
      for i:= 0 to List.Count-1 do
         dispose(PSortRec(List[i]));
      List.Free;
   end;
end;

end.


//使用例 FormにボタンとTListBoxを一つづつおいた状態で、ボタンのクリック
イベントを以下のようにします。
procedure TForm1.Button1Click(Sender: TObject);
var
   i,j:integer;
   s:string;
   sl:TStringList;
begin
   sl:=TStringList.Create;
   for i:= 0 to 10 do
   begin
     s:='';
     for j:= 0 to 10 do
        s:=s+inttostr(random(10))+',';
     s:=s+inttostr(random(10));
     sl.Add(s);
   end;
   ColumnSort(sl,2);
   ListBox1.Items.Assign(sl);
   sl.Free;
end;

☆☆☆  かわいいコードにゃ旅をさせよう いざサンプル蔵へ!! ☆☆☆
                                 99/06/13(日) 18:46 凛(MXB01744)

Original document by 凛              氏 ID:(MXB01744)


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

Copyright 1996-2002 Delphi Users' Forum