Есть таблица StringGrid, в фиксированной строке создаются кнопки SpeedButton, к ним привязывается событие OnClick, в событии сортировка:
Код:
procedure TMainForm.SGSortToCol(Sender: TObject);
var
SlSort, SlRow : TStringList;
i, j, aCol,LMax : Integer;
SG: TStringGrid;
begin
aCol:=StrToInt(TSpeedButton(Sender).Name[Length(TSpeedButton(Sender).Name)]); //получаем номер сортируемой колонки
SG:=TStringGrid(TSpeedButton(Sender).Parent); //получаем имя таблицы
LMax:=Length(SG.Cells[aCol,1]);
SlSort:= TStringList.Create;
SlSort.Sorted:=False;
for i:=1 to SG.RowCount-1 do begin
SlRow:=TStringList.Create;
SlRow.Assign(SG.Rows[i]);
SlSort.AddObject(SG.Cells[aCol, i], SlRow);
if Length(SG.Cells[aCol,i])>LMax then //ищем строку с максимальным кол-вом символов
LMax:=Length(SG.Cells[aCol,i]);
end;
for i:=0 to SlSort.Count-1 do
while Length(SlSort[i])<>lmax do
SlSort[i]:=' '+SlSort[i]; //выравниваем кол-во пробелов
showmessage(SlSort.Text);
SlSort.Sort;
j := 0;
for i := 1 to SG.RowCount - 1 do begin
SlRow := Pointer(SlSort.Objects[j]);
SG.Rows[i].Assign(SlRow);
SlRow.Free;
Inc(j);
end;
SlSort.Free;
end;
При выравнивании кол-ва символов "корректно" сортируются "числа" (я понимаю, что тип строковый): за единицей идет двойка, а не десятка.
Но неккоректно сортируются слова.
И наоборот: без выравнивания слова сортируются нормально, "числа" - нет (1, 10, 100, 2, 3 и т.д.)
Данные в таблице смешанные.
Нужно, чтобы числа сортировались как числа, слова - как строки.
Как реализовать такую сортировку?