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
|
Вот негодяй...
Ладно будет тебе не спортивный путь (хотя генеральная линия парти в лице Владимира (не того, что Путин) не поддерживает такие решения).
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
|
Огромное спасибо, Георгий !!!
|
|