|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Сортировать все строки (! ОТДЕЛЬНО !) StringGrida
Подскажите пожалуйста как отсортировать все строки по отдельности в 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; |