События протокола 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 указывает на объект, который «выставил» со­стояние критической ошибки, а параметр Е содержит сообще­ние, которое будет отображаться в панели сообщений.

Обработчик этого события вызывается методом TAppli­cation. 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.

Наши рекомендации