C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Движение курсора, по ClientDataSet
Лена
Отправлено: 08.11.2006, 12:48


Мастер участка

Группа: Участник
Сообщений: 501



Подскажите, как реализовать следующее:
Пользователь вводит в Edit1 буквы.
Программа анализирует их и в ClientDataSet курсор перемещается на строку, где есть совпадение из соотвествующей колонки с буквами из Edit1. По мере ввода курсор скользит и находит совпадения, останавливаясь на них. Если совпадений нет, то ничего не происходит.
Связь такая: ADOQuery — DataSetProvider — ClientDataSet — DataSource — грид.

Admin
Отправлено: 08.11.2006, 12:53


Владимир

Группа: Администратор
Сообщений: 1190



Locate
olegenty
Отправлено: 08.11.2006, 12:55


Ветеран

Группа: Модератор
Сообщений: 2412



Это называется Incremental Search. реализовано в TDBGridEh. в противном случае тебе придётся делать всё руками:

1. переводим грид в режим поиска. для этого поверх текущей ячейки рисуем TEdit, но пользователю кажется, что это прямо в гриде
2. По мере набора текста в TEdit...
3. делаем Locate по набору данных с loPartialKey для поля текущей колонки
Лена
Отправлено: 08.11.2006, 13:40


Мастер участка

Группа: Участник
Сообщений: 501



Locate работает, только при полном соотвествии. sad.gif
CODE

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
TLocateOptions SOptions;
DataModule2->ClientDataSetKey->Locate("man", Edit1->Text, SOptions<<loCaseInsensitive);
}



Отредактировано Лена — 08.11.2006, 14:45
olegenty
Отправлено: 08.11.2006, 13:42


Ветеран

Группа: Модератор
Сообщений: 2412



а loPartialKey кто за тебя включит в TLocateOptions?
Лена
Отправлено: 08.11.2006, 13:46


Мастер участка

Группа: Участник
Сообщений: 501



РАБОТАЕТ! yahoo.gif
Большое спасибо!
Лена
Отправлено: 08.11.2006, 14:15


Мастер участка

Группа: Участник
Сообщений: 501



Если колонка имеет тип даты-времени и там содержаться записи типа:
05.09.2006 14:57:09, то при попытке применить код ниже, получаю исключение на рисунке. Это можно обойти?
CODE

void __fastcall TForm1::Edit6Change(TObject *Sender)
{

TLocateOptions SOptions;
DataModule2->ClientDataSetLog->Locate("dt", Edit6->Text,  SOptions<<loCaseInsensitive<<loPartialKey);

}


Присоединить изображение

Присоединить изображение

Admin
Отправлено: 08.11.2006, 14:26


Владимир

Группа: Администратор
Сообщений: 1190



try{} catch{}
Лена
Отправлено: 08.11.2006, 14:38


Мастер участка

Группа: Участник
Сообщений: 501



А как тогда двигать курсор по этой колонке? rolleyes.gif
Наверное для этой колонки не получиться?
Shagg
Отправлено: 10.11.2006, 07:19


Дежурный стрелочник

Группа: Участник
Сообщений: 69



тут уж придется вспомнить функции StrToDateTime и FormatDateTime
olegenty
Отправлено: 10.11.2006, 08:10


Ветеран

Группа: Модератор
Сообщений: 2412



2 Лена

на эти грабли в разное время наступали, наверное, все.

поиск надо вести не по колонке с полем типа DateTime, а по Calculated колонке, куда помещается определённым образом отформатированное значение DateTime

(оффтопик) только тут ещё грабелька: а сортировать (на клиентской стороне) всё же надо по прежнему по полю типа DateTime

Вернуться в Работа с базами данных в C++Builder