いつもお世話になっています.
StringGridの並べ替えを行いたいです.
取り敢えず,下記のやりかたで出来ているのですが,
URL:https://www.petitmonte.com/bbs/answers?question_id=980
数値(正負)の場合,並び替えが上手く出来ません.
原因としては,StringListで並び替えているからだと思われます.
他に良い方法はありませんか?
かなりDelphi初心者です.宜しくお願いします.
StringGridを並び替えている関数です.
引数1:StringGrid名,引数2:優先する列
Procedure GridSort(Grid: TStringGrid; SortCol: Integer);
var
str_St1: TStringList;
str_St2: TStringList;
int_i: Integer;
begin
str_St1 := TStringList.Create;
str_St1.Assign(Grid.Cols[SortCol]);
for int_i := 1 To Grid.FixedRows Do
str_St1.Delete(0);
for int_i := 0 to str_St1.Count - 1 do
str_St1.Strings[int_i] := str_St1.Strings[int_i] + #1 + Format('%.10d',[int_i]);
for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
str_St2 := TStringList.Create;
str_St2.Assign(Grid.Rows[int_i]);
str_St1.Objects[int_i - Grid.FixedRows] := str_St2;
end;
str_St1.Sort;
for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
Grid.Rows[int_i].Assign(TStringList(str_St1.Objects[int_i - Grid.FixedRows]));
TStringList(str_St1.Objects[int_i - Grid.FixedRows]).Free;
end;
str_St1.Free;
end;
StringGridの中身を以下のように並び替えたいです.優先列を1列目にする.
<並び替え前>
[-2] [A]
[ 2] [D]
[-1] [B]
[ 1] [C]
<並び替え後>
[-2] [A]
[-1] [B]
[ 1] [C]
[ 2] [D]
宜しくお願いします.
色々方法はあるでしょうが
数字を文字に変換する時
マイナスの時は−を取り
プラスの時は100000をプラスするとかではどうでしょうか
-2 -> 2, 2 -> 100002
TSさん解答ありがとうございます.
これでは以下のような場合,上手くいきません.
<並び替え前>
[-2] [A]
[-1] [B]
[ 0] [C]
[ 1] [D]
[ 2] [E]
<負は−を取り,0以上は10を足す作業を行う>
[ 2] [A]
[ 1] [B]
[10] [C]
[11] [D]
[12] [E]
<並び替える>
[ 1] [B]
[ 2] [A]
[10] [C]
[11] [D]
[12] [E]
<値を元に戻す>
[-1] [B] ←-2の方が小さいはずなのに
[-2] [A] ←上手くいかない.
[ 0] [C]
[ 1] [D]
[ 2] [E]
他に上手い方法はありませんか?
宜しくお願いします.
自分なりに考えて,以下の手法で取り敢えず解決しました.
数字を文字に変換する時
マイナスの時は−を取って,(10-マイナスを取った値)とする.
プラスの時は10をプラスする
-2 -> 8, 2 -> 12
この値で並び替えて使用することにしました.
ありがとうございました.
既に解決済ですが
マイナスになる数字の範囲が判っていれば
全ての数に+100000とかしてもいいかも
-1 ->99999 -2 ->99998 1 ->100001
とにかく文字にした時どう並び替えられるかが問題です。
丁寧な回答ありがとうございました.
これも参考にもう一度検討してみます.
ありがとうございました.
ツイート | ![]() |