Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.009 c
1-85439
lovres
2002-09-14 15:37
2002.09.26
Как значение типа DateTime уменьшить на 1 секунду?


1-85574
asderg
2002-09-13 20:28
2002.09.26
Как узнать размер объекта?


3-85362
Zelius
2002-09-04 10:51
2002.09.26
Как ADO работает в многопотоковом приложении?


8-85618
Янушка
2002-05-31 11:15
2002.09.26
О цвете заголовка формы


3-85334
desha
2002-09-01 12:40
2002.09.26
Номер записи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский