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;
昔、こんなコードを書いたことがあります。
これは参考になりませんでしょうか?
数値だと桁合わせをしないといけませんが・・・
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;
deldelさん、素晴らしく簡潔なコードをありがとうございました。
桁あわせは
SL.Add(rightstr('********'+Gd.Cells[ColNo, r],6) + ',' + Gd.Rows[r].CommaText);
でいいと思うのですが、マイナス値はどう扱えばいいでしょうか?
う!マイナス値ですか・・・
マイナスがあるとソートが変になりますねぇ・・・
そこで正数の頭に+を付けてみましたが・・・(´ヘ`;)
すぐには解りそうもないかもです;;
>StringGridの数値Sortを以下のように書いて実行するとエラーになります。
>原因はCustomSortあたりにありそうですが・・・?
TStringListSortCompare は手続きポインタです。
>function TForm1.SortCompare(St: TStringList; Index1,
> Index2: Integer): Integer;
上記はメソッドポインタで手続きポインタとは非互換の為、エラーとなります。
詳しくはヘルプの手続き型を見て下さい。
function SortCompare(St: TStringList; Index1,Index2: Integer):Integer;
で解決しました。貴重なsuggestionをありがとうございました。
ツイート | ![]() |