Delphi работа с сообщениями windows

Обработка сообщений Windows в Delphi

Конечно, нельзя придумать такую библиотеку объектов, которые бы полностью соответствовали потребностям программистов. Всегда возникнет необходимость дополнения или изменения свойств и поведения объектов. В этом случае, так же, как и при создании своих собственных компонент в Delphi, часто требуется обрабатывать сообщения Windows. Поскольку Object Pascal является развитием и продолжением Borland Pascal 7.0, то это выполняется сходным с BP способом.

Общий синтаксис для декларации обработчика сообщений Windows:

procedure Handler_Name(var Msg : MessageType);

Handler_Name обозначает имя метода; Msg — имя передаваемого параметра; MessageType — какой либо тип записи, подходящий для данного сообщения; директива message указывает, что данный метод является обработчиком сообщения; WM_XXXXX — константа или выражение, которое определяет номер обрабатываемого сообщения Windows.

Задание 7.

1.Привязать к правой кнопке другое событие, при нажатии правой кнопки мыши на форме в программе появляется всплывающее меню (pop-up menu, если оно было привязано к этой форме). Это можно сделать так:

procedure WMRButtonDown(var Msg : TWMMouse); message

Подчеркнут код, добавленный в декларацию объекта TForm1 вручную. Далее, в секции implementationнужно написать обработчик:

procedure TForm1.WMRButtonDown(var Msg : TWMMouse);

MessageDlg(‘Right mouse button click.’, mtInformation,

В данном случае при нажатии правой кнопки мыши будет появляться диалог.

2.Вызвать обработчик данного события, родительского класса. Если в новом обработчике сообщения нужно выполнить действия, которые производились в старом, то для этого применяется ключевое слово inherited. Если слегка модифицировать наш обработчик, то после диалога будет появляться pop-up меню:

procedure TForm1.WMRButtonDown(var Msg : TWMMouse);

MessageDlg(‘Right mouse button click.’, mtInformation,

3.Для обработки сообщений использовать другой способ — свойство OnMessage объекта Application, который автоматически создается при запуске программы. Если определен обработчик события OnMessage, то он получает управление при любом событии, сообщение о котором направлено в программу. Следующий код будет приводить к появлению диалога при двойном щелчке мыши на любом объекте в приложении.

procedure TForm1.FormCreate(Sender: TObject);

procedure TForm1.AOM(var Msg: TMsg; var Handled: Boolean);

if Msg.Message = WM_LBUTTONDBLCLK then begin

MessageDlg(‘Double click.’, mtInformation, [mbOK], 0);

Конечно, в обработчике нельзя выполнять операции, требующие длительного времени, поскольку это приведет к замедлению выполнения всего приложения.

Работа с БД в Delphi.

Задание 1.

1.Создать с помощью утилиты Database Desktop локальную БД, состоящую из 2-3 таблиц, связанных некоторым отношением, прикладное содержание задачи произвольно, на Ваш выбор.

2.Настроить алиас с помощью BDE .

3.Организовать запрос к БД, исользуя Tquery.

Рекомендации по реализации и описание программного инструментария см. ниже.

Borland Database Engine (BDE)

Рассмотрим Borland Database Engine (BDE) — ядро баз данных компании Борланд, а также научимся создавать и редактировать алиасы — механизм, облегчающий связь с базами данных. Кроме того, мы изучим, как конфигурировать ODBC драйверы.

Сущность BDE

Мощность и гибкость Delphi при работе с базами данных основана на низкоуровневом ядре — процессоре баз данных Borland Database Engine (BDE). Его интерфейс с прикладными программами называется Integrated Database Application Programming Interface (IDAPI). В принципе, сейчас не различают эти два названия (BDE и IDAPI) и считают их синонимами. BDE позволяет осуществлять доступ к данным как с использованием традиционного record-ориентированного (навигационного) подхода, так и с использованием set-ориентированного подхода, используемого в SQL-серверах баз данных. Кроме BDE, Delphi позволяет осуществлять доступ к базам данных, используя технологию (и, соответственно, драйверы) Open DataBase Connectivity (ODBC) фирмы Microsoft. Но, как показывает практика, производительность систем с использованием BDE гораздо выше, чем оных при использовании ODBC. ODBC драйвера работают через специальный “ODBC socket”, который позволяет встраивать их в BDE.

Все инструментальные средства баз данных Borland — Paradox, dBase, Database Desktop — используют BDE. Все особенности, имеющиеся в Paradox или dBase, “наследуются” BDE, и поэтому этими же особенностями обладает и Delphi.

Читайте также:  Fable anniversary mac os

Алиасы

Таблицы сохраняются в базе данных. Некоторые СУБД сохраняют базу данных в виде нескольких отдельных файлов, представляющих собой таблицы (в основном, все локальные СУБД), в то время как другие состоят из одного файла, который содержит в себе все таблицы и индексы (InterBase). Например, таблицы dBase и Paradox всегда сохраняются в отдельных файлах на диске. Директорий, содержащий dBase .DBF файлы или Paradox .DB файлы, рассматривается как база данных. Другими словами, любой директорий, содержащий файлы в формате Paradox или dBase, рассматривается Delphi как единая база данных. Для переключения на другую базу данных нужно просто переключиться на другой директорий. Как уже было указано выше, InterBase сохраняет все таблицы в одном файле, имеющем расширение .GDB, поэтому этот файл и есть база данных InterBase.

Удобно не просто указывать путь доступа к таблицам базы данных, а использовать для этого некий заменитель — псевдоним, называемый алиасом. Он сохраняется в отдельном конфигурационном файле в произвольном месте на диске и позволяет исключить из программы прямое указание пути доступа к базе данных. Такой подход дает возможность располагать данные в любом месте, не перекомпилируя при этом программу. Кроме пути доступа, в алиасе указываются тип базы данных, языковый драйвер и много другой управляющей информации.

Поэтому использование алиасов позволяет легко переходить от локальных баз данных к SQL-серверным базам (естественно, при выполнении требований разделения приложения на клиентскую и серверную части).

Для создания алиаса запустите утилиту конфигурации BDE (программу BDECFG.EXE), находящуюся в директории, в котором располагаются динамические библиотеки BDE.

По умолчанию, при установке Delphi создается директорий IDAPI, в котором и располагаются указанные библиотеки; при этом иконка с BDECFG обязательно будет присутствовать в группе Delphi.

Главное окно утилиты настройки BDE имеет вид, изображенный на рис.1. Для создания алиаса выберите страничку “Aliases” и нажмите кнопку “New Alias”. В появившемся диалоговом окне введите имя алиаса и выберите его тип (тип базы данных) из выпадающего списка. Тип алиаса может быть стандартным (STANDARD) для работы с локальными базами в формате dBase или Paradox или соответствовать наименованию SQL-сервера (InterBase, Sybase, Informix, Oracle и т.д.).

Рис. 1: Главное окно утилиты конфигурации BDE.

После создания нового алиаса его имя появится в списке алиасов на той же страничке “Aliases”. Однако просто создать алиас не достаточно. Вам нужно указать дополнительную информацию, содержание которой зависит от типа выбранной базы данных. Например, для баз данных Paradox и dBase (STANDARD) требуется указать лишь путь доступа к данным:

TYPE STANDARD
PATH c:\users\data
Рис. 2: В диалоговом окне добавления нового алиаса можно указать имя алиаса и тип базы данных.

SQL-сервер InterBase требует задания десяти параметров, многие из которых можно оставить установленными по умолчанию (кроме, обычно, параметров SERVER NAME и USER NAME):

TYPE INTRBASE
PATH
SERVER NAME myserv:g:\users\contacts.gdb
USER NAME SYSDBA
OPEN MODE READ/WRITE
SCHEMA CACHE SIZE
LANGDRIVER Pdox ANSI Cyrillic
SQLQRYMODE
SQLPASSTHRU MODE SHARED AUTOCOMMIT
SCHEMA CACHE TIME -1

В этом примере база данных CONTACTS.GDB размещается в директории USERS, находящемся на диске G Windows NT сервера, называющегося MYSERV. Имя пользователя при связи с базой данных по этому алиасу — SYSDBA. Остальные параметры — LANGDRIVER, SQLQRYMODE, SQLPASSTHRU MODE, SCHEMA CACHE SIZE и SCHEMA CACHE TIME рассмотрим подробней.

Параметр LANGDRIVER определяет языковый драйвер для доступа к базе данных. Для правильной работы с русскими буквами при работе с базой данных формата dBase нужно выбрать значение “dBASE RUS cp866”, при работе с базами данных формата Paradox и SQL-серверами (в том числе InterBase) — “Pdox ANSI Cyrillic”. Кроме того, на этапе создания базы данных InterBase необходимо указать CHARACTER SET (набор символов) WIN1251.

Читайте также:  Лучший видеоредактор под linux

Параметр SQLQRYMODE появляется только в случае, если установлен Borland SQL Links для связи с SQL-серверами. Он определяет режим передачи SQL-запросов и может иметь три значения:

* NULL (пустая строка — режим по умолчанию) — запрос сначала посылается на SQL-сервер. Если сервер не может выполнить запрос, последний обрабатывается локально (это актуально для распределенных баз данных);

* SERVER — запрос посылается на SQL-сервер. Если сервер не может выполнить запрос, генерируется ошибка;

* LOCAL — запрос всегда выполняется на рабочей станции.

Параметр SQLPASSTHRU MODE определяет, могут ли запросы, передаваемые для выполнения на сервер (passthrouh SQL, использующие set-ориентированный подход), и стандартные вызовы BDE (использующие record-ориентированный навигационный подход) обрабатываться в одном и том же сеансе соединения с базой данных (в одном и том же “коннекте”) — быть “SHARED”. Он также может иметь три значения:

* SHARED AUTOCOMMIT (значение по умолчанию) — для каждой операции по одной строке таблицы автоматически стартует неявная транзакция, которая, в случае успеха, завершается оператором COMMIT (закрепляющим произведенные изменения). Такой подход наилучшим образом подходит для работы с локальными базами, но неэффективен для SQL-серверных баз данных, так как стартующие каждый раз новые транзакции значительно загружают сетевой траффик.

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

* NOT SHARED — означает, что запросы, передаваемые для выполнения на сервер (passthrouh SQL), и стандартные вызовы BDE (методы Delphi) используют раздельные соединения (“коннекты”) с базой данных. Для управления транзакциями через “passthrouh SQL” необходимо устанавливать именно это значение, иначе “passthrouh SQL” и методы Delphi могут интерферировать друг с другом, что, в свою очередь, может привести к непредсказуемым результатам.

В параметре SCHEMA CACHE SIZE указывается число таблиц базы данных, информация о структуре которых будет кэшироваться, обеспечивая быстрый доступ к метаданным. Значение этого параметра может быть целым числом от 0 до 32. По умолчанию установлено число 8.

Параметр SCHEMA CACHE TIME определяет время, в течение которого будет кэшироваться информация из таблиц базы данных. Может иметь следующие значения:

* -1 (значение по умолчанию) — информация из таблиц кэшируется до самого закрытия базы данных;

* 0 — информация из таблиц вообще не кэшируется;

* 1 — 2,147,483,647 — информация из таблиц кэшируется в течение указанного времени (в секундах).

Напомним, что установки по умолчанию параметров SQLQRYMODE, SQLPASSTHRU MODE, SCHEMA CACHE SIZE и SCHEMA CACHE TIME обеспечивают довольно оптимальный режим работы с базой данных. Экспериментировать с ними для достижения наибольшей эффективности работы с конкретной базой данных желательно только после накопления некоторого опыта работы с BDE.

Остановимся подробней на задании такого важного параметра, как SERVER NAME. В нем нужно указать не только имя сервера (на котором находится Ваша база данных) и полный путь доступа к базе, но и сетевой протокол. Создатели утилиты настройки BDE не сочли нужным выделять протокол в отдельный параметр, поэтому необходимо использовать следующие выражения:

* для доступа по протоколу TCP/IP — IB_SERVER:PATH\DATABASE.GDB.
Например, путь к базе на Windows NT сервере будет выглядеть следующим образом — mynt:c:\ib\base.gdb, а к базе на UNIX-сервере — myunix:/ib/base.gdb;

* для доступа по протоколу IPX/SPX — IB_SERVER@PATH\DATABASE.GDB.
Например: mynw@sys:ib\base.gdb;

* для доступа по протоколу NETBEUI — \\IB_SERVER\PATH\DATABASE.GDB.
Например: \\mynt\c:\ib\base.gdb.

В этих примерах mynt — имя сервера Windows NT, myunix — имя сервера UNIX-системы, mynw — имя сервера Novell NetWare, sys — имя тома NetWare, ib — директорий, в котором находится база данных, base.gdb — имя базы данных InterBase. Для того чтобы правильно указать имя сервера Oracle, нужно писать имя по правилам Oracle — перед именем поставить @.

Читайте также:  Клавиатура как у imac для windows

Замечание. При доступе к SQL-серверным базам данных параметр PATH должен оставаться пустым, иначе ядро баз данных не сможет определить истинный путь к Вашей базе, и будет сгенерирована ошибка.

Обработка сообщений Windows и компонентных сообщений

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Любой компонент, как и программа в целом, работает под управлением Windows1. Эта операционная система посылает приложению массу сообщений, связанных с действиями пользователя или особенностями выполнения кода. Большинство сообщений порождает стандартные события, рассмотренные в 9.2. Однако компонент (программа) может определять нестандартные (пользовательские) сообщения и пересылать их другим компонентам или программе, подобно тому, как это происходит с сообщениями Windows. Кроме того, возможно вам понадобится самостоятельно реализовать перехват и обработку сообщений Windows.

В Delphi определено» также множество компонентных сообщений, которыми обмениваются компоненты. С помощью этих сообщений они извещают друг друга об изменении в текущем состоянии.

В этом разделе описывается, как перехватывать и обрабатывать компонентные сообщения и сообщения Windows.

9.4.1. Суть сообщений Windows и их передача

Сообщение Windows представляет собой следующую структуру данных: type TMessage — packed record

Msg: Cardinal; case Integer of 0: (

1 Напомню, что в книге не рассматриваются компоненты для ОС Linux. Особенности обработки сообщений <сигналов) этой ОС см. в документации Component Writer's Guide.

WParam: Longlnt; LParam: Longlnt; Result: Longlnt); 1: (

Главным полем структуры является поле Msg, в котором передается идентификатор сообщения. В модуле Messages определены идентификаторы всех действующих в 32-разрядных версиях Windows сообщений в виде констант WM_XXXX. Для них зарезервированы значения типа Cardinal от 0 до 1023 включительно. Поля WParam и LParam1 трактуются в зависимости от идентификатора сообщения. Например, для сообщения WM_KEY поле WParam содержит виртуальный код нажатой клавиши, а поле LParam — некоторую дополнительную информацию (количество повторных нажатий, скан-код клавиши и т. д.). Замечу, что большинство сообщений Windows в модуле Messages имеют специализированные типы TWMXXXX, которые содержат названия полей, соответствующие их назначению для данного сообщения. Так, для сообщения WM_KEY, связанного с нажатием клавиши, представлен следующий тип TWMKey:

TWMKey = packed record

При манипуляциях мышью возникает сообщение WM_MOUSE, которому соответствует такой тип:

TWMMouse = packed record

Msg: Cardinal; Keys: Longint; case Integer of 0: (

XPos: Smallint; YPos: Smallint); 1: (

1 Названия полей сохранены такими же, как в ОС Windows 16, в которой поле WParam имело тип Word, a LParam — тип Longlnt.

Подготовленное ядром Windows сообщение передается методу MainWndProc, который имеют все визуальные оконные компоненты. Этот метод никак не обрабатывает полученное сообщение. Он создает защищенный блок обработки сообщения и передает сообщение для дальнейшей обработки активному компоненту, вызывая указываемый своим свойством WindowProc виртуальный метод WndProc. Этот метод производит анализ сообщения и вызывает нужный метод диспетчеризации, который, в свою очередь, вызывает обработчик пользователя (рис. 9.1).

Рис. 9.1. Обработка сообщения Windows

Все методы WndProc умеют осуществлять обработку предназначенных для соответствующих компонентов событий, а также умалчиваемую обработку остальных. Обычно тело метода WndProc содержит несколько операторов if и один или несколько операторов case, с помощью которых анализируется поле Msg полученного сообщения и вызывается соответствующий метод диспетчеризации. Если не найден подходящий метод диспетчеризации, осуществляется умалчиваемая обработка сообщения (обычно сообщение просто игнорируется).

Оцените статью