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

 
Поиск в DBGridEh
Valdemar
Отправлено: 21.03.2007, 11:35


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

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



Я использую поиск в DBGridEh по комбинации клавиш Ctrl+F.
Можно ли программно установить поле, по которому будет происходить поиск? По умолчанию для поиска выбирается поле, которое было выделено в DBGridEh, а если для таблицы установлено выделение строки, то всегда получается выделена первая колонка.
olegenty
Отправлено: 21.03.2007, 11:57


Ветеран

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



ExecuteDBGridEhFindDialogProc(грид, текст, поле, массив колонок, признак модальности). см. сорцы и разберёшься.
Valdemar
Отправлено: 21.03.2007, 13:12


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

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



Спасибо. Буду разбираться.
Valdemar
Отправлено: 21.03.2007, 14:36


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

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



Что-то не получилось у меня.
Делал так:
CODE
TColumnFieldItemEh f;
f.Caption="Название"; //заголовок поля
f.Column=docsDBGridEh->Columns->Items[1]; //колонка (поле), по которому хочу искать
DynamicArray<TColumnFieldItemEh> arrayFields;
arrayFields.Length=1; //искать только по одному полю
arrayFields[0]=f;
ExecuteDBGridEhFindDialogProc(docsDBGridEh,
     "", //текст для поиска
    "name", //имя поля
     arrayFields,
     false);

Эффекта никакого. Появляется окно поиска, в котором выбрано поле, являющееся текущим в гриде, и в списке полей для поиска перечислены все поля, а не одно как ожидалось.

P.S. EhLib 4.1.4
olegenty
Отправлено: 21.03.2007, 18:17


Ветеран

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



посмотрел сорцы:
CODE

cbFindIn.ItemIndex := cbFindIn.Items.IndexOf(FGrid.Columns[FGrid.SelectedIndex].Title.Caption);


никакой ориентации ни на FieldName, ни на массив колонок. жестоко, но выходит никак.
Valdemar
Отправлено: 22.03.2007, 08:49


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

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



Жаль.
olegenty
Отправлено: 22.03.2007, 09:31


Ветеран

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



Но! Ты можешь САМ написать поисковую функцию требуемого типа и в рантайме заменить ExecuteDBGridEhFindDialogProc на указатель на свою функцию. Только сорцы долго ковырять придётся...
AVC
Отправлено: 22.03.2007, 09:47


Ветеран

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



QUOTE

Но! Ты можешь САМ написать поисковую функцию требуемого типа и в рантайме заменить ExecuteDBGridEhFindDialogProc на указатель на свою функцию. Только сорцы долго ковырять придётся...

Не совсем в тему.
Когда-то давным давно на TC и некоторых других компиляторах (скорее построителях) можно было перекрывать функции задавая линковщику порядок подключаемых модулей.

Что имеется ввиду:
Допустим мне нужно подменить функцию Aaa из модуля M1. Я пишу свою Ааа, оформляю её в отдельный файл А1.obj, а линковщику ставлю А1.obj раньше M1. Построитель немного ругается, но включает в приложение первое встреченное определение Aaa (моё).

Никто такое в Buildere не исследовал?
olegenty
Отправлено: 22.03.2007, 10:37


Ветеран

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



ExecuteDBGridEhFindDialogProc — глобальная переменная типа указатель на функцию. ею пользоваться вообще не обязательно. она инициализируется адресом вполне конкретной функции. можно просто разработать свою функцию, воспользовавшись поисковой формой Дмитрия, всего лишь переопределив инициализацию поисковой формы, после чего пользоваться своей функцией, а не указанным выше глобальным указателем.

2 AVC — не-а, я не сталкивался с такой фичей.

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