Форум: "Основная";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
Внизсортировака Найти похожие ветки
← →
Skywalker (2002-09-12 13:29) [0]можно ли отсортировать StringGrid не используя внешних методов?
← →
Song (2002-09-12 13:34) [1]Нет. Только самому "ручками".
← →
ЮЮ (2002-09-12 13:40) [2]только
TStringList(StringGrid1.Rows).Sort,
но это мало что даст
← →
Skywalker (2002-09-12 13:41) [3]мдя... может есть какая нить компонента на базе SG?
← →
Ученик (2002-09-12 13:45) [4]На www.torry.net
← →
MBo (2002-09-12 13:57) [5]Зачем лишние компоненты? Если, скажем, нужна сортировка строк по некоторой колонке, то просто меняй нужные строки местами, подойдет даже пузырьковая сортировка, поскольку в StringGrid вряд ли будут тысячи строк.
← →
Демонов Е.В. (2002-09-12 14:07) [6]Можно, я както сам в справке находил - так какойто метод// не помню какой // среди его параметров некоторая функция которая возвращает Boolean и которая собственно и используеться для критерия сотировки
так сто ищи в справке, если не неайдёшь, то мылни - я домой приду , поищу // а то на работе нет Delphi
← →
Song (2002-09-12 14:14) [7]Это метод CustomSort. Но его нет у TStringGrid.
Можно ещё QuickSort, но это как все варианты, малой кровью не обойтись.
← →
Демонов Е.В. (2002-09-12 14:17) [8]Да нет же я както делел такую вещь что по заголовку столбца кликаешь и всё сортируеться , ещё раз в обратном порядке
Приду домой обязательно посмотрю
← →
Song (2002-09-12 14:20) [9]Ну и что? Я тоже делал. Всё делается вручную через TStringList, например.
← →
Старый Паскалист (2002-09-12 14:20) [10]SortCol: Integer = -1;
SortAscending: Boolean = True;
function TForm1.Less(i, j: Integer): Boolean;
begin
with SGrid do Result := CompareText(Cells[SortCol, i+FixedRows], Cells[SortCol, j+FixedRows]) < 0;
end;
function TForm1.More(i, j: Integer): Boolean;
begin
with SGrid do Result := CompareText(Cells[SortCol, i+FixedRows], Cells[SortCol, j+FixedRows]) > 0;
end;
procedure TForm1.Swap(i, j: Integer);
var k: Integer;
begin
with SGrid do
for k := 0 to ColCount-1 do
Cols[k].Exchange(i+FixedRows, j+FixedRows);
end;
procedure TForm1.SortColumn(ACol: Integer; Ascending: Boolean);
begin
if IsCheckBoxCol(ACol) then Exit;
SortCol := ACol;
SortAscending := Ascending;
if ( SortCol < 0 )or( SortCol >= SGrid.ColCount ) then Exit;
with SGrid do
if Ascending then BTSort(RowCount-FixedRows, Less, Swap)
else BTSort(RowCount-FixedRows, More, Swap);
end;
procedure TForm1.PressColHeader(ACol: Integer);
begin
SGrid.EditorMode := False;
SGrid.Selection := TGridRect(Rect(-1, -1, -1, -1));
if (SortCol = ACol) then SortColumn(ACol, not SortAscending)
else SortColumn(ACol, True);
end;
{------------------------------------------------------------}
unit BTS;
interface
type
TBTSLess = function (i, j: Integer): Boolean of object;
TBTSSwap = procedure (i, j: Integer) of object;
procedure BTSort(N: Integer; Less: TBTSLess; Swap: TBTSSwap);
implementation
procedure BTSort(N: Integer; Less: TBTSLess; Swap: TBTSSwap);
var i, k, t: Integer;
begin
if n = 1 then Exit;
i:=1;
repeat
t:=i;
while t<>0 do
begin
k:=t div 2;
if not Less(k, t) then t:=0 else
begin
Swap(k, t); t:=k;
end;
end;
i:=i+1;
until not(i<=N-1);
i:=N-2;
repeat
Swap(i+1, 0); t:=0;
while t<>-1 do
begin
k:=2*t;
if k>i then t:=-1 else
begin
if k<i then if Less(k, k+1) then k:=k+1;
if not Less(t, k) then t:=-1 else
begin
Swap(k, t); t:=k;
end;
end;
end;
i:=i-1
until not(i>=0);
end;
end.
← →
Skywalker (2002-09-13 16:54) [11]вот придумал сортировку, немного замудренная, но работает
она сортирует строковой массив, часть которого я отображаю как
страницу грида. грид при этом имеет постоянное количество рядов
а скроллинг приделал внешний
procedure TFormMain.SortArr(CurArray:byte;DetIDs:TSortIDs);
var
List:TStringList;
Counter:longword;
Num1,Num2,Num3:longword;
Found1,Found2:boolean;
begin
List:=TStringList.Create;
Num1:=0;
Num2:=0;
Num3:=0;
Found1:=false;
Found2:=false;
for Counter:=0 to Length(FndIDArr[CurArray])-1 do
begin
case SortCol[CurArray] of
0: List.AddObject(FndIDArr[CurArray,Counter].Num1,TObject(Counter));
2: List.AddObject(FndIDArr[CurArray,Counter].Num3,TObject(Counter));
4: List.AddObject(FndIDArr[CurArray,Counter].Num5,TObject(Counter));
6: List.AddObject(FndIDArr[CurArray,Counter].Num7,TObject(Counter));
7: List.AddObject(FndIDArr[CurArray,Counter].Name1,TObject(Counter));
8: List.AddObject(FndIDArr[CurArray,Counter].Name2,TObject(Counter));
9: List.AddObject(FndIDArr[CurArray,Counter].Name3,TObject(Counter));
10: List.AddObject(FndIDArr[CurArray,Counter].Name4,TObject(Counter));
end
end;
List.Sort;
for Counter:=0 to List.Count-1 do
begin
FndIDArr[CurArray,Longword(List.Objects[Counter])].Num:=Counter+1;
if FndIDArr[CurArray,Longword(List.Objects[Counter])].ID=DetIDs.DetID1 then
begin
Found1:=true;
Num1:=Counter+1
end;
if FndIDArr[CurArray,Longword(List.Objects[Counter])].ID=DetIDs.DetID2 then
begin
Found2:=true;
Num2:=Counter+1
end;
if FndIDArr[CurArray,Longword(List.Objects[Counter])].ID=DetIDs.DetID3 then
begin
Num3:=Counter+1
end
end;
if Found2 then
begin
if (Num2-Grid[CurArray].Row)>=0 then StartNum[CurArray]:=Num2-Grid[CurArray].Row+1
else StartNum[CurArray]:=1;
end
else
begin
if Found1 then
begin
if (Num1-Grid[CurArray].Row)>=0 then StartNum[CurArray]:=Num1-Grid[CurArray].Row+2
else StartNum[CurArray]:=1;
end
else
begin
if (Num3-Grid[CurArray].Row)>=0 then StartNum[CurArray]:=Num3-Grid[CurArray].Row
else StartNum[CurArray]:=1;
end
end;
List.Free;
Clicked:=true;
Scroll[CurArray].Position:=StartNum[CurArray]-1
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c