Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
ВнизКак реализовать сортировку по алфавиту в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c