От Delphi 4 к Delphi 5 часть 9

От Delphi 4 к Delphi 5
Палитра компонентов

Страница SYSTEM.

На этой странице представлены компоненты, которые имеют различное функциональное назначение. Среди них те, которые поддерживают стандартные для Windows технологии межпрограммного обмена данными OLE ( Object Linking and Embedding — связывание и внедрение объектов) и DDE ( Dynamic Data Exchange — динамический обмен данными). Содержание страниц System для Delphi 4 и Delphi 5 одинаково (рисунок 1).




Timer
предназначен для отсчета интервалов реального времени. Таймер имеет свойство Interval, которое определяет промежуток времени в миллисекундах от момента его включения и до выключения . Интервал времени может составлять от 1 до 65535 мс. Таймер включается установкой свойства Enabled в значение True, тогда он возбуждает событие OnTimer, пока не установите Enabled в False.

PaintBox
представляет собой окно для рисования. На форме создается прямоугольная область, прорисовки графических изображений.


MediaPlayer
служит для управления мультимедийными устройствами (типа CD-ROM, MIDI и т.п.). Компонент выполнен в виде панели управления с кнопками Play, Stop, Record и др. Для воспроизведения может понадобиться как соответствующее оборудование компьютера, так и программное обеспечение. Подключение устройств и установка программного обеспечения производится в среде Windows .


OLEContainer
представляет собой контейнер, который служит приемником для связываемых или внедряемых объектов.


DDEClientConv
совместно с DDEClientItem используется для создания клиентской программы в DDE-связи.


DDEClientItem
организует DDE — тему, определяющую DDE — связи в клиентском приложении.


DDEServerConv
совместно с DDEServerItem используется для создания серверной программы в DDE — связи.


DDEServerItem
определяет тему DDE — связи в серверном приложении.

Так что же представляют собой механизмы DDE и OLE?


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


DDE
— взаимодействие, имеет темы или категории. Наиболее распространенный пример темы — это имя файла. Данные, которые во время диалога перемещаются, называются элементами (Item). Они представляют собой, например, диапазон ряд / колонка в Excel, текстовая строка в Word и т.д.


OLE
( Object Linking and Embedding — связывание и внедрение объектов) охватывает все свойства DDE. OLE является моделью данных, которая обеспечивает более широкие возможности, но дает более сложный программный код. Этот метод позволяет, например, поместить область Excel в документ Word. В отличие от метода DDE, фрагмент Excel не выталкивается как отдельное приложение, а происходит объединение инструментальных кнопок из его меню с меню Word. Таким образом, получается что-то близкое к единой редактирующей среде.


Инспектор объекта.

Страница событий.


Главное отличие приложений DOS от приложений Windows в том, что программы DOS обычно линейны, они выполняются в определенной последовательности. Приложения Windows (включая программы Delphi ) управляются событиями, которые могут не иметь строгой последовательности. Windows переводит действия, например, щелчок по кнопке мыши, вызов команд меню, нажатие клавиш в события.

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

Страница Events в инспекторе объекта перечисляет события, которые обрабатываются и могут быть обработаны формой или компонентом. Пользователь может захватить их, определив метод обработки. Delphi поддерживает два способа выбора процедуры обработки события:

— двойное нажатие на пустое поле справа от значения события;

— ввод имени процедуры обработки события щелчком по компоненту (для события OnClick).


После проведенных действий Delphi вставит имя процедуры обработки события в объявление класса формы, создаст каркас программы реализации процедуры обработки события, поместит курсор вставки программного кода внутрь блока begin — end метода обработки события.

Если вы захотите удалить из исходного текста приложения написанную процедуру отклика на событие, то вам придется убрать и все ссылки на него. Лучший способ состоит в том, чтобы удалить весь код метода обработки соответствующей процедуры, оставив только ее объявления и ключевые слова begin и end. Текст должен быть таким, каким его сгенерировала Delphi . После сохранения проекта произойдет удаление всех пустых процедур из исходного текста и из описания формы, включая ссылки на них на странице Events окна инспектора объекта. Если вы хотите сохранить пустую процедуру обработчика события, то нужно добавить в него комментарий — и Delphi не удалит его.

Рассмотрим назначение некоторых событий, отображаемых в инспекторе объекта.

Событие OnActivate происходит, когда форма становится активной, т.е. получает фокус. Это происходит, когда пользователь щелкает кнопкой мыши по ней. Для MDI окон, когда свойство FormStyle установлено в fsMDIChild, событие OnActivate происходит только в том случае, когда фокус переходит от одного окна к другому.

Событие OnResize используется для выполнения процедуры обработки, когда форма меняет размеры.

Событие OnClick соответствует щелчку мыши на компоненте. Обычно оно наступает, если пользователь нажал и отпустил основную (левую) кнопку мыши, когда ее указатель находится на компоненте.

Событие OnClick происходит в случаях:

— выбора элемента в таблице, дереве, списке, выпадающем списке и нажатия клавиши со стрелкой;

— нажатия клавиши пробела, когда кнопка или индикатор были в фокусе;

— нажатия клавиши Enter, а активная форма имеет кнопку по умолчанию, указанную свойством Default;


— нажатия клавиши Esc, а активная форма имеет кнопку прерывания, указанную свойством Cancel;


— нажатия клавиш быстрого доступа, как правило, сочетание клавиш ( Ctrl+буква), (Alt+буква);


— установления свойства Checked радиокнопки RadioButton;


— выбора команды элемента меню;

— изменения свойства Checked индикатора CheckBox.


Для формы событие OnClick наступает после того, как будет произведен щелчок по ее поверхности в месте, свободном от компонентов.

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


— caNone
не позволяет форме закрываться;


— caHide
форма не закрывается, но только прячется. Ваше приложение может все еще иметь доступ к скрытой форме;


— caFree
форма закрывается, и вся память, занятая формой, освобождается;


— caMinimize
форма минимизируется, но не закрывается.

Следующий программный код отобразит окно с сообщением, прежде чем пользователь закроет форму:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if MessageDlg ('В
ы хотите закрыть форму?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then Action:= caFree else Action
:= caNone; end; end.

Когда вы щелкаете левой кнопкой мыши по кнопке на форме, соответствующей закрытию формы, появляется информационное окно с надписью "Вы хотите закрыть форму? " и двумя кнопками Yes и No.


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

Программный код для этого случая имеет вид:


procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg ('Закрыть форму?', mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose:= False; end; end.



На рисунке 2 показаны сообщения, выдаваемые при закрытии формы для рассмотренных случаев.

Событие OnConstrainedResize используется для того, чтобы выполнить действия, когда компонент меняет свои размеры в соответствии с заданными ограничениями:


type TConstrainedResizeEvent = procedure(Sender: TObject; var MinWidth, MinHeight, MaxWidth, MaxHeight: Integer) of object;


Объект, который меняет размеры, имеет следующие атрибуты: MinWidth — объектная минимальная ширина; MinHeight — объектная минимальная высота; MaxWidth — объектная максимальная ширина; MaxHeight — объектная максимальная высота.

Прежде чем рассмотрим методы OnCreate и OnDestroy, необходимо ознакомиться с некоторыми понятиями.

Суть традиционного программирования языка Паскаль состоит в использовании существующих типов данных, определении новых типов и разбиении программного кода на подпрограммы. В основе языков объектно-ориентированного программирования лежат три фундаментальных понятия: классы, наследование, полиморфизм. Эти три концепции доступны в Object Pascal.


Вначале определимся, что такое классы и объекты?


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


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

Наверно, не совсем понятно, или вернее совсем не понятно? Тогда запомните главное. Выделение памяти сочетается с вызовом специального метода, инициализирующего объект, который называется конструктором. Уничтожение выделенной памяти происходит специальным методом — деструктором. Метод конструктор работает до создания объекта. Общепринято называть конструктор именем Create, деструктор — именем Destroy.


Во многих примерах, поставляемых вместе с Delphi, вы почти не увидите вызовов конструкторов и деструкторов. Дело в том, что любой компонент, попавший при визуальном проектировании в ваше приложение из палитры компонентов, включается в определенную иерархию. Она замыкается на форме ( TForm ): для всех ее составных частей конструкторы и деструкторы вызываются автоматически, невидимо для программиста. Создает и уничтожает формы вашего приложения глобальный объект с именем Application . Если вы откроете файл проекта, то можете увидеть вызов функции CreateForm, предназначенный для этой цели.


program Drag; uses Forms, Drag_pas in 'Drag_pas.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.

Что же касается объектов, создаваемых пользователем, вызов конструкторов и деструкторов осуществляется им самим (рисунок 3).

Рассмотрим пример с использованием компонента PageControl, представляющего собой набор закладок в виде прямоугольных полей с текстом. Программа позволяет создавать новые страницы в компоненте PageControl с использованием метода Create, так сказать, "на лету", т.е. их формирование происходит сразу после запуска приложения. Управление осуществляется компонентом UpDown, щелкая по стрелкам на этой кнопке, вы можете перемещаться между страницами.

    1. Запустите Delphi .
    2. Сохраните файл модуля под именем Sosd_pas, а файл проекта — под именем Sosd dpr . Для этого используйте команду Save Project As ... из меню File .
    3. Поместите на форму компонент PageControl и UpDown со страницы Win32 палитры компонентов .
    4. Поместите на форму компонент Ladel, используя страницу свойств инспектора объекта, введите заголовок " Выбор страниц ".
    5. Активизируйте форму, перейдите на страницу Events инспектора объекта. Щелкните два раза левой кнопкой мыши по белому полю справа от события OnCreate . В открывшемся Редакторе кода запишите программный код, написанный ниже.
    6. Выберите компонент UpDown, дважды щелкните по нему левой кнопкой мыши и запишите для него программный код.



Результат работы программы Sosd показан на рисунке 4.


implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var i:Integer; begin for i:= 0 to 9 do with TTabSheet.Create(Self) do begin PageControl:= PageControl1; Caption:= 'Страница №' + IntTostr(i); end; end; procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType); begin PageControl1.SelectNextPage(Button = btNext); end; end.

Таким образом, событие OnCreate возникает в момент создания формы и может использоваться для выполнения каких-то процедур, например настройки ее самой или содержащихся на ней компонентов. Если в этих процедурах создаются какие-либо объекты, они должны разрушаться, освобождая память, в процедуре обработки события OnDestroy.


Событие OnDblClick используется для того, чтобы выполнить некоторое действие в вашем приложении, отвечающее на двойной щелчок левой кнопкой мыши. К одному и тому же компоненту нельзя написать обработчики событий OnClick и OnDblClick, потому что OnClick всегда перехватит первый из щелчков.

Событие OnDeactivate используется, чтобы выполнить процедуру обработки в случае, когда форма перестает быть активной. Если активизация переходит на другое приложение, это событие не используется.

Событие OnDestroy используется, чтобы выполнить процедуру обработки для уничтожения формы и любых объектов, созданных событием OnCreate .

В Delphi введена поддержка специального интерфейса Drag&Dock (перетащи и причаль), с помощью которого можно перетаскивать мышью компоненты на новое место. Чаще всего он используется для настройки кнопок инструментальных панелей.

В интерфейсе Drag&Dock участвуют два компонента: принимающий и перетаскиваемый. Принимающий компонент должен иметь значение True в свойстве DockSite.


Поскольку технология Drag&Dock является разновидностью общего интерфейса Drag&Drop, то введено дополнительное свойство DragKind, которое определяет способы использования мыши. Для технологии Drag&Drop значение DragKind необходимо установить dkDrag, а для технологии Drag&Dock значение DragKind необходимо установить dkDock.


У перетаскиваемого компонента и компонента-приемника эти свойства должны иметь одинаковое значение, например dkDock.


Для реализации технологии Drag&Dock введены дополнительные свойства и события, которые рассмотрим.

Свойство AutoSize разрешает ( True) или запрещает ( False) оконному компоненту менять свои размеры автоматически в зависимости от количества и размеров содержащихся в нем дочерних компонентов.

Свойство FloatingDockSiteClass определяет класс окна, в которое будет погружен дочерний элемент вне границ оконного элемента. Не оконные компоненты могут не только перетаскиваться в оконные компоненты-приемники, но и покидать их. После "отчаливания" от компонента-приемника они автоматически окружаются окном, тип которого содержит свойство FloatingDockSiteClass. По умолчанию, полученное окно содержит уменьшенный по высоте заголовок и системную кнопку закрытия. Не оконные компоненты принимают оконный вид также после щелчка по ним, т.е. не производя его перетаскивания.

Свойство DockOrientation (doNoOrient, doHorizontal, doVertical) позволяет установить или получить ориентацию, которую будет иметь "причаливаемый" компонент в окне родителя.

Значение DoNoOrient сохраняет исходную ориентацию перемещаемого компонента, doHorisontal определяет горизонтальную ориентацию, doVertical определяет вертикальную ориентацию.

Свойство LRDockWidth задает ширину последнего перемещенного компонента, который расположился горизонтально, а с помощью свойства dbDockHeight можно задать высоту последнего вертикально расположенного компонента.

Свойства UndockHeight, UnDockWidth определяют высоту и ширину последнего "отчаливаемого" компонента.

Свойство Constraints накладывает ограничения на возможные размеры "причаливаемого" компонента (задает максимальные и минимальные величины для высоты и ширины).

Событие OnDockDrop используется в случае выполнения действий по сбросу с одного объекта (перетаскивание) на другой объект:


procedure TForm1.FormDockDrop(Sender: TObject; Source: TDragDockObject; X,

Y: Integer);


Событие OnDockOver используется в том случае, когда необходимо указать действие перемещения над объектом:


procedure TForm1.FormDockOver(Sender: TObject; Source: TDragDockObject; X,

Y: Integer; State: TDragState; var Accept: Boolean);


Событие OnEndDock завершение перетаскивания компонента:


procedure TForm1.FormEndDock(Sender, Target: TObject; X, Y: Integer);

OnGetSiteInfo
используется для того, чтобы сообщить информацию о том, куда перетаскиваемый объект перемещается. Это событие происходит перед OnDockDrop. Его обработчик должен сообщить объекту TDragDockObject, который автоматически связывается с перемещаемым объектом, некоторую дополнительную информацию: размеры, которые будет иметь принимаемый объект, будет ли он погружен в "плавающее окно" и т.д.

Событие OnUnDock:

procedure TForm1.FormUnDock(Sender: TObject; Client: TControl;

NewTarget: TWinControl; var Allow: Boolean);


возникает при "отчаливании" не оконного компонента от своего родителя. Обработчик его должен поместить в переменную Allow значение True, если компонент Client может покинуть границы своего владельца Sender.


Все указанные события обрабатываются автоматически, если оба компонента (клиент и сервер) содержат значение dmAvtomatic в своем свойстве DragMode.


Для того чтобы прочувствовать технологию Drag&Dock, рассмотрим пример.

  1. Запустите Delphi.
  2. Поместите на форму компонент Panel и три кнопки Button1, Button2, Button3.
  3. Установите для компонента панель значение True в свойстве DockSite.
  4. Установите для компонентов Panel1, Button1, Button2, Button3 значение dkDock в свойство DragKind и dmAutomatic в свойство DragMode.
  5. Запустите приложение и перетащите кнопки на компонент Panel1.



Результаты работы приложения показаны на рисунке 5.

Событие OnHelp используется для того, чтобы написать метод обработки в случае выполнения процедуры выдачи подсказки в вашем приложении.

Событие OnHide используется для того, чтобы выполнить процедуру обработки скрытия формы, т.е. свойство Visible для нее установлено в False .

Следующий программный код позволяет использовать свойство Hide . В примере используются две формы. Причем первая форма определяет вторую форму как немодальное диалоговое окно, в свою очередь вторая форма определяет первую форму также как немодальное диалоговое окно. Таким образом, имеется циклическая ссылка между формами (рисунок 6). Для модальных диалоговых окон такая ссылка невозможна.

Вам необходимо добавить методы обработки событий для управления кнопками на основной и вторичной форме. В качестве основной у нас выступает форма 1, так как она появляется первой при запуске приложения, для второй формы свойство Visible установлено в False. Если установить свойство Visible для формы 2 в True, то при запуске приложения вторая форма появляется первой. Каждая кнопка должна обработать событие: щелчок по кнопке мыши. Для каждой формы сначала активизируйте саму форму, затем кнопку. Далее перейдите на страницу Events инспектора объекта и произведите двойной щелчок по пустому полю справа от события OnClick. Введите соответствующий программный код. Таким же образом необходимо поступить для события OnHide при активизации форм: первой и второй . Обратите внимание на оператор uses, который включает имя модуля Unit1, Unit2 для соответствующих форм. Эти объявления необходимы для организации их вызова в качестве немодальных диалоговых окон.

Программный код выглядит следующим образом:


implementation uses Unit2; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; Hide; end; procedure TForm1.FormHide(Sender: TObject); begin Form2.Label1.Caption:= 'Перейдите на форму 2'; end; end.

procedure TForm2.Button1Click(Sender: TObject); begin Form1.Show; Hide; end; procedure TForm2.FormHide(Sender: TObject); begin Form1.Label1.Caption:= 'Перейдите на форму 1'; end;
Литература:

  1. Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО "Малип". 1997 г.
  2. Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
  3. Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996 г.
  4. В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
  5. А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО "Издательство Бином". 2000 г.

Владимир Скуратов


(c) компьютерная газета




Компьютерная газета. Статья была опубликована в номере 16 за 2001 год в рубрике программирование :: delphi

©1997-2024 Компьютерная газета