Выбрать главу

Если в фильтре использовать 0 и 0, чтобы поймать любое сообщение, результат всегда будет True. Причина, очевидно в том, что любой щелчок мыши в области DBGrid никак не обойдется без последствий, генерация системой сообщения PAINT яркий тому пример, поэтому PeekMessage может возвратить True в любое время, что тоже не может нам помочь.

Было бы хорошо, если бы дескриптор DBGrid получал событие OnMouseUp() во время его скроллирования. Обидно, но OnMouseUp() работает только с DBGrid, а не с полосами прокрутки. OnMouseUp() с TForm при KeyPreview:=true не работает, я проверял.

После пришла идея опросить состояние кнопок мыши с помощью функции GetKeyState(). Пока кнопка нажата (DOWN), "поиск" запрещен, и наоборот. UP (кнопка отжата) свидетельствует об окончании процесса скроллирования. Данный способ работы с окном во время манипуляций с его полосой прокрутки заработал без проблем. Теперь все в порядке: поиска во время прокрутки не происходит и табличный курсор также никуда не перемещается.

Рассмотренная тема имеет отношение к полосам прокрутки, а события OnKeyUp() и OnMouseUp() могут применяться где-нибудь еще.

BDE

Псевдонимы

Задание псевдонима программным путем

Эта информация поможет вам разобраться в вопросе создания и использования ПСЕВДОНИМОВ баз данных в ваших приложениях.

Вне Delphi создание и конфигурирование псевдонимов осуществляется утилитой BDECFG.EXE. Тем не менее, применяя компонент TDatabase, вы можете в вашем приложении создать и использовать псевдоним, не определенный в IDAPI.CFG.

Важно понять, что создав псевдоним, использовать его можно только в текущем сеансе вашего приложения. Псевдонимы определяеют расположение таблиц базы данных и параметры связи с сервером баз данных. В конце концов, вы получаете преимущества использования псевдонимов в пределах вашего приложения без необходимости беспокоиться о наличии их в конфигурационном файле IDAPI.CFG в момент инициализации приложения.

Некоторые варианты решения задачи:

Пример #1: Пример #1 создает и конфигурирует псевдоним для базы данных STANDARD (.DB, .DBF). Псевдоним затем используется компонентом TTable.

Пример #2: Пример #2 создает и конфигурирует псевдоним для базы данных INTERBASE (.gdb). Псевдоним затем используется компонентом TQuery для подключения к двум таблицам базы данных.

Пример #3: Пример #3 создает и конфигурирует псевдоним для базы данных STANDARD (.DB, .DBF). Демонстрация ввода псевдонима пользователем и его конфигурация во время выполнения программы.

Пример #1: Используем базу данных .DB или .DBF (STANDARD)

1. Создаем новый проект.

2. Располагаем на форме следующие компоненты: – TDatabase, TTable, TDataSource, TDBGrid, and TButton.

3. Дважды щелкаем на компоненте TDatabase или через контекстное меню (правая кнопка мыши) вызываем редактор базы данных.

4. Присваиваем базе данных имя 'MyNewAlias'. Это имя будет выполнять роль псевдонима в свойстве DatabaseName для компонентов типа TTable, TQuery, TStoredProc.

5. Выбираем в поле Driver Name (имя драйвера) пункт STANDARD.

6. Щелкаем на кнопке Defaults. Это автоматически добавляет путь (PATH=) в секцию перекрытых параметров (окно Parameter Overrides).

7. Устанавливаем PATH= to C:\DELPHI\DEMOS\DATA (PATH=C:\DELPHI\DEMOS\DATA).

8. Нажимаем кнопку OK и закрываем окно редактора.

9. В компоненте TTable свойству DatabaseName присваиваем 'MyNewAlias'.

10. В компоненте TDataSource свойству DataSet присваиваем 'Table1'.

11. В компоненте DBGrid свойству DataSource присваиваем 'DataSource1'.

12. Создаем в компоненте TButton обработчик события OnClick.

procedure TForm1.Button1Click(Sender: TObject);

begin

 Table1.Tablename:= 'CUSTOMER';

 Table1.Active:= True;

end;

13. Запускаем приложение.

*** В качестве альтернативы шагам 3 – 11, вы можете включить все эти действия в сам обработчик:

procedure TForm1.Button1Click(Sender: TObject);

begin

 Database1.DatabaseName:= 'MyNewAlias';

 Database1.DriverName:= 'STANDARD';

 Database1.Params.Clear;

 Database1.Params.Add('PATH=C:\DELPHI\DEMOS\DATA');

 Table1.DatabaseName:= 'MyNewAlias';

 Table1.TableName:= 'CUSTOMER';

 Table1.Active:= True;

 DataSource1.DataSet:= Table1;

 DBGrid1.DataSource:= DataSource1;

end;

Пример #2: Используем базу данных INTERBASE

1. Создаем новый проект.

2. Располагаем на форме следующие компоненты: – TDatabase, TQuery, TDataSource, TDBGrid, and TButton.

3. Дважды щелкаем на компоненте TDatabase или через контекстное меню (правая кнопка мыши) вызываем редактор базы данных.

4. Присваиваем базе данных имя 'MyNewAlias'. Это имя будет выполнять роль псевдонима в свойстве DatabaseName для компонентов типа TTable, TQuery, TStoredProc.

5. Выбираем в поле Driver Name (имя драйвера) пункт INTRBASE.

6. Щелкаем на кнопке Defaults. Это автоматически добавляет путь (PATH=) в секцию перекрытых параметров (окно Parameter Overrides).

SERVER NAME=IB_SERVEER:/PATH/DATABASE.GDB

USER NAME=MYNAME

OPEN MODE=READ/WRITE

SCHEMA CACHE SIZE=8

LANGDRIVER=

SQLQRYMODE=

SQLPASSTHRU MODE=NOT SHARED

SCHEMA CACHE TIME=-1

PASSWORD=

7. Устанавливаем следующие параметры

SERVER NAME=C:\IBLOCAL\EXAMPLES\EMPLOYEE.GDB

USER NAME=SYSDBA

OPEN MODE=READ/WRITE

SCHEMA CACHE SIZE=8

LANGDRIVER=

SQLQRYMODE=

SQLPASSTHRU MODE=NOT SHARED

SCHEMA CACHE TIME=-1

PASSWORD=masterkey

8. В компоненте TDatabase свойство LoginPrompt устанавливаем в 'False'. Если в секции перекрытых параметров (Parameter Overrides) задан пароль (ключ PASSWORD) и свойство LoginPrompt установлено в 'False', при соединении с базой данный пароль запрашиваться не будет. Предупреждение: при неправильно указанном пароле в секции Parameter Overrides и неактивном свойстве LoginPrompt вы не сможете получить доступ к базе данных, поскольку нет возможности ввести правильный пароль – диалоговое окно "Ввод пароля" отключено свойством LoginPrompt.

9. Нажимаем кнопку OK и закрываем окно редактора.

10. В компоненте TQuery свойству DatabaseName присваиваем 'MyNewAlias'.

11. В компоненте TDataSource свойству DataSet присваиваем 'Query1'.

12. В компоненте DBGrid свойству DataSource присваиваем 'DataSource1'.

13. Создаем в компоненте TButton обработчик события OnClick.

procedure TForm1.Button1Click(Sender: TObject);

begin

 Query1.SQL.Clear;

 Query1.SQL.ADD('SELECT DISTINCT * FROM CUSTOMER C, SALES S WHERE (S.CUST_NO = C.CUST_NO) ORDER BY C.CUST_NO, C.CUSTOMER');

 Query1.Active:= True;

end;

14. Запускаем приложение.

Пример #3: Ввод псевдонима пользователем