Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.23;
Скачать: CL | DM;

Вниз

Как реализовать сортировку по алфавиту в Stringgride e   Найти похожие ветки 

 
rank ©   (2002-05-13 05:29) [0]

Есть Stringgrid в несколько строк и 4 столбца, содержимое пишется в файл и читается при старте программы, но сортировать в файле очень неудобно(строки и столбцы там перемешены). Слышал что возможно использование класса TStringList где есть св-во Sorted ,но как это все использовать не пойму........ Буду рад любому совету!!!!!!!


 
Song ©   (2002-05-13 08:39) [1]

В TStringList Вы можете обработать только одну колонку. Остальные придётся сопоставлять.


 
Song ©   (2002-05-13 08:44) [2]

есть способ где-то видел. Если у Вас не получится - поищу.


 
Толик ©   (2002-05-13 10:17) [3]

А чем QuickSort не подходит? Там можно задавать совершенно произвольные условия сортировки, хоть по одной колонке, хоть по десяти сразу. Заполнить список, да и сортировать его себе на здоровье...


 
rank ©   (2002-05-14 03:30) [4]

Ребят, а где взять этот QuickSort?


 
BAHO ©   (2002-05-14 05:57) [5]

Попробуй для каждой колонки отдельный файл создавать
где строки в формате (текст в колонке=заголовок строки)
теперь можно организовать сортировку в файле заголовков
и при выводе текста присваивать определённой строке свой текст
типа:

файл заголовков:
aaa
bbb
ccc

файл первой колонки:
xxx=aaa //текст в колонке = заголовок строки
yyy=bbb
zzz=ccc

файл второй колонки:
uuu=aaa
iii=bbb
ooo=ccc

и т.д.

и вывод текста:

for i:=0 ...
if заголовок строки = strings.value[strings.name[i]]
then ...


 
MBo ©   (2002-05-14 07:14) [6]

Вопрос пока что непонятен.


 
Толик ©   (2002-05-14 10:44) [7]

QuickSort - ф-я из Classes.pas (см. исходники). Либо можно воспользоваться классом TList, его сортировка напрямую использует эту ф-ю. Короче, технология примерно такая:

procedure StringGrodSort(const SG: TStringGrid);
function Compare(Item1, Item2: pointer): longint;
begin
{т.к. TList заполнялся номерами строк, то longint(Item1) и longint(Item 2) - это строки нашего StringGrid"а, сравниваемые в настоящий момент. Эта ф-я должна возвращать следующие значения:
<0 если строка Item1 < строки Item2
0 если строка Item1 идентична строке Item2
>0 если строка Item1 > Item2
А вот что значит "больше" или "меньше" решайте сами: доступ к ячейкам StringGrid"а есть.}
end;
var
i: longint;
begin
with(TList.Create())do begin
try
Count := SG.RowCount;
for i := 0 to Count - 1 do
Add(pointer(i));//заполняем массив номерами строк
Sort(@Compare);
finally
Free();//удаляем TList
end;
end;
end;


 
Бурундук   (2002-05-14 11:51) [8]

Можно так:

function TForm1.RowLess(i, j: Integer): Boolean;
begin
Result := CompareText(SGrid.Cells[SortCol, i], SGrid.Cells[SortCol, j]) < 0;
end;

procedure TForm1.RowSwap(i, j: Integer);
var k: Integer;
begin
for k := 0 to SGrid.ColCount-1 do
SGrid.Cols[k].Exchange(i, j);
end;

procedure TForm1.SortColumn(ACol: Integer);
begin
SortCol := ACol;
BTSort(SGrid.RowCount, RowLess, RowSwap);
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;


 
kserg@ukr.net   (2002-05-14 12:13) [9]

Увидел схожую тему вопроса - TStringGrid.
Немного отклоняюсь от сути вопроса: но попробуй TAdvStringGrid !!!
Это типа StringGrid-a но гораздо круче.
Cреди прочего - поддерживает многоколонччатую сортировку.
По отзывам - глюков не много
Качнуть можешь на http://www.tmssoftware.com/advgrid2.htm
(это ссылка для D5, для др. лежит рядом)
Там же я нашел кучу примеров (~ 50) для решения разных задач в данном гриде.
Удачи


 
Толик ©   (2002-05-14 12:21) [10]

В догонку к своему примеру: забыл добавить, что после сортировки TList"а надо привести в соотв. с ним StringGrid, т.е. пройтись по TList"у и поменять местами строки в StringGrid"е. Например в TList"е Item[0] = 2, значит в Grid"е в строку с индексом 0 нужно поставить строку с индексом 2 и т.д. Это напоминает поиск по индексу в базе данных.


 
Song ©   (2002-05-14 14:17) [11]

rank © (13.05.02 05:29)
Напиши на почту. Пришлю, чтоб не мучался *))



Страницы: 1 вся ветка

Текущий архив: 2002.05.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
6-73342
eviL
2002-03-12 10:47
2002.05.23
Sokets


3-73068
Shumlyansky
2002-04-25 16:24
2002.05.23
Как сделать чтобы база созданная в Paradox не тормозила при заге


3-73035
Ivan Voronov
2002-04-26 12:20
2002.05.23
Использование собственных функций в SQL запросе...


14-73368
VictorT
2002-04-15 15:08
2002.05.23
Опять переписочка.


1-73150
UDS
2002-04-28 21:28
2002.05.23
Замкнутый круг. Как закончить цикл?