Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
3-73021
nobody2002
2002-04-26 10:37
2002.05.23
TAdoQuery: две таблицы в одном запросе


1-73231
PShadow
2002-05-15 06:20
2002.05.23
Как мне вызвать Excel из проги?


1-73236
vlad0007
2002-05-10 01:19
2002.05.23
Привет, Мастера!!!


3-73087
Pavlinchik
2002-04-26 21:00
2002.05.23
ПОМОГИТЕ!!! ПРОПАДАЮ!!!


3-73091
vne
2002-04-26 15:17
2002.05.23
Как получить Extended или Double простым SQL?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский