Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка в TStringGrid

246
26 января 2005 года
GIZMO
1.8K / / 30.07.2004
У кого-нибудь есть варианты?
259
26 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by GIZMO
У кого-нибудь есть варианты?


Сам не пробовал. Думаю приблизительно так.
Выгружаешь TStringGrid->Rows в TList, причем столбец сортировки должен быть первым. Делаешь TList->Sort(). Выгружаешь из Tlist->Items в TstringGrid->Rows

259
26 января 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by AlexandrVSmirno

Сам не пробовал. Думаю приблизительно так.
Выгружаешь TStringGrid->Rows в TList, причем столбец сортировки должен быть первым. Делаешь TList->Sort(). Выгружаешь из Tlist->Items в TstringGrid->Rows


Приблизительно так. Сортирует по клику в столбце 1 строки.

Код:
int __fastcall Compare(void *Item1, void *Item2)
{
    AnsiString *i1 = (AnsiString*)Item1;
    AnsiString *i2 = (AnsiString*)Item2;
    return i1->AnsiCompare(*i2);
}
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
    if(StringGrid1->Row == 1)
    {
        TList* myList = new TList();
        myList->Clear();
        AnsiString* myStr;
        for(int i = 0 ;i<StringGrid1->RowCount;i++)
        {
            AnsiString* myStr = new AnsiString(StringGrid1->Cells[StringGrid1->Col]+";"+StringGrid1->Rows->Text);
            myList->Add((void*)myStr);
        }
        myList->Sort(Compare);
        for(int i=0;i<myList->Count;i++)
        {
            myStr = (AnsiString*)myList->Items;
            AnsiString rowString = myStr->SubString(myStr->Pos(";")+1,myStr->Length());
            StringGrid1->Rows->Text = rowString;
        }
    }
}
246
27 января 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by AlexandrVSmirno

Приблизительно так. Сортирует по клику в столбце 1 строки.
Код:
int __fastcall Compare(void *Item1, void *Item2)
{
    AnsiString *i1 = (AnsiString*)Item1;
    AnsiString *i2 = (AnsiString*)Item2;
    return i1->AnsiCompare(*i2);
}
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
    if(StringGrid1->Row == 1)
    {
        TList* myList = new TList();
        myList->Clear();
        AnsiString* myStr;
        for(int i = 0 ;i<StringGrid1->RowCount;i++)
        {
            AnsiString* myStr = new AnsiString(StringGrid1->Cells[StringGrid1->Col]+";"+StringGrid1->Rows->Text);
            myList->Add((void*)myStr);
        }
        myList->Sort(Compare);
        for(int i=0;i<myList->Count;i++)
        {
            myStr = (AnsiString*)myList->Items;
            AnsiString rowString = myStr->SubString(myStr->Pos(";")+1,myStr->Length());
            StringGrid1->Rows->Text = rowString;
        }
    }
}


Спасибо. Сделал примерно тоже, но только с TStringList

 
Код:
...
myStr = new AnsiString(SG->Rows->Text);
myList->AddObject(SG->Cells[Col], (TObject*)myStr);
...

так не нужно задаваться "разделяющим символом"(у Вас - ;). Вдруг кто-то захочет его ввести в ячейку? По скорости чуууть медленнее (на табл. из 5-ти столбцов и 20000 строк).
Единственное, что осталось выяснить: - "А чистить ничего не надо?". myList вроде однозначно надо шлепнуть или вынести как датамембер. А вот чего там у AnsiString, за конструкторы и операторы приведения надо посмотреть...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог