Форум — Ответы     (  К темам )
 ?  Владимир: Поиск и сортировка в компоненте TDBGrid, обновление базы данных (15-01-2003 19:29:34)
Подскажите пожайлуста, как в C++Builere 5, в компоненте TDBGrid сделать следующее:
1. Отсортировать список по вычисляемому полю — в итоге поле содержит, к примеру, фамилии.
2. Сделать быстрый поиск записи при наборе слова, т.е. установлен фокус на TDBGrid и пользователь набирает слово, а курсор переходит со строки на строку.

И еще вопрос: как правильно обновлять данные в таблицах базы данных в BDE ? Т.е. при повторном запуске программы иногда не сохраняются добавленные/измененные записи в таблицах.
Используются компоненты: TDatabase, TTable, TDataSource, TQuery.

Желательно кусочек кода.
Всем спасибо!
 Владимир (15-01-2003 22:51:45)
1 Что касается сортировки
a/ Воспользуйтесь компонентом TDBGridEh из библиотеки EhLib 2.6
скачать можно здесь: http://www.farpost.com/personal/dmitryb/RUS/
он позволяет просто делать сортировку по нажатию кнопки-заголовка в Grid-e

б/ если отобранные данные поместить в таблицу в памяти, например компонент TRxMemoryData из библиотеки RXLib, то в нем есть метод сортировки,
SortOnFields(AnsiString FieldName, bool CaseInsensitive, bool Desc)
например по указанному столбцу в Grid
(Метод сортирует данные в таблице в памяти в порядке возрастания или убывания (в зависимости от параметра Descending) значений полей, имена которых переданы в качестве параметра FieldNames. Для строковых полей сортировка может осуществляться с учетом или без учета регистра символов в зависимости от параметра CaseInsensitive.
Если осуществляется сортировка по нескольким полям, то их имена разделяются точкой с запятой (;))
Пример: сортирует таблицу Мем по нажатию заголовка в Gride по выбранному полю без учета регистра в порядке возрастания
//--------------------
void __fastcall TFMain::GridTitleClick(TColumn *Column)
{
Mem->SortOnFields(Column->FieldName,false,false);
Mem->First();
}
//--------------------------------------------------------------------------- или
Mem->SortOnFields("ID;Name",false,false); — сортирует таблицу Мем по полям ID и Name без учета регистра в порядке возрастания


2 Быстрый поиск записи при наборе слова — для этого можно использовать компонент
TRxLookupEdit из библиотеки RXLib
(Компонента TRxLookupEdit представляет собой редактор с возможностью как прямого ввода текста пользователем в строке редактирования, так и выбора текста из выпадающего списка, заполняемого значениями из базы данных. При открытом списке или при значении свойства PopupOnlyLocate=False набор пользователем символов с клавиатуры приводит к позиционированию списка на ближайшую запись, совпадающую с введенным текстом ... )

// Можно конечно и в обычном Edit это делать самому, например так
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
TLocateOptions TLo;
Ta->Locate("поле",Edit1->Text,TLo<<loPartialKey<<loCaseInsensitive);
}

3.
a/ если добавляете записи и переводите набор данных в состояние вставки
методом Insert() или Append() или в состояние редактирования методом Edit(),
фиксируйте изменение данных методом Post()

б/ если изменения кэшируются, то есть у вас стоит Table->CachedUpdates = true;
то делайте
Database->StartTransaction();
Table->ApplyUpdate(); // попытаться записать сделанные изменения в базу
Database->Commit(); // зафиксировать изменения в базе
Table->CommitUpdates(); // освободить буфер
чтобы зафиксировать изменения в базе

в/ также есть метод Table->FlushBuffers(); производит запись изменений в
таблицах Paradox на диск в базу, включая кэшируемые записи.
(и установите LOCAL SHARE в TRUE в BDE)