C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сортировка в StringGrid, Как произвести сортировку
Aptem
Отправлено: 09.08.2003, 19:27


Мастер участка

Группа: Участник
Сообщений: 349



Скажите пожалуйста как мне отсортировать данные в StringGrid !

А можно ли выбирать по какому столбцу сортировать?


Спасибо за внимание !!!
Георгий
Отправлено: 09.08.2003, 22:16


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



В обычном StringGrid сортировать можно только руками — т.е. самому писать код.
Если хочешь, то могу помочь в этом деле.
Aptem
Отправлено: 10.08.2003, 06:30


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (Георгий @ 09/08/2003, 23:18)
В обычном StringGrid сортировать можно только руками — т.е. самому писать код.
Если хочешь, то могу помочь в этом деле.

Огромное спасибо за внимание !!!

Насчет помощи — конечно хочу !!!
Георгий
Отправлено: 10.08.2003, 12:27


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Помошь можно реализовать двумя путями — написать за тебя или наставить тебя на правильный путь. Певый способ откидываем как не спортивный и движемся вторым.
Лови идею:
сортировка — это упорядочивание по некому критерию т.е. сначала придумай функцию, которая определана на 2-х элементах сортируемого множества ( в твоём случае это № строк StringGrid`a ) и возвращает:
-1 — 1-й элемент меньше 2-го
0 — 1-й и 2-й эквивалентны в плане размещения — нет никакой разницы в их взаимном положении.
+1 — 2-й элемент меньше 1-го
т.е. фунция имеет всего 2 аргумента — № строки и ещё раз № строки. если ты хочешь универсальную сортировку по столбцам StringGrid то попробуй придумать как в функию имеющую всего 2 аргумента передать 3-й.

теперь надо выбрать алгоритм сортировки — можно самодельный или использовать из стандартной библиотеки функцию qsort. Какой хочешь?
Могу тебе рассказать о пузырьковой, линейной и быстрой, которую, кстати и реализует библиотечная функция qsort.
Aptem
Отправлено: 10.08.2003, 18:23


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (Георгий @ 10/08/2003, 13:29)
Помошь можно реализовать двумя путями — написать за тебя или наставить тебя на правильный путь. Певый способ откидываем как не спортивный и движемся вторым.
Лови идею:
сортировка — это упорядочивание по некому критерию т.е. сначала придумай функцию, которая определана на 2-х элементах сортируемого множества ( в твоём случае это № строк StringGrid`a ) и возвращает:
-1 — 1-й элемент меньше 2-го
0 — 1-й и 2-й эквивалентны в плане размещения — нет никакой разницы в их взаимном положении.
+1 — 2-й элемент меньше 1-го
т.е. фунция имеет всего 2 аргумента — № строки и ещё раз № строки. если ты хочешь универсальную сортировку по столбцам StringGrid то попробуй придумать как в функию имеющую всего 2 аргумента передать 3-й.

теперь надо выбрать алгоритм сортировки — можно самодельный или использовать из стандартной библиотеки функцию qsort. Какой хочешь?
Могу тебе рассказать о пузырьковой, линейной и быстрой, которую, кстати и реализует библиотечная функция qsort.

Идею конечно уловил, но просто времени совсем нет, поэтому ( если можно ) я бы предпочел не спортивный путь.

А вообще, спасибо за ответ !!!
Георгий
Отправлено: 10.08.2003, 20:36


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Вот негодяй... smile.gif
Ладно будет тебе не спортивный путь (хотя генеральная линия парти в лице Владимира (не того, что Путин) не поддерживает такие решения).
CODE
static int ColN;
int _fastcall MyTStringListSortCompare(TStringList* List, int Index1, int Index2)
{
int Row1,Row2;
Row1=List->Strings[Index1].ToInt();
Row2=List->Strings[Index2].ToInt();
return Form1->StringGrid1->Cells[ColN][Row1].AnsiCompare( Form1->StringGrid1->Cells[ColN][Row2] );
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//çäåñü áóäåò îñóùåñòâëÿòüñÿ ñîðòèðîâêà
TStringList *TempList=new TStringList;
int i;

ColN=3;//ñîðòèðîâêà ïî 3-ìó ñòîëáöó
TempList->Duplicates=dupAccept;
TempList->Sorted=false;

for (i=0;i<this->StringGrid1->RowCount;i++)
TempList->Add(i);

TempList->CustomSort(MyTStringListSortCompare);

this->StringGrid2->RowCount=this->StringGrid1->RowCount;
this->StringGrid2->ColCount=this->StringGrid1->ColCount;
for (i=0;i<this->StringGrid1->RowCount;i++)
{
int Row;
Row=TempList->Strings[i].ToInt();
this->StringGrid2->Rows[Row]->Text=this->StringGrid1->Rows[i]->Text;
};

delete TempList;
}

Код не претендует на эффективность — он претендует на простоту и надёжность.

блин хрень какая то а не код получился. Лови нормальную линейную (или как её там ещё называют) сортировку:
CODE
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i,j,minInd,ColN=3;
AnsiString minVal;
TStringList *TempList=new TStringList;
if (!TempList)throw Exception("нету памяти");
for (i=0;i<this->StringGrid1->RowCount;i++)
{
minInd=i;
minVal=this->StringGrid1->Cells[ColN][i];
for (j=i+1;j<this->StringGrid1->RowCount;j++)
{
if (minVal>this->StringGrid1->Cells[ColN][j])
{
minInd=j;
minVal=this->StringGrid1->Cells[ColN][j];
};
};
TempList->Text=this->StringGrid1->Rows[minInd]->Text;
this->StringGrid1->Rows[minInd]->Text=this->StringGrid1->Rows[i]->Text;
this->StringGrid1->Rows[i]->Text=TempList->Text;
};
delete TempList;
}



Эххх — всё равно не нравится... Надо выпить... Если ты в Москве, то с тебя пиво... литра 2... Каждому...

Отредактировано Георгий — 11/08/2003, 01:49
Aptem
Отправлено: 11.08.2003, 20:16


Мастер участка

Группа: Участник
Сообщений: 349



Огромное спасибо, Георгий !!!

Вернуться в Вопросы программирования в C++Builder