お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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