События протокола Drag and Drop
Протокол Drag and Drop позволяет пользователям легко манипулировать компонентами внутри формы. Разработчик может предусмотреть возможность «перетаскивания» целых компонентов, а также обмена содержимым между компонентами. В Delphi этот протокол базируется на двух событиях — OnDragDrop и OnDragOver, рассматриваемых ниже.
Событие OnDragDrop
Возникает в случае, когда пользователь «отпустил» перетаскиваемый объект. В обработчике этого события должен содержаться код, который будет выполняться, когда пользователь «отпустил» объект. Параметр Source указывает на объект, который был «отпущен», а параметр Sender — на объект, принявший перетащенный объект. Ниже показано, как с помощью протокола Drag and Drop передавать содержимое компонента TEdit компоненту TListBox. Обработчик события OnDragDrop будет выглядеть следующим образом:
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if (Sender is TListBox) and (Source is TEdit) then
begin
(Sender as TListBox).Items.Add((SouVce as TEdit).Text);
end;
end;
В этом примере параметр Source имеет тип TEdit, а параметр Sender — тип TListBox.
Примечание. Перед использованием протокола Drag and Drop необходимо присвоить свойству DragMode всех компонентов значение dmAutomatic.
Сообщение OnDragDrop имеет тип TDragDropEvent,описанный следующим образом:
TDragDropEvent = procedure(Sender, Source: TObject; X, Y: Integer) of object;
Событие OnDragOver
Это событие возникает, когда пользователь «перетаскивает» один компонент в другой. Обычно в обработчике этого события разрешается прием всех компонентов:
Accept := True
или компонента определенного типа, например типа TEdit:
procedure TForm1.ListBox1Drag0ver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source is TEdit;
end;
Событие OnDragOver имеет тип TDragOverEvent,описанный следующим образом:
TDragOverEvent = procedure(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object;
Различные события
Событие OnChange,рассматриваемое в этом разделе, имеет чрезвычайно важное значение в цикле работы приложения. Оно возникает в том случае, когда содержимое компонента изменено. Это событие могут обрабатывать многие графические объекты — TBitmap, TBrush, TCanvas, TFont, TGraphic, TGraphicsObject, TMetaffle, TPen и TPicture, а также все компоненты, реализующие стандартные и дополнительные интерфейсные элементы. Можно вьщелить четыре типа событий OnChange.
К первому типу относится событие OnChange, происходящее в компонентах, использующих данные из баз данных, — TDBComboBox, TDBImage, TDBLabel, TDBListBox, TDBMemo и TDBRadioGroup. Это событие происходит при изменении данных в базе данных (поле DataField).
Второй тип представлен событием OnChange для интерфейсных и графических компонентов. Оно происходит при изменении содержимого компонента, например значений свойств Color, Mode, Style или Width объекта TPen, или при изменении значения свойства Text компонента TEdit.
К третьему типу можно причислить компоненты TDDEClientltem и TDDEServerltem. Событие OnChange происходит при изменении значения свойства Value.
К четвертому же типу можно отнести компонент TTabSet. Для этого компонента событие OnChange возникает при изменении значения свойства Tablndex. Сообщение OnChange для компонента TTabSet имеет тип TTabChangeEvent, описанный следующим образом:
TTabChangeEvent = procedure(Sender: TObject; NewTab: Integer; var AllowChange: Boolean) of object;
Параметр NewTab указывает на страницу, которая станет новой страницей, а параметр AllowChange — на то, разрешается переключение страниц или нет.
Существует еще два события, которые связаны с нестандартными интерфейсными элементами (owner-draw controls), — OnDrawItem и OnMeasureltem. Рассмотрение этих событий выходит за рамки данной книги.
События, обрабатываемые классом TApplication
В главе, посвященной обработке событий, уместно рассмотреть ряд событий, обрабатываемых классом TApplication — классом, который непосредственно не используется программистом, но который реализует базовую функциональность приложения, создаваемого в среде Delphi.
Событие OnException
Событие OnException происходит при критической ошибке, не обрабатываемой приложением. По умолчанию отображается панель сообщений, указывающая на происшедшую критическую ошибку. Переопределенный обработчик этого события может содержать код, который будет выполняться в случае возникновения такой ошибки.
Событие OnException имеет тип TExceptionEvent,описанный следующим образом:
TExceptionEvent = procedure (Sender: TObject; E: EMessage) of object
Параметр Sender указывает на объект, который «выставил» состояние критической ошибки, а параметр Е содержит сообщение, которое будет отображаться в панели сообщений.
Обработчик этого события вызывается методом TApplication. HandleException. Если такой обработчик существует, то управление передается ему, иначе вызывается метод ShowException.
Событие OnHelp
Событие OnHelp происходит при получении приложением запроса на отображение справки. В обработчике этого события могут быть предусмотрены специальные действия перед вызовом справочной системы.
Событие OnHelp имеет тип THelpEvent,описанный следующим образом:
THelpEvent = function (Command: Word; Data: Longint): Boolean of object
Обработчик этого события вызывается методом TApplicatioaInvokeHelp. Если обработчик указывает на необходимость загрузки утилиты WinHelp, то ее вызов происходит в этом методе через вызов функции WinExec. Также этот обработчик вызывается методами HelpContext и HelpJump класса TApplication (через метод InvokeHelp).
Событие OnHint
Событие OnHint происходит, когда указатель мыши находится над компонентом, у которого установлено свойство Hint (значение свойства Hint для этого компонента не равно ""). Обработчик этого события может содержать код, который будет выполняться перед отображением подсказки. Этот обработчик вызывается для всех компонентов, у которых свойство ShowHints имеет значение True.
Обработчик этого события вызывается в методе TApplication.SetHint и имеет тип TNotifyEvent.
Событие Onldle
Это событие происходит, когда приложение находится в режиме ожидания. Если значение параметра Done равно True(по умолчанию), то вызывается стандартная функция WaitMessage, которая передает управление другим приложениям до тех пор, пока в очереди сообщений текущего приложения не появится нового сообщения. Если параметр Done имеет значение Fasle, функция WaitMessage не вызывается. Сообщение Onldle имеет тип TIdleEvent,описанный следующим образом:
TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object
Обработчик этого события вызывается в методе TApplication.Idle. Если такой обработчик существует, управление передается ему, иначе вызывается метод WaitMessage.
Событие OnMessage
Это событие происходит при получении приложением сообщения от ядра Windows. Создав обработчик этого события, вы сможете получать сообщения до их обработки в цикле обработки сообщений.
Событие OnMessage имеет типTMessageNotify, описанный следующим образом:
TMessageEvent = procedure (var Hsg: TMsg; var Handled: Boolean) of object
Параметр Handled указывает, обработано сообщение или нет.
Обработчик этого события вызывается в методе TApplication.ProcessMessage перед вызовом «стандартной» пары функций TranslateMessage и DispatchMessage.
Событие OnActivate
Это событие происходит при активизации приложения. Активизация приложения может происходить либо при его начальном запуске, либо при передаче ему фокуса. Событие OnActivate имеет тип TNotifyEvent. На приведенном ниже примере показано, как переопределить обработчик этого события.
Туре
TForm1 = class(TForm)
procedure ApplicationActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
var
Form1: TForm1;
Procedure TForm1.ApplicationActivate(Sender: TObject);
begin
{////////////////////////////////////////
Здесь вы помещаете код,
который должен выполняться
при активизации приложения
///////////////////////////////////////}
end;
Procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnActivate := ApplicationActivate;
end;
Событие On Deactivate
Это событие происходит при деактивизации приложения (при потере приложением фокуса за счет переключения на другое приложение). Событие OnDeactivate имеет тип TNotiiyEvent. Ниже показано, как создать обработчик этого события.
Procedure TForm1.FormCreate(Sender: TObject);
Begin
Application.OnDeactivate := AppDeactivate;
End;
Procedure TForm1.AppDeactivate(Sender: TObjeot);
Begin
{//////////////////////////
Здесь вы помещаете код,
который должен выполняться
при деактивизации приложения
//////////////////////////}
End;
Событие OnMinimize
Событие возникает при минимизации окна. Это может произойти либо при нажатии пользователем соответствующей кнопки в заголовке окна, выборе команды Minimize в системном меню, или при вызове метода Minimize. Событие OnMinimize имеет тип TNotifyEvent.
Событие OnRestore
Событие возникает при восстановлении окна, бывшего в минимизированном состоянии, до нормального состояния. Это может произойти при двойном нажатии на инонку минимизированного приложения или при вызове метода Restore. Событие OnRestore имеет тип TNotifyEvent.