|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"StringGridの並べ替え(2重)"
{クイックソートを利用したStringGridの優先順位付ソート}
{下の例では0列目を対象に1次ソートを、1列目を対象に2次ソートを
行っている}
Form1にStringGridとButtonとRadioButton(x2)を配して
{interface 部}
private
{ Private 宣言 }
TempS:TStringList;
procedure QSort(const p, q, ColNum: integer; Dsc:boolean);
{implementation 部}
procedure TForm1.QSort(const p, q, ColNum: integer; Dsc: boolean);
var
i, j: integer;
S: string;
begin
i := p;
j := q;
S :=StringGrid1.Cells[ColNum, (p + q) div 2];
repeat
if Dsc then
begin
while StringGrid1.Cells[ColNum, i] > S do Inc(i);
while S > StringGrid1.Cells[ColNum, j] do Dec(j);
end else
begin
while StringGrid1.Cells[ColNum, i] < S do Inc(i);
while S < StringGrid1.Cells[ColNum, j] do Dec(j);
end;
if i <= j then
begin
TempS.Assign(StringGrid1.Rows[i]);
StringGrid1.Rows[i].Assign(StringGrid1.Rows[j]);
StringGrid1.Rows[j].Assign(TempS);
Inc(i);
Dec(j);
end;
until i > j;
if p < j then QSort(p, j, ColNum, Dsc);
if i < q then QSort(i, q, ColNum, Dsc);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
m,n,ColNum1,ColNum2:integer;
begin
TempS:=TStringList.Create;
{Primary Sort}
ColNum1:=0; // Col Number For Primary Sort
QSort(1, StringGrid1.RowCount-1, ColNum1, RadioButton1.Checked);
{Secondary Sort}
ColNum2:=1; // Col Number For Secondary Sort
m := 1;
n := 1;
repeat
repeat
Inc(n);
if n = StringGrid1.RowCount then break;
until StringGrid1.Cells[ColNum1, m] <>
StringGrid1.Cells[ColNum1,n];
if n - m >1 then
QSort(m, n-1, ColNum2, RadioButton2.Checked);
m:= n;
until n = StringGrid1.RowCount;
TempS.Free;
end;
{
クイックソートは、かつてMes 8で教えてもらいました。
ζξζ〜 六角〔〕 三房 ‰ Rokkaku Sanbou
\__/ 11997/ 10/ 24, Friday, 17:46
 ̄ CXE02604@niftyserve.or.jp_ [Sasaki, K.] @Abiko
}
Original document by 六角三房 氏 ID:(CXE02604)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|