Форум - Ответы     (  К темам )
 ?  Вася: 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 FixedRows)&& ACol>=0)
{
if(Shift.Contains(ssCtrl))DirectSort=1; //По возрастающей
if(Shift.Contains(ssShift))DirectSort=-1; //По убывающей
Sort(SG,ACol,DirectSort);
}
}
}


support@cbuilder.ru