<<
>>

Создание форм ActiveForm

В элемент ActiveX можно преобразовать не только VCL-компонент, но и целую форму. Причем в этом случае на форму можно помещать и невизуальные компо­ненты. Следовательно, в виде форм 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

Программирование для Интернета

<< | >>
Источник: Избачков Ю. С., Петров В. Н.. Информационные системы. 2006

Еще по теме Создание форм ActiveForm:

  1. СЕМЬ ОСНОВНЫХ ФОРМ ВИНЫ
  2. Двенадцать форм “письма ощущений”
  3. 2. Равенство различных форм собственности
  4. § 2. ПОИСК ОСОБЕННЫХ ФОРМ СУЩЕСТВОВАНИЯ ОБЩЕГО
  5. Глава 1. Характеристика основных методов и форм воспитания военнослужащих
  6. § 1. ОСОБЕННОСТИ ПРИКЛАДНЯХ ФОРМ СОЦИАЛЬНОЙ ТЕОРИИ
  7. Тема 4. ПРАВОВЕ РЕГУЛЮВАННЯ ЛІЗИНГУ ЯК ОДНІЄЇ 3 ФОРМ ІНВЕСТИЦІЙНОЇ ДІЯЛЬНОСТІ
  8. 6.1.1. Поиски коллективных форм управления экономикой
  9. § 3. АБСОЛЮТИЗАЦИЯ ФОРМ ПРОЯВЛЕНИЯ СУЩНОСТИ И ЕЕ ОТРИЦАТЕЛЬНЫЕ ПОСЛЕДСТВИЯ
  10. § 1. ОБЩАЯ ХАРАКТЕРИСТИКА КОЛЛЕКТИВНЫХ ФОРМ ПСИХОЛОГО-ПЕДАГОГИЧЕСКОЙ ДЕЯТЕЛЬНОСТИ
  11. Глава VIII МЕТОДИКА ПОДГОТОВКИ И ПРОВЕДЕНИЯ КОЛЛЕКТИВНЫХ ФОРМ ПСИХОЛОГО-ПЕДАГОГИЧЕСКОЙ ДЕЯТЕЛЬНОСТИ
  12. 4.4. Акти судової влади як одна з форм трудового права
  13. Структура, практика и познание: социология символических форм Пьера Бурдье
  14. 4. Необходимо внушить детям неприятие любых форм человеческой разобщенности
  15. Недостаточная разработанность процессуальных норм — тормоз внедрению в уголовное судопроизводство внеэкспертных форм деятельности психолога.
  16. ПОНЯТИЕ О ФОРМАХ ОБУЧЕНИЯ. ОСНОВНЫЕ ПОДХОДЫ К КЛАССИФИКАЦИИ ФОРМ ОБУЧЕНИЯ В ИСТОРИЧЕСКОМ РАЗВИТИИ
  17. 23. Культурные универсалии и многообразие культурных форм
  18. Право ребенка на неприкосновенность личности, жилища, частной жизни, тайну переписки, телефонных переговоров, почтовых, телеграфных и иных форм сообщений
  19. 14.8.2. Традиция создания инструментов