Форум — Ответы ( К темам )
? | Вася: TStringGrid ???????? (27-12-2002 18:39:36) |
Приветик, помогите пожалуйста! Нужно отсортировать по алфавиту в рады в TSG... \например соответственно колонки 3 т.е. Все ряды должны поменяться местами так, чтобы в колонкм 3 все было по алфавиту! Заранее благодарен! | |
Devnvd (27-12-2002 20:36:27) | |
Пример сортировки строк TStringGrid'а по данным выбранной колонки typedef struct { int ARow; //Номер строки AnsiString S; //содержимое ячейки сортируемой колонки }TMyData; //Вспомогательная функция сортировки static int __fastcall CompareUp(void * Item1, void * Item2) { return ((TMyData *)Item1)->S.AnsiCompare(((TMyData *)Item2)->S); } //Вспомогательная функция сортировки static int __fastcall CompareDown(void * Item1, void * Item2) { return ((TMyData *)Item2)->S.AnsiCompare(((TMyData *)Item1)->S); } //Сортировка строк в SG по содержимому колонки ACol //DirectSort==1 — по возрастающей, ==-1 — по убывающей // ==0 -без сортировки static void __fastcall Sort(TStringGrid *SG,int ACol,int DirectSort) { int i,j,ARow; if(!DirectSort)return; // без сортировки if(!SG->FixedRows)return; //Нет заголовка колонки if(SG->RowCount <=SG->FixedRows)return; //Нечего сортировать TList *SortList=new TList; //Список для сортировки TList *TempList=new TList; //Список для установки строк на новое место //Заполним список содержимым колонки ACol for(ARow=SG->FixedRows; ARow < SG->RowCount; ARow++) { TMyData *md=new TMyData; md->ARow=ARow; md->S=SG->Cells[ACol][ARow]; SortList->Add(md); //Заполним TempList TempList->Add((void *)ARow); //Запомним старую расстановку строк } if(DirectSort==1)SortList->Sort(CompareUp); //Отсортируем по возрастающей else SortList->Sort(CompareDown); //Отсортируем по убывающей //Найдём в каком месте сейчас находится бывшая строка Row int cRow=SG->Row; //Текущая строка int cTopRow=SG->TopRow; //Текущая верхняя строка int newRow=cRow; for(j=0; j < SortList->Count; j++) { TMyData *md=(TMyData *)(SortList->Items[j]); if(cRow==md->ARow)break; } if(j < SortList->Count)newRow=j+SG->FixedRows; for(i=0; i < SortList->Count; i++) { TMyData *md=(TMyData *)(SortList->Items[i]); //Возьмём номер строки в начальной расстановке ARow=md->ARow; //Найдём в каком месте сейчас находится бывшая строка ARow for(j=0; j < TempList->Count; j++) { if(ARow==(int)TempList->Items[j])break; } //Сейчас строка находится на месте j+FixedRows //Надо её переставить на место i+FixedRows //.... Это вариант для стандартного StringGrid'а ..... AnsiString Sold=SG->Rows[j+SG->FixedRows]->Text; //Прежнее положение строки AnsiString Snew=SG->Rows[i+SG->FixedRows]->Text; //Новое положение строки SG->Rows[j+SG->FixedRows]->Text=Snew; SG->Rows[i+SG->FixedRows]->Text=Sold; //Делаем параллельную перестановку в TempList int jold=(int)(TempList->Items[j]); int inew=(int)(TempList->Items[i]); TempList->Items[j]=(void *)inew; TempList->Items[i]=(void *)jold; //.... //.... Это вариант для к | |
Devnvd (27-12-2002 20:38:34) | |
Опять пример не влез. Пишите письма devnvd@imail.ru | |
Devnvd (28-12-2002 08:43:33) | |
Полный пример упорядочивания строк TStringGrid'а по данным выбранной колонки. В примере колонка выбирается кликом мыши на её заголовке, используется отработчик события TStringGrid::OnMouseUp. typedef struct { int ARow; //Номер строки AnsiString S; //содержимое ячейки сортируемой колонки }TMyData; //Вспомогательная функция сортировки static int __fastcall CompareUp(void * Item1, void * Item2) { return ((TMyData *)Item1)->S.AnsiCompare(((TMyData *)Item2)->S); } //Вспомогательная функция сортировки static int __fastcall CompareDown(void * Item1, void * Item2) { return ((TMyData *)Item2)->S.AnsiCompare(((TMyData *)Item1)->S); } //Сортировка строк в SG по содержимому колонки ACol //DirectSort==1 — по возрастающей, ==-1 — по убывающей // ==0 -без сортировки static void __fastcall Sort(TStringGrid *SG,int ACol,int DirectSort) { int i,j,ARow; if(!DirectSort)return; // без сортировки if(!SG->FixedRows)return; //Нет заголовка колонки if(SG->RowCount <=SG->FixedRows)return; //Нечего сортировать TList *SortList=new TList; //Список для сортировки TList *TempList=new TList; //Список для установки строк на новое место //Заполним список содержимым колонки ACol for(ARow=SG->FixedRows; ARow < SG->RowCount; ARow++) { TMyData *md=new TMyData; md->ARow=ARow; md->S=SG->Cells[ACol][ARow]; SortList->Add(md); //Заполним TempList TempList->Add((void *)ARow); //Запомним старую расстановку строк } if(DirectSort==1)SortList->Sort(CompareUp); //Отсортируем по возрастающей else SortList->Sort(CompareDown); //Отсортируем по убывающей //Найдём в каком месте сейчас находится бывшая строка Row int cRow=SG->Row; //Текущая строка int cTopRow=SG->TopRow; //Текущая верхняя строка int newRow=cRow; for(j=0; j < SortList->Count; j++) { TMyData *md=(TMyData *)(SortList->Items[j]); if(cRow==md->ARow)break; } if(j < SortList->Count)newRow=j+SG->FixedRows; for(i=0; i < SortList->Count; i++) { TMyData *md=(TMyData *)(SortList->Items[i]); //Возьмём номер строки в начальной расстановке ARow=md->ARow; //Найдём в каком месте сейчас находится бывшая строка ARow for(j=0; j < TempList->Count; j++) { if(ARow==(int)TempList->Items[j])break; } //Сейчас строка находится на месте j+FixedRows //Надо её переставить на место i+FixedRows //.... Это вариант для стандартного StringGrid'а ..... AnsiString Sold=SG->Rows[j+SG->FixedRows]->Text; //Прежнее положение строки AnsiString Snew=SG->Rows[i+SG->FixedRows]->Text; //Новое положение строки SG->Rows[j+SG->FixedRows]->Text=Snew; SG->Rows[i+SG->FixedRows]->Text=Sold; //Делаем параллельную перестановку в TempList int jold=(int)(TempList->Items[j]); int inew=(int)(TempList->Items[i]); TempList->Items[j]=(void *)inew; TempList->Items[i]=(void *)jold; //.... //.... Это вариант для компонента наследованного от TStrinGrid'а ... // MoveRow(j+FixedRows,i+FixedRows); //Переставляем строки // TempList->Move(j,i); //Делаем параллельную перестановку //.... } //Удалим списки delete TempList; for(i=0; i < SortList->Count; i++) { delete (TMyData *)(SortList->Items[i]); } delete SortList; int newTopRow=newRow-(cRow-cTopRow); if(newTopRow < 1)newTopRow=1; SG->Row=newRow; SG->TopRow=newTopRow; //Покажем текущую строку } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { StringGrid1->Cols[0]->Text="Nn1n2n3n4n5n6n7n8n9"; StringGrid1->Cols[1]->Text="Tn9n8n7n6n5n4n3n2n1"; } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button==mbRight)//Правая кнопка мыши { int ACol,ARow; TStringGrid *SG=(TStringGrid *)Sender; SG->MouseToCell(X,Y,ACol,ARow); int DirectSort=0; if( (ARow>=0 && ARow { if(Shift.Contains(ssCtrl))DirectSort=1; //По возрастающей if(Shift.Contains(ssShift))DirectSort=-1; //По убывающей Sort(SG,ACol,DirectSort); } } } |