Создание форм ActiveForm
Никаких ограничений на действия, выполняемые в формах ActiveForm, не накладывается. Единственное, что необходимо учитывать, — клиентам будут недоступны свойства, методы и события компонентов, размещенных на форме. Если такой доступ необходим, то следует добавить в класс формы свойства и методы, через которые клиент сможет изменять свойства внутренних компонентов формы.
В качестве примера создадим форму ActiveForm для вывода в табличном виде информации из таблицы базы данных. Будем использовать таблицу Физические лица из базы данных sales (такой пример, конечно, не имеет большого практического значения, но зато позволяет продемонстрировать механизм использования как визуальных, так и невизуальных компонентов для доступа к данным при создании форм ActiveForm).
1. Выберите в меню команду File ► New и в открывшемся окне диалога New Items па вкладке ActiveX выберите значок ActiveForm. После щелчка на кнопке ОК откроется окно мастера создания форм ActiveForm.
2. Задайте имя создаваемого объекта ActiveForm в окне мастера Active Form Wizard. Данное окно практически не отличается от окна мастера создания элементов ActiveX, приведенного на рис. 18.12. Единственное отличие состоит в том, что для ActiveForm не нужно задавать имя класса VCL, на основе которого создается элемент ActiveX, поэтому список VCL Class Name в окне ActiveForm Wizard недоступен. Присвоим создаваемому элементу ActiveForm имя ТаЫеХ.
После щелчка на кнопке ОК в окне ActiveForm Wizard будет создан новый проект, содержащий три файла:
■ TableProjl.dpr — файл проекта с заголовком библиотеки DLL;
■ Tablelmpll.pas — модуль, содержащий код реализации элемента ActiveForm;
■ TableProjl_TLB.pas — файл библиотеки типов в синтаксисе языка Object Pascal.
Форма, входящая в проект, является основой, на которой будет создаваться форма ActiveForm.
3. Поместите на форму ТТаЫе, TDataSource и TDBGrid. Им будут присвоены имена Tablel, DataSourcel и DBGridl соответственно. Подключите компонент Tablel к таблице Физические лица базы данных sales. Установите свойство DataSet компонента DataSourcel равным Tablel, а свойство DataSource компонента DBGridl равным DataSourcel (таким образом мы настраиваем компонент DBGridl на отображение данных из таблицы Физические лица).
Теперь следует задать свойства, обеспечивающие открытие и закрытие базы данных из программы, использующей форму ActiveForm. Сделать это можно по-разному. Мы создадим одно дополнительное свойство ActiveDb, с помощью которого будем выполнять операции открытия и закрытия базы данных (при присваивании этому свойству значения true база данных будет открываться, а при присваивании значения false — закрываться). Свойство ActiveDb фактически станет интерфейсом, с помощью которого мы будем обращаться к свойству Active компонента Tablet (напомним, что прямой доступ к свойствам компонентов, размещенных на форме ActiveForm, из программы, в которой этот компонент используется, невозможен).
4. Для создания свойства переключитесь в окно редактора библиотеки типов, выберите в иерархическом списке интерфейс ПаЫеХ, щелкните на стрелочке, расположенной рядом с кнопкой New Property на панели инструментов, и в раскрывшемся меню выберите команду Read ► Write. Присвойте созданному свойству имя ActiveDb. Добавленное свойство отобразится в списке как пара свойств — одно для чтения, второе для записи (рис. 18.13). Тип каждого свойства задайте равным VARIANT_B00L.
Рис. 18.13. Включение новых свойств в элемент ActiveForm |
5. Щелкните на кнопке Refresh Implementation панели инструментов. При этом в файлы проекта будут внесены изменения, соответствующие модификациям, произведенным в редакторе библиотеки типов: к интерфейсу ПаЫеХ будет добавлено свойство ActiveDb и пара методов Get_ActiveDb и Set_ActiveDb соответственно для чтения и записи свойства.
В модуль реализации также будут добавлены заголовки этих методов (в описание класса ТТаЫеХ). Реализацию этих методов напишите вручную:function ТТаЫеХ.Get_ActiveDb: WordBool: begin
result:- Tablet.Active; end:
procedure ТТаЫеХ.Set_ActiveDb(Value: WordBool);
begin
Tablet.Active:=Value: end:
6. Теперь необходимо задать свойства, через которые будет производиться передача информации от компонента TabLel приложению, использующему элемент Active Form. Чтобы не усложнять наш пример, будем передавать только один параметр — текущее значение поля Фамилия. Для этого нам понадобится одно дополнительное свойство интерфейса ITabLeX, которому мы присвоим имя Family. Предположим, что нам не требуется модифицировать информацию в базе данных, поэтому это свойство будет только для чтения. Создается оно точно так же, как и рассмотренное свойство ActiveDb, только при его создании следует в меню кнопки New Property выбрать команду Read Only. Тип данного свойства сделайте равным BSTR (он соответствует типу WideString Object Pascal).
7. Щелкните на кнопке Refresh Implementation на панели инструментов, переключитесь в окно редактора кода и задайте следующий код реализации метода 6et_Family в модуле:
function TTableX.Get_Family: WideString: begin
result:» Tablet.FieldByNamel'Фамилия').AsString: end:
8. Последнее, что мы сделаем, — реализуем возможность задания обработчика события AfteiScroll компонента Tablet, размещенного на форме ActiveForm. Это позволит в приложении определить, что положение курсора данных в таблице Физические лица изменилось, и следует обновить отображаемую информацию. Обработчик события создается просто добавлением метода к интерфейсу ITableXEvents. Переключитесь в окно редактора библиотеки типов, выберите в иерархическом списке этот интерфейс, добавьте к нему новый метод и измените имя добавленного метода на OnScroLl. После щелчка на кнопке Refresh Implementation в файлы проекта будут внесены необходимые изменения.
Однако после этого следует также произвести вручную некоторые модификации в файле библиотеки типов. Это связано с тем, что по умолчанию считается, что событие, добавляемое к интерфейсу ItableXEvents, имеет тип TNotifyEvent. Однако в случае события AfterScroLL компонента ПаЫе это не так — данное событие имеет тип TDataSetNotifyEvent. Поэтому вручную измените тип поля и свойства, соответствующие созданному событию:ТТаЫеХ = cl ass(T01 eControl) private
FOnScroll: TDataSetNotifyEvent: public
property OnScroll: TDataSetNotifyEvent read FOnScroll write FOnScroll:
end:
9. Кроме того, добавьте к списку используемых модулей в разделе uses файла библиотеки типов модуль Db с описанием типа TDataSetNotifyEvent:
uses
Windows, ActiveX. Classes. Graphics, OleServer.
OleCtrls. StdVCL. Db;
10. Затем следует вручную внести некоторые изменения в файл реализации формы ActiveForm. Прежде всего, добавьте к разделу private описания класса ТТаЫеХ заголовок процедуры, точно соответствующий заголовку метода-обработчика события AfterScroll компонента ТТаЫе. Название добавляемой процедуры не играет роли, но желательно, чтобы из названия было понятно ее назначение. Назовем ее ScrollEvent:
ТТаЫеХ = classdActiveForm. ITableX)
DataSourcel: TDataSource;
Tab!el: ТТаЫе:
DBGridl: TDBGrid; private
{ Private declarations }
FEvents: ITableXEvents:
procedure Scrol1Event(DataSet: TDataSet); protected
{ Protected declarations }
function Get_ActiveDb: WordBool; safecall; procedure Set_ActiveDb(Value: WordBool): safecall; public
{ Public declarations } procedure Initialize: override; end:
11. Отредактируйте код реализации метода Initialize:
procedure ТТаЫеХ.Initialize; begin
inherited Initialize:
OnActivate := ActivateEvent;
OnClick := ClickEvent:
OnCreate := CreateEvent;
OnDblClick := DblClickEvent;
OnDeactivate := DeactivateEvent;
OnDestroy := DestroyEvent;
OnKeyPress : = KeyPressEvent;
OnPaint := PaintEvent:
Tablel.AfterScroll := Sc.rollEvent; end;
Здесь мы добавили последнюю строку.
Данный метод выполняется при инициализации формы ActiveForm. Благодаря добавленной нами строке обработчиком события AfterScroll компонента Tablel будет определенная нами процедура ScrollEvent.12. Последнее, что осталось сделать, — задать код реализации процедуры ScrollEvent
procedure ТТаЫеХ. Scrol 1 Event (DataSet: TDataSet); begin
if FEvents nil then FEvents.OnScroll; end;
На этом разработка нашего элемента ТаЫеХ завершается. Остается только выполнить его компиляцию (в результате которой будет создан файл TableProjl.ocx). Поскольку большая часть кода генерируется автоматически, то ошибки компиляции могут возникнуть только в небольших фрагментах программы, которые мы добавляли вручную, и их обнаружение не представляет сложности. После компиляции проекта следует зарегистрировать элемент в системе и установить его в палитру компонентов IDE Delphi. Эти процедуры полностью аналогичны соответствующим процедурам для обычного элемента ActiveX, уже рассмотренным нами в этой главе. Разработанный элемент ActiveForm можно использовать как обычный компонент Delphi при создании любых приложений. Более того, этот компонент можно задействовать не только в Delphi, но и в любых других средствах разработки, поддерживающих элементы ActiveX (например, в Visual Basic).
Часть VI
Программирование для Интернета
Еще по теме Создание форм ActiveForm:
- СЕМЬ ОСНОВНЫХ ФОРМ ВИНЫ
- Двенадцать форм “письма ощущений”
- 2. Равенство различных форм собственности
- § 2. ПОИСК ОСОБЕННЫХ ФОРМ СУЩЕСТВОВАНИЯ ОБЩЕГО
- Глава 1. Характеристика основных методов и форм воспитания военнослужащих
- § 1. ОСОБЕННОСТИ ПРИКЛАДНЯХ ФОРМ СОЦИАЛЬНОЙ ТЕОРИИ
- Тема 4. ПРАВОВЕ РЕГУЛЮВАННЯ ЛІЗИНГУ ЯК ОДНІЄЇ 3 ФОРМ ІНВЕСТИЦІЙНОЇ ДІЯЛЬНОСТІ
- 6.1.1. Поиски коллективных форм управления экономикой
- § 3. АБСОЛЮТИЗАЦИЯ ФОРМ ПРОЯВЛЕНИЯ СУЩНОСТИ И ЕЕ ОТРИЦАТЕЛЬНЫЕ ПОСЛЕДСТВИЯ
- § 1. ОБЩАЯ ХАРАКТЕРИСТИКА КОЛЛЕКТИВНЫХ ФОРМ ПСИХОЛОГО-ПЕДАГОГИЧЕСКОЙ ДЕЯТЕЛЬНОСТИ
- Глава VIII МЕТОДИКА ПОДГОТОВКИ И ПРОВЕДЕНИЯ КОЛЛЕКТИВНЫХ ФОРМ ПСИХОЛОГО-ПЕДАГОГИЧЕСКОЙ ДЕЯТЕЛЬНОСТИ
- 4.4. Акти судової влади як одна з форм трудового права
- Структура, практика и познание: социология символических форм Пьера Бурдье
- 4. Необходимо внушить детям неприятие любых форм человеческой разобщенности
- Недостаточная разработанность процессуальных норм — тормоз внедрению в уголовное судопроизводство внеэкспертных форм деятельности психолога.
- ПОНЯТИЕ О ФОРМАХ ОБУЧЕНИЯ. ОСНОВНЫЕ ПОДХОДЫ К КЛАССИФИКАЦИИ ФОРМ ОБУЧЕНИЯ В ИСТОРИЧЕСКОМ РАЗВИТИИ
- 23. Культурные универсалии и многообразие культурных форм
- Право ребенка на неприкосновенность личности, жилища, частной жизни, тайну переписки, телефонных переговоров, почтовых, телеграфных и иных форм сообщений
- 14.8.2. Традиция создания инструментов