StringGridの数値Sort

解決


ester  2005-05-31 21:46:09  No: 15232

StringGridの数値Sortを以下のように書いて実行するとエラーになります。
原因はCustomSortあたりにありそうですが・・・?

procedure TForm1.GridSort(Sg: TStringGrid; SortCol: Integer);
var St1,St2:TStringList;
    i:Integer;
    SortCompare:TStringListSortCompare;
begin
  St1:=TStringList.Create;
  ST1.Assign(Sg.Cols[SortCol]);
  For i:=Sg.FixedRows To Sg.RowCount-1 Do Begin
    St2:=TStringList.Create;
    St2.Assign(Sg.Rows[i]);
    St1.Objects[i-Sg.FixedRows]:=St2;End;
  St1.CustomSort(SortCompare);
  For i:=Sg.FixedRows To Sg.RowCount-1 Do Begin
    Sg.Rows[i].Assign(TStringList(St1.Objects[i-Sg.FixedRows]));
    TStringList(St1.Objects[i-Sg.FixedRows]).Free;End;
  St1.Free;
end;
//------------------
function TForm1.SortCompare(St: TStringList; Index1,
  Index2: Integer): Integer;
var V1,V2:integer;
begin
  V1:=StrToInt(St[Index1]);
  V2:=StrToInt(St[Index2]);
  if V1=V2 then result:=0
  else if V1>V2 then result:=1
  else result:=-1;
end;


deldel  2005-05-31 21:56:24  No: 15233

昔、こんなコードを書いたことがあります。
これは参考になりませんでしょうか?
数値だと桁合わせをしないといけませんが・・・

procedure pGdColSort(Gd: TStringGrid; ColNo: integer; boUpDown: Boolean);
{
Gd      : 対象グリッド名
ColNo   : 対象列
boUpDown: 昇順(True)降順(False)
}
var
  SL: TStringList;
  r: integer;
begin
  SL := TStringList.Create;
  try
    SL.Sorted := False;
    for r := 0 to Gd.RowCount - 1 do begin
      SL.Add(Gd.Cells[ColNo, r] + ',' + Gd.Rows[r].CommaText);
    end;
    SL.Sorted := True;

    for r := 0 to Gd.RowCount - 1 do begin
      if boUpDown then
        //昇順
        Gd.Rows[r].CommaText := Copy(SL[r], Pos(',', SL[r]) + 1, 255)
      else
        //降順
        Gd.Rows[r].CommaText := Copy(SL[Gd.RowCount - 1 - r], Pos(',', SL[Gd.RowCount - 1 - r]) + 1, 255);
    end;
  finally
    SL.Free;
  end;
end;


ester  2005-06-01 20:53:34  No: 15234

deldelさん、素晴らしく簡潔なコードをありがとうございました。
桁あわせは 
SL.Add(rightstr('********'+Gd.Cells[ColNo, r],6) + ',' + Gd.Rows[r].CommaText);
でいいと思うのですが、マイナス値はどう扱えばいいでしょうか?


deldel  2005-06-01 21:53:27  No: 15235

う!マイナス値ですか・・・
マイナスがあるとソートが変になりますねぇ・・・
そこで正数の頭に+を付けてみましたが・・・(´ヘ`;)
すぐには解りそうもないかもです;;


Basser  2005-06-01 23:55:58  No: 15236

>StringGridの数値Sortを以下のように書いて実行するとエラーになります。
>原因はCustomSortあたりにありそうですが・・・?

TStringListSortCompare は手続きポインタです。

>function TForm1.SortCompare(St: TStringList; Index1,
>  Index2: Integer): Integer;

上記はメソッドポインタで手続きポインタとは非互換の為、エラーとなります。
詳しくはヘルプの手続き型を見て下さい。


ester  2005-06-02 02:25:03  No: 15237

function SortCompare(St: TStringList; Index1,Index2: Integer):Integer;
で解決しました。貴重なsuggestionをありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加