|
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
|