![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Подскажите пожалуйста как отсортировать все строки по отдельности в StringGridе, к примеру
есть: 5 2 1 2 5 3 8 2 1 надо: 1 2 5 2 3 5 1 2 8 . |
|
#2
|
|||
|
|||
|
Пробегаешься по строкам, для каждой строки пробегаешься по ее элементам загоняя их в массив чисел. Сортируешь массив любым известным тебе методом, записываешь массив в эту строку.
|
|
#3
|
|||
|
|||
|
Как вариант :
Код:
procedure StringGrid_SortCol(SG : TStringGrid; HideSGBefore : boolean; ACol : integer; TypeCol : integer);
{Сортировка по заданному столбцу}
{HideSGBefore - скрыть на время процесса}
{ACol - номер столбца}
{TypeCol - тип столбца}
Var
Vis,YesGreate : Boolean;
X1,X2 : real;
S1,S2,S0 : string;
ListS : TStrings;
Res,N,k,j,i : LongInt;
begin
if SG<>NIL then begin
if SG.RowCount>1 then begin
if (ACol>=0) and (ACol<SG.ColCount) then begin
Vis:=SG.Visible;
if HideSGBefore then SG.Visible:=FALSE;
ListS:=TStringList.Create;
TRY
N:=SG.RowCount-1;
for i:=1 to N do
begin
k:=N-i;
for j:=1 to k do
begin
YesGreate := FALSE;
S1:=SG.Cells[ACol,j];
S2:=SG.Cells[ACol,j+1];
S1:=Trim(S1);
S2:=Trim(S2);
{[1,6,11,14]}
if TypeCol=(-1) then begin //тип столбца : строка UpCase
S1:=AnsiUpperCase(S1);
S2:=AnsiUpperCase(S2);
if S1>S2 then begin
YesGreate := TRUE;
end;
end;
if TypeCol=0 then begin //тип столбца : строка
if S1>S2 then begin
YesGreate := TRUE;
end;
end;
if TypeCol=1 then begin //тип столбца : число
Val(S1,X1,Res);
Val(S2,X2,Res);
if X1>X2 then begin
YesGreate := TRUE;
end;
end;
if YesGreate then begin
ListS.Assign(SG.Rows[j]);
SG.Rows[j].Assign(SG.Rows[j+1]);
SG.Rows[j+1].Assign(ListS);
end;
end;
end;
FINALLY
if ListS<>NIL then begin
ListS.Free;
end;
ListS:=NIL;
SG.Visible:=Vis;
END;
end;
end;
end;
end; |