События компонентов и классов C++Builder

В этой главе приведено описание более 50 основных событий, на которые реа­гируют компоненты и объекты классов C++Builder. Для многих событий даются примеры обработчиков. Большее число описаний событий и примеров их обработ­ки вы можете найти в источнике [3].

В описаниях вы можете встретить идентификаторы, выделенные подчеркива­нием. Например, TDataSet. Это означает, что в этой или других главах в соответ­ствующем разделе вы сможете найти развернутое пояснение, комментарий или примеры, связанные с данным термином.

Объявления событий несколько упрощены. В частности, отсутствуют указа­Ния функций чтения и записи соответствующих полей классов.

AfterCancel и BeforeCancel

События, возникающие при выполнении метода Cancel.

Класс TDaTaSet

Определения

Typedef’void _ fastcall ( _ closure tTDataSetNotifyEvent)

(TDataSet* DataSet) ;

_ property CDataSetNotif yEvent AfterCancel

_ property TDataSetNotifyEvent BeforeCancel

Описание

Событие BeforeCancel Наступает в начале выполнения метода Cancel, А собы­тие AfterCancel Наступает после выполнения этой процедуры. Параметр DataSet Указывает объект набора данных, к которому применяется метод Cancel.

Обработчики событий BeforeCancel И AfterCancel Могут использоваться для каких-то операций, которые необходимо произвести при отказе от исправлений те­кущей записи, осуществляемом методом Cancel. Например, в обработчике Before­Cancel Можно предусмотреть сохранение изменений в каком-то буфере или вообще отказаться от выполнения Cancel, Вызвав функцию Abort.

Пример

Следующий обработчик события AfterCancel Извещает пользователя об отме­не введенных изменений записи:

Void _fastcall TForrnl : : TabielAfterCancel (TDataSet *DataSet)

{ ,

StatusBarl->SimpleText = "Исправление записи в таблице " +

((TTable *) DataSet) ->TableName ■■

)

Определения

Typedef void _fastcall (_closure *TDataSetNotifyEvent)

(TDataSet* DataSet)

_ property TDataSetNotifyEvent AfterClose

_ property TDataSetNotifyEvent BeforeClose

Описание

Событие BeforeClose Наступает перед закрытием набора данных методом Close Или установкой свойства Active В False. Событие AfterClose Наступает после за­крытия набора данных. Параметр DataSet Указывает объект закрываемого набора данных.

Обработчики событий BeforeClose И AfterClose Могут использоваться для ка­ких-то операций, которые необходимо произвести при закрытии набора данных. Например, в обработчике события BeforeClose Можно предусмотреть запрос поль­зователю о необходимости закрыть набор данных и при отрицательном ответе пользователя прекратить закрытие, вызвав функцию Abort.

Пример

Следующий обработчик события BeforeClose Определяет перед закрытием на­бора данных наличие в кэше изменений, не сохраненных в базе данных, и осуще­ствляет их сохранение.

Void _fastcall TForml :: TablelBeforeClose(TDataSet *DataSet)

{.

If (Tablel-XJpdatesPending)

Tablel->ApplyUpdates();

}

Следующий обработчик осуществляет весь комплекс операций, связанный с пересылкой изменений в базу данных. В нем используется компонент Database! Типа TDatabase. Этот обработчик события BeforeClose, Безусловно, предпочти­тельнее предыдущего.

Void _ fastcall TForml::TablelBeforeClose(TDataSet *DataSet)

(.

If (Tablel-XJpdatesPending)

{

Databasel->StartTransaction();

Try

{

// Пересылка Изменений В базу данных Tablel->Apply(Jpdates () ;

// Попытка их зафиксировать

Databasel-S-Commit ();

}

Catch (…)

{

// Откат назад при безуспешной попытке фиксация

Databasel-S-Rollback () ;

// Генерация Исключения,

// Чтобы предотвратить Вызов ConmitUpdates

Throw;

}

// Очистка Буфера Кэша

Tablel-S-CommitUpdates () ;

)

1

Следующий обработчик события AfterClose Извещает пользователя о закры­тии набора данных:

Void _fastcall TForml : :TablelAfterClose(TDataSet *DataSet)

(

StatusBarl->SimpleText = "Работа с таблицей " +

( (TTable *) DataSet) ->TableName + завершена";

AfterDelete и BeforeDelete _

События, возникающие при удалении текущей записи методом Delete.

Класс TDataSet

Определения

Typedef void _fastcall (_closure ‘TDataSetNotifyEvent)

(TDataSet* DataSet);

_ property TDataSetNotif yEvent AfterDelete _ property TDataSetKotif yEvent BeforeDelete

Описание

Событие BeforeDelete Наступает перед удалением текущей записи методом

Delete. Событие AfterDelete Наступает после удаления записи. Параметр DataSet Указывает объект набора данных, запись которого удаляется.

Обработчики событий BeforeDelete И AfterDelete Могут использоваться для каких-то операций, которые необходимо произвести при удалении записи. Напри­мер, в обработчике события BeforeDelete Можно предусмотреть запрос пользовате­лю о необходимости удаления и при отрицательном ответе пользователя прекра­тить удаление, вызвав функцию Abort.

Пример

Следующий обработчик события BeforeDelete Запрашивает у пользователя разрешение на удаление записи. При отсутствии утвердительного ответа удаление не производится.

Void _fastcall TForml ::TablelBeforeDelete(TDataSet *DataSet)

{

If (Application->MessageBox (

"Действительно хотите удалить запись?", "Подтвердите удаление записи", MBJfESNOCANCEL + MB_ICONQUESTION) != IDYES)

Abort () ;

)

AfterEdit и BeforeEdit____________________________________________

События, возникающие перед началом и после начала редактирования записи.

Класс TDataSet

Определения

Typedef void_______ fastcall ( closure ‘TDataSetNotifyEvent)

(TDataSet* DataSet) ;

__ property TDataSetNotifyEvent AfterEdit

__ property TDataSetNotifyEvent BeforeEdit

Описание

Событие BeforeEdit Наступает перед началом перехода набора данных в режим редактирования. Событие AfierEdii наступает сразу после перехода набора дан­ных в режим редактирования. Параметр DataSet Указывает объект редактируемо­го набора данных.

Обработчик события BeforeDeIcte можно использовать, например, чтобы за­претить редактирование. Для этого в нем можно вызвать функцию Abort. Обработ­чик события AfterDclete можно использовать для какого-то извещения пользова­теля о начале редактирования, например, для отображения соответствующего со­Общения в строке состояния приложения.

AfterInsert и BeforeInsert _________________________________________

События, возникающие непосредственно перед и после вставки новой записи.

Класс TDataSet

Определения

Typedef void_ fastcall (_ closure jtTDataSetNotifyEvent)

(TDataSet* DataSet) ;

_ property TDataSetNotifyEvent Afterlnsert

_ property TDataSetNotifyEvent Beforelnsert

Описание

Событие Beforelnsert Наступает перед переходом набора данных в режим вставки записи в результате вызова методов Insert Или Append. Событие After­Insert Наступает сразу после вставки записи в результате вызова этих методов. Па­раметр DataSet Указывает объект редактируемого набора данных.

Обработчик события Beforelnsert Можно использовать, например, чтобы запре­тить вставку. Для этого в нем можно вызвать функцию Abort. Обработчик события Afterlnsert Можно использовать для какого-то извещения пользователя о начале вставки, например, для отображения соответствующего сообщения в строке состоя­ния приложения.

Пример

Следующий обработчик события Beforelnsert Запрашивает у пользователя разрешение на вставку записи. При отсутствии утвердительного ответа вставка не производится.

Void fastcall TForml::TablelBeforeInsert(TDataSet *DataSet)

{

If (Application->MessageBox(

"Действительно хотите вставить запись "

" в базу данных?",

"Подтвердите вставку записи",

MB_YESNOCANCEL + MB_ICONQUESTION) != IDYES)

Abort() ;

ɪ

AfterOpen и BeforeOpen

События, возникающие непосредственно перед и после открытия набора данных.

Класс TDataSet

Определения

Typedef void______ fastcall ( closure *TDataSetNotifyEvent)

(TDataSet* DataSet) ;

__ property TDataSetNotifyEvent AfterOpen

__ property TDataSetNotifyEvent BeforeOpen

Описание

Событие BeforeOpen Наступает перед открытием набора данных, т. е. при уста­новке свойства Active В True Или при вызове метода Open. Событие AfterOpen На­ступает сразу после открытием набора данных, когда он устанавливается в состоя-

HuedsBrowse. Параметр DataSet указывает объект редактируемого набора дан­ных.

Обработчики событий BeforeOpen и AfterOpen могут выполнять какие-то дей­ствия, необходимые при открытии набора данных. Например, обработчик события AfterOpen можно использовать для того, чтобы прочитать в реестре или файле конфигурации номер записи, с которой приложение работало в последний раз, и установить курсор на эту запись.

Пример

Следующий обработчик события AfterOpen извещает пользователя об откры­тии набора данных:

Void____ fastcall TForml::TablelAfterOpen(TDataSet *DataSet)

{

StatusBarl->SimpleText = "Открыта таблица " +

( (TTable *)DataSet)->TableName;

1

AfterPost и BeforePost___________________________________________

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

Класс TDataSet

Определения

Typedef’ void_________ fastcall (_________ closure iTDataSetNotifyEvent)

(TDataSet* DataSet) ;

_ property TDataSetNotifyEvent AfterPost

_ property TDataSetNotifyEvent BeforePost

Описание

Событие BeforePost Наступает перед пересылкой методом Post Изменений в те­кущей записи в базу данных или буфер кеширования. Событие AfterPost Наступа­ет сразу после пересылки измененной записи. Параметр DataSet Указывает объект редактируемого набора данных.

Обработчик события BeforePost Можно использовать для проверки правильно­сти исправлений в записи и запроса подтверждения исправлений со стороны поль­зователя. В этом обработчике можно отказаться от пересылки исправлений, вы­звав функцию Abort. Обработчик события AfterPost Можно использовать для со­общения пользователю о результатах пересылки исправлений в базу данных.

Пример

Один из множества возможных вариантов проверки достоверности данных пе­ред их пересылкой в базу данных — использование события BeforePost. Обработ­чик этого события может иметь вид:

Void fastcall TForml::TablelBeforePost(TDataSet *DataSet)

{

If (проверка введенных данных)

{

If (Application->MessageBox(

"Хотите занести текущую запись в базу данных?", "Подтвердите занесение в базу данных",

MBJfESNOCANCEL + MB_ICONQUESTION) ! = IDYES)

{

DataSet->Cancel ();

Abort () ;

)

}

Else

T

Application->MessageBox("Ошибочные данные","Ошибка", MB_ICONSTOP)

Abort () ;

К этому обработчику будет происходить обращение перед выполнением метода Post, Как бы он не был вызван: явно или вследствие перемещения по базе данных, если текущая запись была изменена. В обработчике сначала производится проверка данных в записи. Если она дает неудовлетворительный результат, то пользователю дается сообщение об ошибочности данных и выполняется функция Abort, Преры­вающая выполнение Post. Текущая запись остается в состоянии dsEdit, но ошибоч­ные данные в ней не сбрасываются, что позволяет пользователю исправить их.

Если проверка данных в записи показала их правильность, то у пользователя запрашивается подтверждение изменений в базе данных. Если он ответит отрица­тельно, т. е. не нажмет кнопку Да, то для набора данных выполняется метод Cancel, А затем выполняется функция Abort. Cancel Возвращает данные в текущей записи к состоянию, которое было до их редактирования, т. е. уничтожает резуль­Таты редактирования.

AfterRefresh и BeforeRefresh _

События, возникающие непосредственно перед и после обновления отображае­мых данных методом Refresh.

Класс TDataSet Определения

Typedef’ void _ fastcall ( _ closure fcTDataSetNotifyEvent)

(TDataSet* DataSet);

_ property TDataSetNotifyEvent AfterRefresh

Property TDataSetNotifyEvent BeforeRefresh

Описание

Событие BeforeRefresh Наступает перед обновлением отображаемых данных методом Refresh. Событие AfterRefresh Наступает сразу после такого обновления. Параметр DataSet Указывает объект отображаемого набора данных.

Обработчики событий AfterRefresh И BeforeRefresh Можно использовать для каких-то операций, которые должны осуществляться при обновлении отображае­мых данных, например, для соответствующей настройки компонентов, отобра­Жающих данные, для выдачи каких-то сообщений пользователю и т. п.

AfterScroll и BeforeScroll__________________________________________

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

Класс TDataSet Определения

Typedef void fastcall ( closure -fcTDataSetNotifyEvent)

(TDataSet* DataSet);

_ property TDataSetNotifyEvent AfterScroll

_ property TDataSetNotifyEvent BeforeScroll

Описание

Событие BeforeScroll Наступает перед перемещением на новую запись метода­ми First. Last. MovoBy. Next. Prior. FindKey. FindFirst. FindNext, FindLast. FindPrior. Locate. Это событие наступает раньше всех иных событий, связанных

С перемещением по таблице. Событие AfterScrolJ наступает сразу после такого пе­ремещения. Параметр DataSet Указывает объект набора данных.

Обработчики событий AfterScroIl и BeforeScroll Можно использовать для ка­ких-то операций, которые должны осуществляться при навигации по таблице. На­пример, в обработчике события BeforeScroll Можно запретить перемещение, вы­звав функцию Abort. Можно проверить по свойству Modified, были ли изменения в текущей записи, и если были, то решить, допустим ли последующий автоматиче­ский вызов метода Post.

Пример

См. пример в гл. 4, в разд. «Refresh, RefreshRecord — методы наборов дан­ных».

BeforeCancel

Событие, возникающее в начале выполнения метода Cancel.

Подробнее см. в разделе «AfterCancel и BeforeCancel*.

BeforeClose_____________________________________________________

Событие, возникающее перед закрытием соединения с набором данных. Подробнее см. в разделе «AfterClose и BeforeClose*.

BeforeDeIete____________________________________________________

Событие возникающее перед удалением текущей записи.

Подробнее см. в разделе «AfterDelete и BeforeDelete*.

BeforeEdit______________________________________________________

Событие, возникающее после начала редактирования записи.

Подробнее см. в разделе «AfterEdit и BeforeEdit*.

BeforeInsert_____________________________________________________

Событие, возникающее непосредственно перед вставкой новой записи. Подробнее см. в разделе «Afterinsert и BeforeInsert*.

BeforeOpen_____________________________________________________

Событие, возникающее непосредственно перед открытием набора данных. Подробнее см. в разделе «AfterOpen и BeforeOpen».

BeforePost______________________________________________________

Событие, возникающее непосредственно перед пересылкой изменений в теку­щей записи в базу данных или буфер.

Подробнее см. в разделе «AfterPost и BeforePost».

BeforeRefresh___________________________________________________

Событие, возникающее непосредственно перед обновлением отображаемых данных методом Refresh.

Подробнее см. в разделе «AfterRefresh и BeforeRefresh*.

BeforeScroll ____________________________________________________

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

Подробнее см. в разделе «AfterScroll и BeforeScroll».

OnCalcFields____________________________________________________

Событие, наступающее при пересчете вычисляемых полей.

Класс TDataSet Определение

Typedel’ void______ fastcall ( closure *TDataSetNotifyEvent)

(TDataSet* CataSet) ;

_ property TDataSetNotifyEvent OnCalcFields

Описание

Событие OnCalcFields Наступает, когда осуществляется пересчет вычисляе­мых полей. Вычисляемые поля — это поля, отсутствующие в исходной базе дан­ных, значения которых определяет приложение по значениям каких-то других по­лей записи. Этот расчет значений вычисляемых полей оформляется как обработ­чик события OnCalcFields,

Событие OnCalcFields Наступает только в случае, если свойство AutoCalc — Fields Набора данных установлено в True.

Событие OnCalcFields Наступает при:

• открытии набора данных

• переходе набора данных в состояние DsEdit

• перемещении фокуса с одного компонента, отображающего данные, на другой

• перемещении в компоненте-таблице, отображающей данные, с одного столбца

На другой

• модификации текущей записи

• получении записи из базы данных

Обработчик события OnCalcFields Не должен изменять набор данных. В про­тивном случае подобное изменение вызовет генерацию нового события OnCalcFields, Что приведет к зацикливанию вычислений.

Пример

Следующий обработчик рассчитывает вычисляемое поле Age (возраст) табли­цы Tablel По значению поля Year_b (год рождения) и текущей дате.

Void____ fastcall TForml:ITablelCalcFields(TDataSet *DataSet)

{

Unsigned short Year, Month, Day;

Date().DecodeDate(SYearjSMonthjSDay);

TablelAge->Value = Year — TablelYear_b->Value;

}

Вместо непосредственного обращения к объектам полей TablelAge И Tablel — Year_b Можно было бы использовать более общий вид — обращение через параметр DataSet: DataSet—>FieldByName("Age") И DataSet—>FieldByName("Year_b").

В коде обработчика введены переменные Year, Month И Day Для хранения те­кущего года, месяца и дня. Использована процедура DecodeDate Для преобразова­ния своего первого аргумента, имеющего тип TDateTime (этот тип используется в C++Builder для хранения дат и времени), в целые значения года, Месяца и дня. А в качестве первого аргумента этой процедуры указана функция Date, Возвращаю­щая текущую дату. В результате переменная Year Становится равной текущему году (переменные Month И Day Не нужны и объявлены только для того, чтобы можно было обратиться к процедуре DecodeDate).

Вместо принятого в примере непосредственного обращения к объектам полей TablelAge И TablelYearJb Можно было бы использовать более общий вид — обра­щение через параметр DataSet:

DataSet->FieldByName("Аде")

И

DataSet->FieldByName("Year_b")

OnChange — событие выпадающих списков_____________ __________

Событие наступает, когда изменяется текст, отображаемый в области редакти­рования списка.

Класс TCustomComboBox

Определение

Typedef void ( closure *TNotifyEvent) (System::TObject* Sender);

__ property Classes::TNotifyEvent OnChange

Описание

Событие OnChange Наступает сразу после того, как пользователь изменил текст, отображаемый в области редактирования списка. Это изменение может быть связано как с непосредственным редактированием текста, так и с выбором пользователем нового значения в списке. В момент обработки события свойство Text равно новому значению текста.

Событие не наступает, если свойство Text изменяется программно, а не в ре­Зультате действий пользователя.

OnChange — событие класса TField________________________________

Событие наступает после занесения данных поля в буфер записи.

Класс TField Определение

Typedef void_______ fastcall ( closure tTFieldNotifyEvent) (TField* Sender) ;

__ property TFieldNotifyEvent OnChange

Описание

При занесении значения поля Value В буфер текущей записи последовательно выполняются следующие операции:

1. Вызывается обработчик события On Validate, Позволяющий проверить допус­

Тимость записываемых данных

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

3. Если при записи данных не сгенерировано исключение, вызывается обработ­чик события OnChange

Обработчик события OnChange Позволяет определить реакцию на данные, ус­Пешно записанные в буфер записи, например, известить об этом пользователя.

OnChange — событие класса TGraphicsObject_______________________

Событие наступает после изменения графического объекта.

Класс TGraphicsObject Определение

Typedef void (_______ closure *TNotifyEvent) (System::TObject* Sender);

__ property Classes::TNotifyEvent OnChange

Описание

Обработчик события OnChange Должен осуществить необходимые операции При изменении графического объекта и отразить его новые установки.

OnChange — событие меню

Событие наступает при изменении меню.

Классы TMenu, TMainMenu, TPopupMenu

Определение

Typedef’ void__________ fastcall ( closure *TMenuChangeEvent)

System: ∙.T0bject* Sender, TMenuItem* Source, bool Rebuild) ;

_ property TMenuChangeEvent OnChange

Описание

Событие OnChange Наступает при загрузке меню В память и при изменении структуры меню: добавлении или удалении разделов, изменении их свойств.

В обработчике события параметр Sender — — изменяемое меню, параметр Source — изменяемый раздел меню (если таковой имеется). Параметр Rebuild Ука­зывает, будет ли меню перестраиваться (например, при удалении или добавлении Разделов).

OnChange — событие окон редактирования_________________________

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

Класс TCustomEdit

Определение

Typedef void (_______ closure *TNotifyEvent) (System::TObject* Sender);

__ property Classes::TNotifyEven OnChange

Описание

Событие OnChange Наступает, когда может быть изменился текст в окне ре­дактирования. В момент обработки события свойство Text Равно новому значению текста. Определить, изменен ли в действительности текст, можно по значению Свойства Modified, Получающему значение True, Если текст изменен.

OnChange И OnChanging События Класса TCanvas_________________

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

Класс TCanvas

Определение

Typedef void ( closure *TNotifyEvent) (System::TObject* Sender);

__ property Classes::TNotifyEvent OnChange

__ property Classes : : TNotif yEvent OnChanging

Описание

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

1. Наступает событие OnChanging.

2. Вызванный метод канвы TCanvas Делает изменения в изображении.

3. Наступает событие OnChange.

Событие канвы OnChange наступает при изменении именно самого изображе­ния, а не свойств канвы. Такие свойства канвы, как объекты Font — шрифт, Brush — кисть и Реп — перо имеют свои собственные события OnChange.

OnChanging — событие TCanvas________________________

См. разд. «OnChange и OnChanging — события класса TCanvas*

OnClick_________________________________________________________________

Событие соответствует щелчку мыши на компоненте и некоторым другим дей­ствиям пользователя.

Класс TControL

Определение

Typedef void ( closure *TNotify Event) (System::TObject* Sender);

___ property Classes::TNotifyEvent OnClick

Описание

Обычно событие OnClick Наступает, если пользователь нажал и отпустил ос­новную кнопку мыши, когда указатель мыши находился на компоненте. Это собы­тие происходит также, если:

• Пользователь выбрал элемент в таблице, дереве, списке, выпадающем списке, нажав клавишу со стрелкой.

• Пользователь нажал клавишу пробела, когда кнопка или индикатор были

В фокусе.

• Пользователь нажал клавишу Enter, а активная форма имеет кнопку по умол­чанию, указанную свойством Default.

• Пользователь нажал клавишу Esc, а активная форма имеет кнопку прерыва­ния, указанную свойством Cancel.

• Пользователь нажал клавиши быстрого доступа к кнопке или индикатору. На­

Пример, если свойство Caption Индикатора записано как "^Полужирный" и символ подчеркнут, то нажатие пользователем комбинации клавиш Alt-Π

Вызовет событие OnClick В этом индикаторе.

• Приложение установило в True Свойство Checked Радиокнопки RadioButton.

• Приложение изменило свойство Checked Индикатора CheckBox.

• Вызван метод Click Элемента меню.

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

Параметр обработчика Sender Содержит объект, в котором произошло собы­тие, и может использоваться для дифференцированной реакции на события в раз­ных компонентах.

Пример

Один обработчик события OnClick Может использовать для обработки событий в различных компонентах. Если при этом требуется различать, в каком компонен­те произошло событие, можно использовать параметр Sender, Как В Приведенном чисто демонстрационном примере, отображающем сообщение о том, в каком ком­поненте произошло событие:

ShowMessage("OnClick в ‘, + ((TComponent *)Sender)->Name);

OnCreate

Событие происходит при создании формы.

Класс TCustomForm

Определение

Typedef void (______ closure *TNotifyEvent) (SystemxzTObject* Sender);

___ property ClasseszxTNotifyEvent OnCreate;

Описание

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

Последовательность событий при создании формы, имеющей значение свойст­Ва Visible, Равное True: OnCreate, OnShow, OnActivate, OnPaint.

OnDataRequest Событие TCustomProvider___________________________________

См. в гл. 4 разд. «DataRequest, OnDataRequest — методы и событие».

OnDblClick_______________________________________________________________

Событие соответствует двойному щелчку мыши на компоненте.

Класс TControl

Определение

Typedef void (_ closure *TNotifyEvent) (SystemzzTObject* Sender);

_ property Classes::TNotifyEvent OnDblClick

Описание

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

Параметр Sender Содержит объект, в котором произошло событие, и может ис­Пользоваться для дифференцированной реакции на события в разных компонентах.

OnDeleteError

Событие, наступающее при генерации исключения в процессе удаления записи.

Класс TDataSet Определение

Enum TDataAction { daFail, daAbort, daRetry }; typedef void fastcall ( closure *TDataSetErrorEvent)

(TDataSet* DataSet, EDatabaseError* E, TDataAction sAction) ;

__ property TDataSetErrorEvent OnDeleteError;

Описание

Событие OnDeleteError Наступает, если была сделана попытка удалить запись и она закончилась неудачей — генерацией исключения. В обработчике события OnDeleteError Можно предусмотреть действия, необходимые в этом случае.

Параметр DataSet Указывает набор данных, из которого неудачно удалялась запись. Параметр Е является указателем на объект исключения EDatabaseError, Свойство Message Которого (E. Message) содержит строку сообщения об ошибке. Впрочем, если уж отображать сообщение об ошибке, то лучше это делать на рус-

Ском языке, заменив стандартное значение Message. Параметр Action Типа TDataAction (объявлен в модуле Comctrls), передаваемый по ссылке, указывает харак­тер действий после выхода из обработчика:

DaFail

Прерывание операции, приведшей к ошибке, и отображение поль­зователю сообщения об ошибке

DaAbort

Прерывание операции, приведшей к ошибке, без отображения поль­зователю сообщения об ошибке

DaRetry

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

При обращении к обработчику значение Action Равно DaFail.

QnDragDrop____________________________________________________

Событие наступает в момент отпускания перетаскиваемого компонента над данным компонентом

Класс TControL Определение

Typedef void ( closure *TDragDropEvent) (System: :TObjecf Sender,

System: .-TObject* Source, int X, int Y) ;

__ property TDragDropEvent OnDragDrop

Описание

Событие OnDragDrop Наступает в момент отпускания перетаскиваемого ком­понента над данным компонентом. В обработчике события надо описать, что в этот момент должно произойти. Параметр Source Соответствует перетаскиваемому объ­екту, а параметр Sender — объекту, над которым объект был отпущен. Параметры X и Y содержат координаты позиции курсора мыши над компонентом в системе координат клиентской области этого компонента.

Примеры

1. Пусть на форме имеется несколько списков типа TListBox И вы хотите позво­лить пользователю перемещать строки из одного списка в другой. Это можно сделать следующим образом.

Во всех списках задаются значения свойств DragMode. Равные Dm Automatic. Это обеспечивает автоматическое начало перетаскивания.

Далее для всех списков пишется единый обработчик события OnDragOver Вида:

Void fastcall TForml::ListBoxlDragOver(TObject *Sender,

TObject *Source, int X, int Y,

TDragState State, bool «.Accept)

{

If (Sender!= Source)

Accept = Source-S-ClassNameIs ("TListBox") ; else Accept = false;

}

В нем сначала проверяется, не являются ли данный компонент (Sender) И пере­таскиваемый объект (Source) Одним и тем же объектом. Это сделано, чтобы из­бежать перетаскивания информации внутри одного и того же списка. Если ис­точник и приемник являются одним и тем же объектом, то срабатывает Else

И параметр Accept Становится равным False, Запрещая прием информации. Если же это разные объекты, то Accept Делается равным true, если источником является какой-то другой список (компонент класса TListBox), И равным False, Если источник является объектом любого другого типа. Таким образом компо­нент сообщает, что готов принять информацию из любого другого списка. Далее для всех списков пишется единый обработчик события OnDragDrop Вида:

Void____ fastcall TForml::ListBoxlDragDrop(TObject *Sender,

TObject *Source, int X, int Y)

{

TListBox *S = (TListBox *)Source;

((TListBox*)Sender)->Items->Add(S->Items->Strings[S->ItemIndex));

}

В этом обработчике первый оператор создает указатель S на объект класса TListBox, И передает в него ссылку на объект Source, Воспринимаемый как объект TListBox. Это сделано просто для того, чтобы не повторять несколько раз в следующем операторе приведение типа Source К указателю на объект класса TListBox. А такое приведение типа необходимо по следующей причи­не. Параметр Source Объявлен как указатель на объект класса TObject. Но в этом классе отсутствуют свойства Items И ItemIndex. Они имеются только в классе TListBox. Поэтому прежде, чем обратиться к этим свойствам, надо произвести соответствующее приведение типа Source.

Второй оператор обработчика заносит методом Add выделенную строку спис­ка-источника S в список-приемник Sender.

Подобные обработчики событий позволяют пользователю перетаскивать стро­ки между любыми имеющимися списками.

2. Если приведенный выше пример по каким-то соображениям желательно осу­ществлять не в автоматическом режиме, а в режиме ручного управления (на­пример, перетаскивание возможно только при нажатой клавише Alt или в ка­ком-то конкретном режиме работы приложения), то отличия в реализации примера заключаются в следующем.

Во всех списках задаются значения свойств DragMode, Равные DmManual. Это обеспечивает управление началом перетаскивания.

void fastcall tforml: :listboxlmousedown (tobject
tmousebutton button, tshiftstate shift,

♦sender, int x, intу)Затем в списках задается обработчик события OnMouseDown Вида:

{

If ( (Button == IiibLeft) && Shift. Contains(ssAlt)) ListBoxl->BeginDrag(false,5);

}

В этом обработчике первое условие проверяет, нажата ли именно левая кнопка мыши, второе — нажатие клавиши Alt (можно задать какое-то другое условие, по которому нажатие кнопки мыши можно ассоциировать с началом перетас­кивания). Затем методом BeginDrag начинается перетаскивание. Поскольку в параметре метода задано значение false, то перетаскивание в действительно­сти начнется только после сдвига мыши на 5 пикселов.

Все остальные обработчики событий не отличаются от указанных в предыду­щем примере.

OnDragQver_____________________________________________________________

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

Класс TControL

Определение

Typedef void (_closure *TDragOverEvent)

(System::TObject* Sender,

System::TObject* Source,

Int X, int Y, TDragState State,

Bool SAccept);

__ property TDragOverEvent OnDragOver

Описание

Событие OnDragOver Начинается в момент, когда перетаскиваемый объект пе­ресек границу данного компонента и оказался внутри его контура. Заканчивается событие, когда объект, покидая компонент, пересек его границу. Обработчик со­бытия OnDragOver Используется для того, чтобы дать сигнал о готовности компо­нента принять перетаскиваемый объект в случае, если пользователь отпустит его над данным компонентом. Если компонент готов принять объект, в обработчике надо задать значение параметра Accept, Равное true. Впрочем, это значение по умолчанию равно true, так что его можно не задавать. Вообще в предельном случае обработчик может быть Пустым, Что будет означать готовность компонента при­нять любой объект. Но даже пустой обработчик нужен, так как иначе сообщения о приеме компонента приложение не получит.

Во время перетаскивания над компонентом объекта, который может быть при­нят, форма курсора мыши может изменяться, сигнализируя пользователю о готов­ности компонента принять объект. Чтобы это было так, надо до момента события OnDragOver (а обычно — во время проектирования) задать соответствующее зна­чение свойства компонента DragCursor.

Параметр Source Определяет перетаскиваемый объект, параметр Sender Сам компонент, параметры X и Y — координаты точки экрана в пикселах. Пара­метр State типа TDragState Определяет состояние перетаскиваемого объекта по отношению к другим объектам. Возможны следующие состояния:

Значение

Описание

DsDragEnter

Курсор мыши входит в пределы компонента.

DsDragMove

Курсор мыши перемещается в пределах компонента.

DsDragLeave

Курсор мыши выходит за пределы компонента.

Пример

См. пример в описании события OnDragDrop,

OnEditError

Событие, наступающее при генерации исключения в процессе редактирования или вставки записи.

Класс TDataSeT Определение

Enum TDataAction ( daFail, daAbort, daRetry }; typedef void fastcall (_closure *TDataSetErrorEvent)

(TDataSet* DataSet, EDatabaseError* E, TDataAction SAction) ;

__ property TDataSetErrorEvent OnEditError

Описание

Событие OnEditError Наступает, если была сделана попытка редактирования или вставки записи и она закончилась неудачей — генерацией исключения. В об­работчике события OnEditError Можно предусмотреть действия, необходимые в этом случае.

Параметр DataSet — редактируемый набор данных. Параметр Е — указатель на объект ошибки, содержащий сообщение сгенерированного исключения. Его свойство E.Message Содержит сообщение об ошибке, а свойство E.HelpContext — номер темы контекстной справки. Пользуясь этими свойствами, можно отобразить пользователю сообщение об ошибке и какие-то рекомендации по его дальнейшим действиям.

Передаваемый по ссылке параметр Action Указывает, как должен реагировать набор данных в ответ на произошедшую ошибку после завершения выполнения данного обработчика события. Параметр Action Может иметь значения:

DaFail

Прерывание операции, приведшей к ошибке, и отображение пользователю сообщения об ошибке

DaAbort

Прерывание операции, приведшей к ошибке, без отображения пользователю сообщения об ошибке

DaRetry

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

При обращении к обработчику значение Action Равно DaFail.

OnEndDrag_____________________________________________________

Событие наступает в момент прерывания или окончания перетаскивания ком­понента.

Класс .TControl

Определение

Typedef void (_______ closure *TEndDragEvent)

(System::TObject* Sender,

System::TObject* Target, int X, int Y);

_ property TEndDragEvent OnEndDrag t;

Описание

Событие OnEndDrag Наступает при любом окончании процесса перетаскива­ния компонента — успешном (компонент перетащен в приемник) или безуспеш­ном (компонент отпущен над формой или компонентом, не способным его при­нять). Событие наступает в перетаскиваемом компоненте.

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

Параметр Sender Это сам объект перетаскивания. Параметр Target Это компонент-приемник, если объект был им принят, или nil, если перетаскивание закончилось неудачей. Параметры X и Y — координаты экрана в пикселах.

Пример

Void_ fastcall TForml::ListBoxlEndDrag(TObject *Sender,

TObject *Target, int X, int Y)

(

If (Target == NULL)

ShowMessageCnepeHeceHMe объекта " +

( (TControl *)Sender)->Name + » прервано");

Else

ShowMessage(((TControl *)Sender)->Name + » перенесен в » +

((TControl *)Target)->Name);

}

В этом примере просто отображается сообщение о результатах перетаскивания типа «Перенесение объекта ListBoxl прервано» или «ListBoxl перенесен в List — Вох2». Но, конечно, аналогичным образом можно предусмотреть любые действия.

OnEnter________________________________________________________

Событие наступает в момент получения элементом фокуса.

Класс TWinControL

Определение

Typedef void (______ closure *TNoti f yEvent) (System: .∙T0bject* Sender);

__ property Classes ; : TNotifyEvent OnEnter

Описание

Событие OnEnter Наступает в момент получения элементом фокуса. Это собы­тие не наступает при переключениях между формами или между приложениями.

При переключениях между элементами, расположенными в разных контейне­рах, например, на разных панелях, событие OnEnter Сначала наступает для кон­тейнера, а потом для содержащегося в нем элемента. Это противоположно последо­вательности событий OnExit. Которые при переключении на компонент другого контейнера наступают сначала для компонента, а потом для контейнера.

Пример

Пусть форма имеет кнопку OK и групповую панель, включающую три радио­кнопки. Пусть в начальный момент активна кнопка ОК. Когда пользователь щелк­нет на одной из радиокнопок, в кнопке ОК наступит событие OnExit. Затем насту­пит событие OnEnter Групповой панели, и только затем наступит событие OnEnter Той кнопки, на которой щелкнули. Если после этого пользователь щелкнет на кнопке ОК, то сначала наступит событие OnExit Радиокнопки, затем событие OnExit Групповой панели, а затем событие OnEnter Кнопки ОК.

OnExit_________________________________________________________

Событие наступает в момент потери элементом фокуса.

Класс TWinCoNtrol

Определение

Typedef void (______ closure *TNotifyEvent) (System::TObject* Sender);

__ property Classes::TNotifyEvent OnExit

Описание

Событие OnExit Наступает в момент потери элементом фокуса, в момент его переключения на другой элемент. Это событие не наступает при переключениях между формами или между приложениями.

Значение свойства ActiveControl Изменяется прежде, чем происходит событие

OnExit.

При переключениях между элементами, расположенными в разных контейне­рах, например, на разных панелях, событие OnExit Сначала наступает для элемента, а потом для содержащего его контейнера. Это противоположно последовательности событий OnEnter, Которые при переключении из другого контейнера на компонент данного контейнера наступают сначала для контейнера, а потом для компонента.

Пример, поясняющий последовательность событий при переключениях фоку­Са, приведен в разделе * OnEnter ».

On Filter Record_________________________________________________

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

Класс TDataSet

Определение

Typedef void_______ fastcall (_____ closure iTFilterRecordEvent)

(TDataSet* DataSet, bool S1Accept) ;

__ property TFilterRecordEvent OnFilterRecord

Описание

Событие OnFilterRecord Наступает каждый раз при перемещении на другую запись, если разрешена фильтрация, т. е. если свойство Filtered установлено в true. Обработчик события OnFilterRecord Может определить, должна ли данная запись быть видимой в приложении. Если должна, то параметр Accept Надо уста­новить в True, Если не должна — в False. Параметр DataSet — набор данных, с ко­торым ведется работа.

Обработчик события OnFilterRecord Позволяет сформулировать сложные ус­ловия фильтрации, основанные на сравнении значений различных полей, которые невозможно занести в компактной форме в свойство Filter. Впрочем, если исполь­зуется и Filter, И обработчик OnFilterRecord, То они действуют совместно и надо следить за тем, чтобы соответствующие условия фильтрации не противоречили друг другу.

Пример

В приведенном ниже обработчике события OnFilterRecord Предполагается, что набор данных Tablel Имеет поле Dep — отдел, в котором работает сотрудник, и поле YearJb — год рождения. Приложение имеет выпадающий список CBDep, В котором пользователь задает отдел, и компоненты TCSpinEdit С именами SEmin и SEmax, В которых пользователь задает минимальный и максимальный год рождения. Под­разумевается, что должны отфильтровываться записи сотрудников, работающих в указанном отделе, год рождения которых лежит в указанных пределах.

Void fastcall TForml:;TablelFilterRecord(

TDataSet *DataSet, boo∣! SAccept)

{

Accept = (TablelDep->Value == CBDep->Text) SS

(TablelYear_b->Value <= SErnax->Value) and (TablelYear_b->Value >= SEmin->Value);

}

Значение Accept Получается равным True, Если запись удовлетворяет постав­ленным условиям фильтрации.

Все это будет работать, если в компоненте Tablel Значение Filtered = True. Кроме того, надо обеспечить, чтобы при смене условий фильтрации (введенных пользователем значений) происходило бы новое событие OnFilterRecord. Этого можно добиться, если в соответствующих местах программы (в частности, в обра­ботчике события OnClick Компонента CBDep) Вставить операторы:

Tablel->Filtered = false; Tablel->Filtered = true;

Они обеспечивают отключение и включение фильтрации. При включении и происходят события OnFilterRecord.

OnGetText______________________________________________________

Событие наступает при обращении к свойствам DisplayText или Text.

Класс TField

Определение

Typedef void______ fastcall (.closure *TFieldGetTextEvent)

(TField* Sender, AnsiStrinQ SText, bool DisplayText);

__ property TFieldGetTextEvent OnGetText

Описание

Обработчик события OnGetText Позволяет изменить форму отображения зна­чения поля Value, т. е. изменить свойства DisplayText NText, которые обычно про­сто соответствуют свойству AsString. При этом можно применить какое-то форма­тирование отображения или вообще изменить отображаемые тексты.

Параметр Sender Представляет собой объект поля TField. В параметр Text Надо занести отображаемую строку текста. Параметр DisplayText Показывает, бу­дет ли строка Text Использоваться только для отображения, или она будет исполь­зоваться для редактирования.

Пример

Следующий пример анализирует значение поля Sex (предполагается, что это булево поле, в котором true соответствует мужскому полу сотрудника, a False — женскому). Обработчик события OnGetText Изменяет отображаемое значение соот­ветственно на ‘м’ и ‘ж’.

Void______ fastcall TForml::TablelSexGetText(TField *Sender,

AnsiString SText, bool DisplayText)

{

If (Sender-SValue) Text = "м" ; else Text = "ж";

1

OnKeyDown____________________________________________________

Событие наступает при нажатии пользователем любой клавиши.

Класс TWinControL

Определение

Enum Classes__ 1 {ssShift, ssAlt, ssCtrl, ssLeft, ssRight,

SsMiddle, SsDoublel;

Typedef Set<Classes 1, ssShift, ssDouble> TShiftState;

Typedef void (_ closure *TKeyEvent) (System::TObject* Sender,

Word &Key, Classes::TShiftState Shift);

_ property TKeyEvent OnKeyDown

Описание

Событие OnKeyDown Наступает, если компонент находится в фокусе, при на­жатии пользователем любой клавиши, включая функциональные и вспомогатель­ные, такие, как Shift, Alt и Ctrl.

В обработчик события передаются, кроме обычного параметра Sender указы­вающего на компонент, в котором произошло событие, также параметры Key И Shift. Параметр Key определяет нажатую клавишу клавиатуры. Для не алфавит­но-цифровых клавиш используется виртуальный код API Windows. Эти коды и способы проверки параметра Key см. во встроенной справке C++Builder или в ис­точниках [2] и [3]. Коды не различают символы в верхнем и нижнем регистрах и не различают символы кириллицы и латинские.

Параметр Shift является множеством, которое может быть пустым или вклю­чать следующие элементы:

Элемент

Значение

SsShift

Нажата клавиша Shift

I SsAlt

Нажата клавиша Alt

SsCtrl

Нажата клавиша Ctrl

Значения элементов Shift, соответствующие нажатиям кнопок мыши, в дан­ном событии не используются.

Примеры

Пусть вы хотите распознать комбинацию клавиш Alt-X. Для этого вы можете написать оператор:

If((Key == ‘X’ ) ss (Shift-Contains(SsAlt)))

Реакцию на нажатие пользователем клавиши Enter можно оформить одним из следующих операторов:

If(Key == 13) … ;

Или

If (Key == OxOD) — . .

ИЛИ

If (Key == VK_RETURN)

OnKeyPress_____________________________________________________

Событие наступает при нажатии пользователем клавиши символа.

Класс -TWinCpntrol

Определение

Typedef void (_closure *TKeyPressEvent)

(System::TObject* Sender, char SKey);

__ property TKeyPressEvent OnKeyPress

Описание

Событие OnKeyPress Наступает, если компонент находится в фокусе, при на­жатии пользователем клавиши символа. Параметр Key в обработчике этого собы­тия имеет тип Char И соответствует символу нажатой клавиши. При этом различа­ются символы в верхнем и нижнем регистрах и символы кириллицы и латинские. Клавиши, не отражаемые в кодах ASCII (функциональные клавиши и такие, как Shift, Alt, Ctrl), не вызывают этого события. Поэтому нажатие таких комбинаций клавиш, как, например, Shift-А, генерирует только одно событие OnKeyPress, При котором параметр Key равен "А". Для того чтобы распознавать клавиши, не соот­ветствующие символам, или комбинации клавиш, надо использовать обработчики событий OnKeyDown и OnKevUp.

Следует отметить, что событие OnKeyPress Заведомо наступает, если нажима­ется только клавиша символа или клавиша символа при нажатой клавише Shift. Если же клавиша символа нажимается одновременно с какой-то из вспомогатель­ных клавиш, то событие OnKeyPress Может не наступить (произойдут только со-

Бытия OnKevDown при нажатии и QnKevUo при отпускании) или, если и насту­пит, то укажет на неверный символ. Например, при нажатой клавише Alt событие OnKeyPress при нажатии символьной клавиши не наступает. А при нажатой кла­више Ctrl событие OnKeyPress При нажатии символьной клавиши наступает, но символ не распознается.

Поскольку параметр Key передается в обработчик как var, его можно изме­нять, передавая для дальнейшей стандартной обработки другой символ, как в при­веденных ниже примерах.

Примеры

1. Пусть вы хотите, чтобы пользователь не мог вводить в окно редактирования

Editl какие-либо символы, кроме цифр. Это можно сделать, написав для Editl следующий обработчик события OnKeyPress:

Set <char, ‘0’, ‘9’> Dig;

Dig « ‘0, << ‘1’ << ‘2’ « ,3′ << ‘4’ << ‘5’

<< ‘ 6 « ‘T « ‘ 8’ « ‘9’;

If ( ! Dig-Contains(Key))

Key = 0;

Этот оператор трансформирует все нецифровые символы в нулевые, и они не будут отражаться в окне редактирования.

2. Приведенный ниже оператор обработчика события OnKeyPress переводит символы в верхний регистр, независимо от того, в каком регистре набрал их пользователь:

Key = UpCase(Key);

Этот оператор действует только на латинские символы. Приведенный ниже аналогичный оператор действует и на латинский символы, и на символы ки­риллицы:

Key = AnsiUpperCase(Key)[1];

OnKeyUp_______________________________________________________

Событие наступает при отпускании пользователем любой клавиши.

Класс TWmControl

Определение

Enum Classes (ssShift, ssAlt, ssCtrl, ssLeft, ssRight,

SsMiddle, ssDouble};

Typedef Set<Classes___ 1, ssShift, ssDouble> TShiftState;

Typedef void fastcall ( closure *TKeyEvent)

(System;;TObject* Sender, Word &Key, Classes;:TShiftState Shift);

_ property TKeyEvent OnKeyUp

Описание

Событие OnKeyUp Наступает, если компонент находится в фокусе, при отпус­кании пользователем любой ранее нажатой клавиши, включая функциональные и вспомогательные, такие, как Shift, Alt и Ctrl.

В обработчик события передаются, кроме обычного параметра Sender, Указы­вающего на компонент, в котором произошло событие, также параметры Key и Shift. Параметр Key определяет клавишу клавиатуры, которая отпускается. Для не алфавитно-цифровых клавиш используются виртуальные коды API Windows. Эти коды и способы проверки параметра Key см. во встроенной справке C++Bu­ilder или в источниках [2] и [3]. Коды не различают символы в верхнем и нижнем регистрах и не различают символы кириллицы и латинские.

Параметр Shift Является множеством, которое может быть пустым или вклю­чать следующие элементы:

Элемент

Значение

I ssShift

Отпускается клавиша Shift

SsAlt

Отпускается клавиша Alt

I SsCtrl

Отпускается клавиша Ctrl

Значения элементов Shift, соответствующих нажатиям кнопок мыши, в дан­ном событии не используются.

Событие OnKeyUp Наиболее удобно, чтобы распознавать нажатые клавиши и кнопки, особенно, комбинации клавиш. Надо только не забывать, что параметр Key имеет тип word. Поэтому для его распознавания надо распознавания надо ис­пользовать виртуальные коды клавиш. К тому же, надо учитывать, что виртуаль­ный код не различает символы в верхнем и нижнем регистре и не реагирует на то, русский или английский язык включен в данный момент.

Примеры

Пусть вы хотите написать обработчик, который бы реагировал на нажатие клавиш Shift-Y. Проверить нажатые клавиши можно оператором:

If((Key == ‘Y’) && (Shift-Contains(SsShift))) … ;

Если же вы напишете оператор If (Key == , Y’ ) …

То он будет реагировать и на и на и даже на русские буквы и ко­

Торые обычно расположены на той же клавише, что и латинская "Y".

OnMouseDown и OnMouseUp______________________________________

События наступают В моменты нажатия и отпускания пользователем клавиши мыши над компонентом.

Класс TControl Определение

Enum TMouseButton { mbLeft, mbRight, mbMiddle };

Enum Classes (ssShift, ssAlt, ssCtrl, ssLeft,

SsRight, ssMiddle, ssDouble};

typedef void ( closure itmouseevent)Typedef Set<Classes 1, ssShift, ssDouble> TShiftState;

(System::TObject* Sender, TMouseButton Button, ClassesMTShiftState Shift, int X, int Y) ;

_ property TMouseEvent OnMouseDown

_ property TMouseEvent OnMouseUp;

Описание

Обработка событий OnMouseDown И OnMouseUp Используется для операций, требуемых при нажатии и отпускании пользователем какой-нибудь кнопки мыши.

Если требуется различная Обработка событий в зависимости от того, какая кнопка мыши нажата или какая нажата вспомогательная клавиша, можно анали­зировать параметры Button И Shift. Значения параметра Button Определяют, ка­кая кнопка мыши нажата: MbLeft — левая, MbRight — правая, MbMiddle — сред-

Няя. Параметр Shift Представляет собой множество, содержащее помимо обозначе­ния нажатой кнопки еще и обозначения нажатых одновременно с этим вспомога­тельных клавиш Shift, Alt, Ctrl (соответствуют элементам множества SsShift, SsAlt, ssCtrl). Параметры X и Y определяют координаты указателя мыши в клиентской области компонента. Параметр Sender — указатель на компонент, в котором про­изошло событие.

Примеры

1.2.Обработчик события OnMouscDown Может использоваться для начала процес­са перетаскивания компонента, если вы решили задать какое-то дополнитель­ное условие (например, проверка каких-то опций), по которому можно начи­нать перетаскивание. В этом случае в компоненте вы задаете свойство Drag­Mode. Равным DmManual, Что обеспечивает управление началом перетаскива­ния. Обработчик события OnMouseDown Может иметь вид:

Void_____ fastcall TForml::ListBoxlMouseDown(TObject *Sender,

TMcuseSutton Button, TShiftState Shift, int X, int Y)

{

If ( (Button == mbLeft) &S

<проверка какого-нибудь условия>)

ListBoxl->BeginDrag (false, 5) ;

I

В приведенной структуре If Первое условие (Button == MbLeft) Можно заме­нить эквивалентным ему условием, проверяющим параметр Shift:

If (Shift. Contains(ssLeft))

Если вы пишете обработчик, описанный выше, но хотите, чтобы перетаскива­ние начиналось только в случае, когда пользователь нажал левую кнопку мыши при нажатой клавише Alt, оператор обработки может иметь вид:

If ( (Button == mbLeft) ss Shift. Contains (ssAlt))

ListBoxl->BeginDrag(false,5);

OnMouseEnter, OnMouseLeave_____________________________________

События наступают в начале и конце прохождения курсора мыши над меткой.

Класс TCustoMLabel

Определения

Typedef void (___________ closure *TNotifyEvent) (System::TObject* Sender);

__ property Classes : :TNotifyEvent OnMouseEnter

__ property Classes::TNotifyEvent OnMouseLeave

Описание

Событие OnMouseEnter Наступает в начале, а событие OnMouseLeave — в кон­це прохождения курсора мыши над меткой. Обработчики этих событий могут ис­пользоваться, например, для изменения шрифта или цвета фона метки при прохо­ждении над ней курсора мыши. Например, следующие обработчики меняют цвет надписи метки на красный при прохождении над ней курсора:

Void___ fastcall TForml::LabellMouseEnter(TObject *Sender)

{

Labell->Font->Color = clRed;

I

Void TForml::LabellMouseLeave(TObject *Sender)

(

Labell->Font->Color = clBlack;

}

OnMouseMove___________________________________________________

Событие наступает при перемещении курсора мыши над компонентом.

Класс TControl Определение

Enum Classes_ 1 (ssShift, ssAlt, ssCtrl, ssLeft,

SsRight, ssMiddle, ssDouble};

Typedef Set<Classes___ 1, ssShift, ssDouble> ShiftState;

Typedef void (_ closure *TMouseMoveEvent)

(System::TObject* Sender, Classes::TShiftState Shift, int X, int Y);

_ property TMouseMoveEvent OnMouseMove

Описание

Обработчик события OnMouseMove Пишется, если надо произвести какие-то операции при перемещении курсора мыши над компонентом.

Параметр Shift, являющийся множеством, содержит элементы, позволяющие определить, какие кнопки мыши и какие вспомогательные клавиши (Shift, Ctrl и Alt) нажаты в этот момент. Параметры X и Y определяют координаты указателя мыши в клиентской области компонента. Параметр Sender (источник события) — сам компонент.

Событие OnMouseMove Возникает независимо от того, нажаты ли какие-то кнопки или клавиши. Правда, хотя это и не документировано в C++Builder, при нажатой левой кнопке мыши это событие, почему-то, не наблюдается.

Пример

If (Shift. Contains (ssAlt) ) …

Этот оператор проверяет, не нажата ли клавиша Alt во время перемещения курсора мыши над компонентом, и, если нажата, то предпринимаются какие-то

Действия.

OnMouseUp______________________________________________________________

См. раздел «OnMouseDown и On MOiiseU р».

OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown_______________

События наступают при вращении колесика мыши.

Класс TControl. до C++Builder 6 — TWinControl

Определения

Enum Classes_____ 1 (ssShift, ssAlt, ssCtrl, ssLeft, ssRight,

SsMiddle, ssDouble};

Typedef Set<Classes________ 1, ssShift, ssDouble> TShiftState;

Typedef void______ fastcall ( closure *TMouseWheelEvent)

(System::TObject* Sender, Classes:: TShiftState Shift, int Wheel Delta, const TvpesM-TPoint SMousePos, bool ^Handled);

__ property TMouseWheelEvent

Typedef void fastcall ( closure *TMouseWheelUpDownEvent)

(SvstemMTObject* Sender, Classes MTShiftState Shift, const Types::TPoint SMousePos, bool SHandled);

_ property TMousewheelUpDownEvent OnMouseWheelDown

Typedef void____ fastcall (_ closure *TMouseWheelUpDownEvent)

(System::TObject* Sender, Classes::TShiftState Shift, const Types::TPoint SMousePos, bool SHandled);

_ property TMouseWheelUpDownEvent OnMouseWheelup

Описание

События OnMouseWheel, OnMouseWheelUp И OnMouseWheelDown Наступа­ют при вращении колесика мыши, если, конечно, у вашей мыши есть колесико. Первым наступает событие OnMoiiseWheel При вращении колесика в любую сто­рону. Параметр Sender Указывает на компонент, в котором произошло событие. Параметр Shift, являющийся множеством, содержит элементы, позволяющие опре­делить, какие кнопки мыши и какие вспомогательные клавиши (Shift, Ctrl и Alt) на­жаты в этот момент. Параметр WheelDdta Показывает, сколько раз повернулось колесико. Это положительное число при вращении вверх и отрицательное — при вращении вниз. Параметр MousePos Типа TPoint Определяет позицию курсора мыши. А передаваемый по ссылке параметр Handled Указывает, завершена ли об­работка события. Если по окончании обработки задать Handled = False, То событие далее будет обрабатываться обработчиком родительского компонента. Во многих оконных компонентах: Memo. RichEdit И других заложена обработка события OnMouseWheel По умолчанию. Учтите, что эти обработчики по умолчанию будут срабатывать только в том случае, если в компоненте заданы полосы прокрутки (собственно, это обработчики не самих элементов, а полос прокрутки).

Поскольку в компонентах имеются собственные обработчики, писать свой об­работчик надо только в тех случаях, когда требуется какая-то нестандартная реак­ция на вращение колесика.

Если обработчик события OnMouseWheel Отсутствует или если в нем задано Handled = False, То в зависимости от направления вращения колесика наступает событие OnMouseWheelUp При вращении вверх, или OnMouseWheelDown При вращении вниз. Параметры обработчиков этих событий те же, что в событии OnMouseWheel. Только отсутствует параметр WheelDelta.

Примеры

Если вы зададите для формы обработчики

Void__ fastcall TForml::FormMouseWheelDown(TObject *Sender,

TShiftState Shift, TPoint SMousePos, bool SHandled)

{

ScaleBy (100,101) ;

}

Void__ fastcall TForml::FormMouseWheelUp(TObject *Sender,

TShiftState Shift, TPoint SMousePos, bool SHandled)

1

ScaleBy(101,100);

}

То при вращении колесика размеры всех компонентов формы будут плавно умень­шаться или увеличиваться. Того же результата можно добиться одним обработчи­ком события OnMouseWheel:

Void__ fastcall TForml::FormMouseWheel(TObject *Sender,

TShiftState Shift, int WheelDelta,

TPoint SMousePos, bool &Handled)

{

ScaleBySlOO + WheelDelta / 100,100),- Handled = true;

1

OnNewRecord___________________________________________________

Событие, наступающее при вставке в набор данных новой записи.

Класс TDataSet

Определение

Typedef void___________ fastcall (______ closure *TDataSetNotifyEvent)

(TDataSet* DataSet) ;

___ property TDataSetNctifyEvent OnNewRecord

Описание

Событие OnNewRecord Наступает при выполнении методов Insert и Append. Осуществляющих вставку новой записи в набор данных DataSet. Обработчик этого события может предусматривать задание начальных значений полей записи или Осуществлять каскадную вставку новых записей в связанные Наборы данных.

OnPaint_________________________________________________________________

Событие наступает при получении сообщения Windows о необходимости пере­рисовать испорченное изображение.

Классы TCustomForm, TPaintBox

Определение

Typedef void ( closure *TNotifyEvent) (System::TObject* Sender);

Property Classes::TNotifyEvent OnPaint

Описание

Событие OnPaint Наступает, когда приходит сообщение Windows о необходи­мости перерисовать испорченное изображение. Изображение может испортиться из-за временного перекрытия данного окна другим окном того же или стороннего приложения. Обработчик данного события должен перерисовать изображение. При перерисовке изображения канвы Canvas Можно использовать свойство Clip — Rect. Которое указывает область канвы, внутри которой изображение испорчено.

Примеры

Если копия изображения, отображаемого на канве, хранится в компоненте BitMap, То обработчик события OnPaint Для формы может иметь вид:

Canvas->Draw(0,0,Bitmap); а для компонента PaintBox

PaintBoxl-Xanvas-Xraw(0,0,Bitmap);

Более быстрая перерисовка получается при использовании свойства ClipRect Канвы, например:

Canvas->CopyRect (Canvas-XlipRect, Bitmap-Xanvas,

Canvas-XlipRect) ;

OnPostError

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

Класс TDataSet

Определение

Enum TDataAction { daFail, daAbort, daRetry ); typedef void fastcall ( closure tTDataSetErrorEvent)

(TDataSet* DataSet, EDatabaseError* E,

TDataAction SAction);

Property TDataSetErrorEvent OnPostError

Описание

Событие OnPostError Наступает, если была сделана попытка переслать мето­дом Post В базу данных или в буфер кэша измененную запись и она закончилась неудачей — генерацией исключения. В обработчике события OnPostError Можно предусмотреть действия, необходимые в этом случае.

Параметр DataSet — набор данных, с которым ведется работа. Параметр Е — указатель на объект ошибки, содержащий сообщение сгенерированного исключе­ния. Его свойство EMessage Содержит сообщение об ошибке, а свойство E.HelpContext — номер темы контекстной справки. Пользуясь этими свойствами, можно отобразить пользователю сообщение об ошибке и какие-то рекомендации по его дальнейшим действиям.

Передаваемый по ссылке параметр Action Указывает, как должен реагировать набор данных в ответ на произошедшую ошибку после завершения выполнения данного обработчика события. Параметр Action Может иметь значения:

DaFail

Прерывание операции, приведшей к ошибке, и отображение пользователю сообщения об ошибке

DaAbort

Прерывание операции, приведшей к ошибке, без отображения пользователю сообщения об ошибке

DaRetry

_____

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

При обращении к обработчику значение Action равно DaFail.

OnProgress_____________________________________________________

События происходят при медленных процессах изменения графического изо­бражения и позволяют построить индикатор хода процесса.

Класс TGraphic Определение

Enum TProgressStage {psStarting, psRunning, psEnding};

Typedef void (_______ closure *TProgressEvent) (System::TObject* Sender,

TProgressStage Stage,

Byte PercentDone, bool RedrawNow, const Windows : : TRect &R, const AnsiString Msg) ;

__ property TProgressEvent OnProgress

Описание

События OnProgress Наступают во время медленных процессов изменения гра­фического изображения таких, как загрузка, сохранение, трансформация. Эти со­бытия позволяют построить в приложении индикатор хода процесса, обеспечиваю­щий обратную связь С пользователем. Разработчики новых компонентов могут ге­нерировать события OnProgress, Вызывая защищенный метод Progress.

Параметр Stage указывает стадию процесса: начало, продолжение, окончание. Он может соответственно принимать значения PsStarting, PsRunning И PsEnding. Если приложение предусматривает индикацию процесса, то можно создавать инди­катор при Stage = PsStarting, Изменять его показания, пока Stage = PsRunning

И закрывать при Stage = psEnding. Параметр PercentDone Показывает, какая при­мерно часть процесса выполнена. Этот параметр может использоваться в индикато­ре процесса.

Параметр RetirawNow Указывает, может ли изображение в данный момент быть успешно отображено на экране. Параметр R указывает область изображения, которая изменена и нуждается в перерисовке.

Параметр Msg содержит краткую справку о протекающем процессе. Напри­Мер, "Loading", "Storing" или "Reducing colors". Строка Msg может быть и пустой.

OnReconcileError, OnUpdateError — события TCustomClientDataSet

Наступают при необходимости принятия решение относительно записи, вы­звавшей ошибку при обновлении базы данных.

Класс TCustomClienTDataSeT

Объявления

Enum TUpdateKind {ukModify, uklnsert, ukDelete}; enum TReconcileAction {raSkip, raAbort, гаМегде,

RaCorrect, raCancel, raRefresh}; typedef void fastcall (_closure *TReconcileErrorEvent)

(TCustomClientDataSet* DataSet, EReconcileError* E, DbiiTUpdateKind UpdateKind, TReconcileAction SAction) ;

__ property TReconcileErrorEvent OnReconcileError

__ property TResolverErrorEvent OnUpdateError

Описание

События OnUpdateError Возникают во внутреннем провайдере, а события OnReconcileError Генерируются методом Reconcile, который, в свою очередь, вы­зывается методом ApplyUpdates. Заносящим изменения в базу данных. Суть этих событий одна и та же. Если обнаруживаются записи, вызывающие ошибки при за­несении их в базу данных, то для каждой такой записи генерируется соответствую­щее событие. Различие между OnUpdateError и OnReconcileError Заключается в том, что события OnUpdateError Возникают в процессе обновления базы данных, а события OnReconcileError — после. Так что события OnReconcileError Возника­ют только для тех записей, для которых в обработчике OnUpdateError (если он во­обще задан) конфликт не разрешился.

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

Параметр DataSet — это тот клиентский набор данных, записи которого вы­звали ошибку. Если ошибка произошла во вспомогательном наборе данных, то DataSet Указывает этот набор, хотя событие генерируется для головного набора данных. При обработке события можно использовать для разрешения конфликта такие свойства набора данных DataSet, как свойства полей NewValue. OldValue, CurValue. Однако в обработчике событий нельзя изменять текущую запись Data­Set, применяя методы навигации (Next. Prior и т. п.).

Параметр Е является указателем на объект типа EReconcileError. Он содер­жит информацию, которую можно использовать при обработке ошибки. Основные свойства объекта типа EReconcileError:

Код ошибки, возвращаемый BDE, ADO, db Express или иными технологиями:

__ property Word ErrorCode

Код предыдущей ошибки в процессе их обработки (если ошибки не было — 0):

__ property Word PreviousError

Дополнительная информация (может быть NULL): property AnsiString Context

Параметр UpdateKind указывает тип операции, вызвавшей ошибку: UkMo­Dify — изменение записи, Uklnsert — вставка, UkDelete — удаление.

В параметр Action Надо занести результат обработки ошибки:

RaSkip

Пропустить обработку данной записи, т. е. оставить ее в списке не­завершенных исправлений

RaAbort

Прервать все операции обработки ошибок

RaMerge

Объединить изменяемую запись с записями сервера (фактически, добавить данную запись как новую)

RaCorrect

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

Ошибку)

RaCancel

Отменить все исправления данной записи, вернувшись к первона­чальным значениям всех ее полей

I RaRefresh

Отменить все исправления данной записи и заменить запись той, которая хранится на сервере

В обработчике события OnReconcileError Надо предоставить пользователю всю доступную информацию о возникшей проблеме и дать возможность принять решение. Например, пользователь может изменить значение NewValue соответст­вующего поля набора DataSet (то значение, которое вызвало ошибку) и задать Action = RaCorrect. В этом случае будет сделана попытка занести в базу данных ис­правленный вариант записи. Пользователь может выбрать Action = RaRefresh, Т. е. отказаться от сделанных исправлений и согласиться на ту запись, которая нахо­дится в данный момент в базе данных. Он может также выбрать Action = RaCancel, Т. е. отказаться от сделанных исправлений и принять те значения полей, которые были перед началом редактирования. Наконец, пользователь может отказаться временно от принятия решения (Action = RaSkip Или RaAbort) И продолжить рабо­ту по редактированию записей.

Примеры

Void______ fastcall TForml::ClientDatasetlReconcileError(

TcustomClientDataSet *DataSet, EReconcileError *E, TUpdateKind UpdateKind, TReconcileAction SAction)

Ниже приведен пример фрагмента обработчика события OnReconcileError, В котором пользователю сообщается информация о возникшей проблеме. Инфор­мация заносится в окно Memol.

{

Memol->Clear();

Memol->Lines->Add ("Код ошибки: " + IntToStr (E->ErrorCode) )

Memol->Lines->Add("Прежний код: " +

IntToStr(E->PreviousError)) Memol->Lines->Add("Сообщение: " + E->Message); if (E->Context!= "")

Memol->Lines->Add(E->Conte×t) ;

{
case ukmodify: s += "изменение записи"
break;
case uklnsert: s += "вставка";

AnsiString S = "Операция: switch (UpdateKind)

Break;

Case UkDelete: S += "удаление" ;

)

Memol-SLines-SAdd(S) ;

If (UpdateKind == ukModify)

I < i + + )

{

TField *F= DataSet-SFields-SFieldsli]; if ( (F-SFieldKind!= fkData) Il

VarlsEmpty(F-S-NewValue) ) continue,

Memol-SLines-SAdd("") ;

Memol-SLines-SAdd("Поле " + F->FieldName); Memol-SLines-SAdd("Прежнее значение: ,’ +

VarToStr(F->01dValue)); Memol-SLines-SAdd("Записываемое значение " +

VarToStr(F->NewValue)); if (! VarlsEmpty(F-SCurValue))

Memol-SLines-SAdd("Значение в БД: " +

VarToStr(F-SCurValue));

Первые операторы приведенного кода заносят в Mcmol Коды ошибок, текст сообщения об ошибке и характер проводимой операции. Отметим, что типичные сообщения об ошибках желательно перевести на русский язык (в коде это не дела­ется). Затем, в случае, если выполнялась операция модификации записи, органи­зуется цикл по всем полям записи. Для тех полей, которые содержат измененные данные (тип поля FkData — данные, имеется значение NewValue) Дается информа­ция обо всех значениях этого поля.

Далее в обработчике должна быть предусмотрена возможность выбора пользо­вателем дальнейших действий, как указано в описании события OnReconcileError.

В обработчике события OnReconcileError Может быть успешно использован диалог Reconcile Error Dialog, содержащийся в Депозитарии на странице Dialogs. Он предоставляет пользователю подробную информацию о возникшей проблеме и дает полную возможность принять решение. Желательно только русифициро­вать его. Для этого достаточно перевести надписи меток на форме и определить следующим образом глобальные переменные:

Char *ActionStr [ ] ("Пропустить", "Прервать", "Объединить",

"Исправить", "Отменить", "Обновить"};

Char *UpdateKindStr [} = ("Изменение", "Вставка", "Удаление’1} char *SCaption = "Ошибка

ISUnchanged = "<Не изменено",- char iSBinary = "(двоичное)"; char iSFieldName = "Имя поля"- char *SOriginal = "Начальное значение"; char *SConflict = "Конфликтное значение",- char *SValue = "Значение";

Char *SNoData = "<Heτ JjaHHtixS"; char iSNew = "Новое";

Если используется этот диалог, обработчик события OnReconcileError состоит всего из одного оператора:

Action = HandleReconcileErrortthis, DataSet, UpdateKind, Е);

Определение

Typedef void_______ fastcall ( closure *TFieldSetTextEvent)

(TField* Sender, const AnsiStrinq Text);

__ property TFieldSetTextEvent OnSetText

Описание

Обработчик события OnSetText Позволяет отреагировать на изменение свойст­ва Text — строки, используемой для ввода пользователем данных в режиме редак­тирования. Событие OnSetText Генерируется после редактирования пользовате­лем значения поля перед присвоением нового значения свойству Value. Параметр обработчика Text Отображает в текстовом виде новое введенное пользователем зна­чение поля. Это значение можно проверить и, если оно допустимо, то передать его в соответственно отформатированном виде в значение Value. Если такого присваи­Вания Value Не сделано, то введенное значение поля не перепишется в Value.

OnStartDrag_____________ ‘__________________ __________________

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

Компонента.

Класс TControL

Определение

Typedef void (_closure *TStartDragEvent)

( System::TObject* Sender, TDragObject* SDragObject);

__ property TStartDragEvent OnStartDrag

Описание

Событие OnStartDrag Наступает, когда пользователь нажал левую кнопку мыши над объектом и, не отпуская ее, начал смещать курсор мыши, т. е. начал пе­ретаскивание.

Обработчик события OnStartDrag Позволяет описать какие-то специальные действия, необходимые при начале перетаскивания. Параметр Sender Является тем компонентом, который должен перетаскиваться или который содержит объект будущего перетаскивания.

Переменная DragObject По умолчанию равняется NULL. Это означает, что пе­реноситься будет сам компонент или его объект. При этом автоматически создает­ся объект типа TDragControlObject, с которым C++Builder осуществляет весь про­цесс Но обработчик может создавать и новый объект перетаскива­

Ния, в котором определен какой-нибудь особый вид курсора и т. п.

OnUpdateError — событие TBDEDataSet___________________________

Событие, наступающее при генерации исключения в процессе пересылки в базу Кэшированных Изменений.

Класс TBDEDataSet Определение

Enum TUpdateKind (ukModify, UkInsert, UkDelete);

Enum TUpdateAction {uaFail, uaAbort, uaSkip, uaRetry, uaApplied); typedef void fastcall ( closure *TUpdateRecordEvent)

(Db::TDataSet * DataSet, Db:-.TUpdateKind UpdateKind, TUpdateAction SUpdateAction);

.property TUpdateRecordEvent OnUpdateError

Описание

Событие OnUpdateError Наступает, если была сделана попытка переслать в базу кэшированные изменения и она закончилась неудачей — генерацией ис­ключения. Поскольку начало кэширования и пересылка изменений в базе данных разнесены во времени, то может оказаться, что другое приложение уже успело из­менить записи, которые были кэшированы. В этом случае Borland Database Engine (BDE) осуществляет соответствующие проверки, и если они не привели к удовле­творительному результату, то генерируется исключение и наступает событие OnUpdateError. В обработчике этого события можно предусмотреть необходимые действия.

Параметр DataSet — набор данных, с которым ведется работа. Параметр Е — указатель на объект ошибки, содержащий сообщение сгенерированного исключе­ния. Его свойство E.Message Содержит сообщение об ошибке. Пользуясь им, мож­но отобразить пользователю сообщение об ошибке и какие-то рекомендации по его

Дальнейшим действиям.

Значение параметра UpdateKind Указывает, случилась ли ошибка во время вставки (значение uklnsert), удаления (значение ukDelete) или модификации

(значение UkModify) Записи.

Передаваемый по ссылке параметр UpdateAction указывает, как должен реа­гировать набор данных в ответ на произошедшую ошибку после завершения вы­полнения данного обработчика события. Параметр UpdateAction Может иметь зна­чения:

■ uaAbort

Прерывание операции, приведшей к ошибке, без отображения поль­зователю сообщения об ошибке

UaFail

I

Прерывание операции, приведшей к ошибке, и отображение пользо­вателю сообщения об ошибке

DaRetry

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

UaSkip

Пропуск пересылки текущей записи и оставление ее в кэше

При обращении к обработчику значение UpdateAction Равно DaFail.

Обработчик события может использовать свойства TField:: OldValue и TFiEld::NewValue, Чтобы изменить условия сравнения и задать новое значение TFi — Eld::NewVaIue. В этом случае надо повторить попытку пересылки, задав Update — Action равным Ua Retry.

Следует отметить, что если исключение сгенерировано методом ApplyUpdates И не перехвачено в блоке try…catch, то пользователю будет предъявлено окно с со­общением об ошибке. Если в этом случае обработчик события OnUpdateError Оста­вил неизменным и равным UaFail Значение UpdateAction, То окно с сообщением об ошибке будет отображаться дважды. Чтобы предотвратить это, надо установить UpdateAction Равным UaAbort.

Обработчик события OnUpdateError Не должен вызывать методов навигации, Перемещающих курсор на другую запись.

OnUpdateError — событие TCustomClientDataSet____________________

Класс TBDEDataSet

Определение

Enum TUpdateKind (ukModify, UkInsert, UkDelete);

Епшп TUpdateAction {uaFail, uaAbort, uaSkip, uaRetry, uaApplied); typedef void fastcall ( closure tTUpdateRecordEvent)

(Db: : TDataSet * DataSet, Dbr—TUpdateKind UpdateKind, TUpdateAction SUpdateAction);

_ property TUpdateRecordEvent OnUpdateRecord

Описание

Событие OnUpdateRecord Наступает при пересылке в базу кэшированной за­писи методом ApplyUpdates. Обработчик этого события можно использовать, на­пример, когда пересылка данной записи сопряжена с каскадом операций по встав­ке, удалению или модификации других записей. В обработчике события OnUpDateRecord Можно также предусмотреть какой-то дополнительный контроль дан­ных.

Параметр DataSet — набор данных, с которым ведется работа. Значение пара­метра UpdateKind Указывает, случилась ли ошибка вр время вставки (значение uklnsert), удаления (значение UkDelete) Или модификации (значение UkModify) Записи.

Передаваемый по ссылке параметр UpdateAction Указывает, какие действия должны выполняться после окончания выполнения обработчика события. Пара­метр UpdateAction Может иметь значения:

UaAbort

Прерывание операции без отображения пользователю сообще­ния об ошибке

UaApplied

Завершение пересылки и удаление текущей записи из кэша

UaFail

Прерывание операции и отображение пользователю сообщения об ошибке

UaSkip Пропуск пересылки текущей записи и оставление ее в кэше

При обращении к обработчику значение UpdateAction Равно DaFail. Если в обработчике не обнаружено препятствий к завершению пересылки, значение UpdateAction Следует задать равным UaApplied.

Обработчик события OnUpdateRecord Не должен вызывать методов навига­ции, перемещающих курсор на другую запись.

Альтернативой написания обработчика события OnUpdateRecord Является использование для обработки пересылки клиентского набора данных и объекта Типа TUpdateSQL. Это может обеспечить лучшее управление пересылкой.

OnValidate______________________________________________________

Событие наступает перед занесением данных в буфер записи.

Класс TField Определение

Typedef void_______ fastcall (_______ closure tTFieldNotifyEvent)

(TField* Sender) ;

__ property TFieldNotifyEvent OnValidate

Описание

При занесении значения поля Value В буфер текущей записи последовательно выполняются следующие операции:

1. Вызывается обработчик события OnValidate, Позволяющий проверить допус­тимость записываемых данных

2. Если обработчик Oti Validate Не отказался от записи данных, то данные запи­

Сываются в буфер записи

3. Если при записи данных не сгенерировано исключение, вызывается обработ­чик события OnChange

Обработчик события OnValidate Позволяет проверить данные перед их запи­сью в буфер. Если в результате проверки данные оказываются недопустимыми, в обработчике следует сгенерировать исключение, например, вызвать функцию Abort. Проверка в обработчике OnValidate Может быть более полной, чем прово­димая при вводе нового значения проверка отдельных символов с помощью EditMask. А если значение поля меняется программно, то проверка с помощью EditMask Вообще отсутствует.

Дополнительные источники информации о C++Builder 6

Ниже приведены сведения о некоторых книгах и иных информационных ма­териалах автора по C++Builder. Оперативную информацию о готовящихся к вы­пуску и вышедших книгах вы можете найти на сайте автора Http://Delci.Hl.Ru И сайте издательства Www.BinomPress.Ru.

1. Архангельский А. Я. Программирование в C++Builder 6 — М: ЗАО «Издатель­ство БИНОМ», 2002

Книга содержит методические и, частично, справочные материалы по C++Bu­ilder 6 и предшествующим версиям C++Builder 5 и 4. Рассмотрены такие возмож­ности C++Builder, как построение кросс-платформенных приложений, технологии доступа к данным ADO, InterBase Express, dbExpress, компоненты — серверы СОМ, технологии распределенных приложений COM, CORBA, MIDAS, новая мето­дика диспетчеризации действий. Дается методика построения прикладных про­грамм, реализующих текстовые и графические редакторы, мультипликацию и мультимедиа, работу с базами данных, создание отчетов, приложений для Ин­тернет, распределенных приложений, клиентов и серверов.

Справочная часть книги содержит некоторые материалы по языку, функци­ям, типам и классам C++Builder, но, конечно, в значительно меньшем объеме, чем книга [2]. Приводятся там и некоторые справочные данные по классам, компонен­там, их свойствам, методам, событиям. Но это материал несоизмерим по объему сведений с данной книгой. Зато, там дается методика построения приложений са­мого разного назначения, рассказывается о техники связи с базами данных, о по­строении распределенных приложений и т. п. Конечно, та и данная книги частично перекликаются. Но, мне кажется, что они в значительной степени дополняют друг друга. А объединить их в одну и совсем избежать повторов невозможно: подобная книга содержала бы около двух тысяч страниц. Ее технически невозможно издать, и пользоваться ею тоже было бы невозможно — уж очень она была бы увесистой.

2. Архангельский А. Я. Справочное пособие по C++Builder 6. Книга 1. Язык

C++ — М: ЗАО «Издательство БИНОМ», 2002

В книге даются исчерпывающие справочные сведения по языку C++ в С++Ви — ɪIder 6: синтаксис языка, все операции и операторы, все типы данных. Подробно рассматривается работа с исключениями, с текстовыми и двоичными файлами, со строками разных типов, массивами, множествами, структурами, классами. Обсу­ждается обработка и генерация сообщений Windows. Рассматривается около 650 функций С, C++, API Windows, из них более 300 с подробными описаниями и при­мерами.

Рассматривается стандартная библиотека шаблонов STL: все типы контейне­ров, итераторов, все алгоритмы и функции-объекты.

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

3. Серия справочных файлов «Русские справки по C++Builder 6»

Серия справок — это программный продукт, призванный оказать вам под­держку в процессе проектирования. Справки встраиваются в среду C++Builder ко­мандой Help | Customize в дополнение к англоязычной справке и в процессе проекти­рования при нажатии клавиши F1 вам предлагаются на выбор темы английских или русских справок. Русские справки — это не перевод с английского, а, скорее,

Расширенный электронный вариант материалов данной книги и книг [1] и [2]. Так что они могут быть полезны не только тем, кто испытывает определенные сложно­сти с английским, но и всем пользователям C++Builder, поскольку содержат иначе построенное и скомпонованное изложение справочных данных, иные примеры, в них устранен ряд ошибок англоязычных справок (надеюсь, не добавлено собст­венных ошибок).

В настоящее время серия включает в себя четыре справки: по C++ в С++Ви — ilder, по компонентам и классам C++Builder, по графикам и диаграммам TeeChart, по стандартной библиотеке STL C++. Число входов предметного указателя справок около 3000, а число страниц текста в несколько раз превышает объем данной книги. Намечен также выпуск дополнительных справок по Интернет, по методике проек­тирования, по развернутым и прокомментированным примерам и ряд других.

Достоинство справок по сравнению с книгами в том, что они обеспечивают оперативную помощь в среде разработки C++Builder, облегчают поиск нужной ин­формации (в книгах это делать значительно сложнее), позволяют легко переносить примеры в свой проект. Да и стоят справки намного дешевле, чем книги. Но, ко­нечно, справки не заменяют книг, хотя и содержат много материала, не поместив­шегося в книги.

Справки распространяются через Интернет по адресу: Http://Labl8.Ipu.Rssi.Ru/ Help2/. ‘ ” найдете условия распространения, включающие бесплатную под­держку — каждые 3-4 месяца выходят дополнения к справкам, которые распро­страняются бесплатно тем, кто приобрел начальную версию.

Распространение справок через Интернет не означает, что вы обязательно должны иметь доступ в Интернет с домашнего компьютера и иметь собственный адрес e-mail. Достаточно, если доступ в Интернет и e-mail есть у вас на работе или у кого-то из ваших друзей и знакомых. Вы можете воспользоваться этими возмож­ностями, а затем на дискетах перенести файлы на свой компьютер.

4. Архангельский А. Я. Решение типовых задач в C++Builder 6. — М: ЗАО

«Издательство БИНОМ», 2003

Эта книга будет готова не раньше следующего года (в этом году, надеюсь, вый­дет аналогичная книга по Delphi 6). Она рассчитана на подготовленных читателей, ознакомившихся с C++Builder, например, по перечисленным выше книгам. В ней рассматриваются вопросы, совершенно не затронутые в предыдущих книгах, или только упомянутые в них: решение типовых вычислительных задач (решение сис­тем линейных и нелинейных уравнений, операции с матрицами, векторами и т. п.), ориентированное на особенности C++Builder 6; графики и диаграммы в C++Builder 6; разработка распределенных приложений; множество задач, свя­занных с работой в Интернет и интранет и многое другое. Значительная часть кни­ги посвящена рассмотрению множества частных задач, с которыми приходится сталкиваться при разработке приложений и по которым задается множество во­просов на различных форумах в Интернет. Книга содержит немало примеров при­кладных программ, многие из которых могут рассматриваться как законченные программные продукты. Так что вы просто можете использовать их в своей теку­щей работе. В книге содержатся указания по доработке этих приложений для ва­ших целей, так что вы можете на их основе создавать свои собственные программ­ные средства.

Определяет координаты прямоугольной области.

Заголовочный файл TypesJipp Определение

Struct TRect {

TRectO {)

TRect (const

TRectfint 1

TRect(RECTS {

Left = top =

Right = bottom =

1

Int Width () const { return right — left; ) int HeightO const { return bottom — top } bool operator ==(const TRects rc) const

[†] {

Return left == re. left SS top==rc. top SS

Right == rc. right SS bottom==rc. bottom;

)

Bool operator! = (const TRectS rc) const { return! (rc==*this); }

_ property LONG Left = ( read=left, Write=Ieft )

_ property LONG Top = read=top, write=top };

InsertRecord_________________________________________________________________________

Вставляют новую запись в набор данных и заполняет ее поля.

Класс TDataSet Объявление

Void_ fastcall InserfcRecordlconst System:-.TVarRec * Values,

Const int Values_Size);

Описание

Метод InsertRecord Вставляет в набор данных новую запись, заполняет ее поля значениями, перечисленными в параметре Values И Пересылает в базу дан­ных. Новая запись делается активной. В массиве Values Заносимые значения пере­числяются в той последовательности, в которой расположены поля таблицы. На месте значений тех полей, в которые данные не заносятся, пишется NULL. После записи последнего ненулевого значения список Values Можно прервать, т. е. не указывать в нем NULL Для остальных не заполняемых полей.

Метод InsertRecord Не удается применить, если какое-то поле, предшествую­щее последнему вводимому значению, является немодифицируемым, например, автоматически нарастающим (AutoIncrement). Поскольку в такое поле невозмож­но ввести значение, а оно должно присутствовать в массиве Values, То при приме­нении InsertRecord Будет генерироваться исключение,

Место размещения новой записи в базе данных определяется следующими правилами:

[§] Для индексированных таблиц Paradox и dBASE запись вставляется в пози­цию, соответствующую индексу

• Для неиндексированных таблиц Paradox запись вставляется в текущую пози­цию курсора

• Для неиндексированных таблиц dBASE, FoxPro и Access запись вставляется в конец набора данных

• Для баз данных SQL место расположения новой записи зависит от реализации базы данных. Для индексированных таблиц индекс обновляется с учетом но­вой записи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *