
C++Builder. Учебный курс
.pdf- Свойству C h eck ed подпункта меню С трока со сто ян и я
присвойте значение t r u e .
-Создайте самостоятельно обработчик для подпункта меню
Стр о к а с о с т о я н и я .
-С оздайте обработчик события OnChange для компонента Memo:
v o i d __ f a s t c a l l T F o rm l: :MemoChange(TObject *Sender)
{
S ta tu s B a r - > S im p le T e x t = "И зменен";
}
-Доработайте программу, чтобы она правильно отражала в компоненте S t a tu s B a r состояние файла.
3.7. Поддержка подпунктов меню С п р а в к а
- С помощью команды меню F ile-> N ew -> F orm
C + + B u ild e r создайте новую форму и назовите ее FormAbout.
-Свойству B o r d e r S ty le |
формы |
присвойте |
значение |
|
b s D ia lo g |
(это значение задается для диалоговых окон приложе |
|||
ния). |
|
|
|
|
-Д л я |
свойства P o s i t i o n |
выберите |
из списка |
значение |
p o M a in F o rm C e n te r.
-Расположите другие компоненты, чтобы форма приняла вид, представленный на рис. 3.5. Для размещения рисунка исполь зуйте компонент ТIm age. Рисунок в примере загружен из папки
C :\P ro g r a m F ile s\C o m m o n F ile s \C o d e G e a r S h a r e d \ I m a g e s \ S p l a s h \ 1 6 C o l o r .
-Сохраните проект и сохраните файл модуля под именем
A b o u t (Ваш проект дополнился тремя файлами A b o u t. h, A b o u t . ср р , A b o u t. d f m).

В |
результате |
выполнения |
этой |
команды |
модуль |
F o rm M ain . с р р дополнится командой препроцессора:
#include "About.h"
-С нова запустите программу и проверьте ее работоспособ ность.
Теперь наше приложение состоит из двух форм. Главной формой приложения является созданная первой форма Form l. По умолчанию при запуске приложения обе формы создаются автома тически, и главная форма будет показана на экране. Однако отме тим, что создание формы, в том числе и не отображенной на экра не, отбирает у операционной системы некоторые ресурсы. Может быть, это несущественно для небольшого приложения, но в общем случае рекомендуется формы, обращение к которым происходит редко, создавать динамически и уничтожать после использования. Для этого следует вызвать диалоговую панель опций проекта (пункт меню O p t i o n s / P r o j e c t ) и перенести FormAbout в
список A v a i l a b l e Form s (рис. 3.6).
- Напишите обработчик для пункта меню О программе:
void __fastcall TForml::НеIpAboutClick (TObject
♦Sender)
{
Application->CreateForm (__classid(TFormAbout),
^FormAbout);
FormAbout->ShowModal();
FormAbout->Free() ;
}
Первый оператор этого обработчика событий создает экземп ляр формы Form A bout. Второй оператор отображает его как мо дальную диалоговую панель (диалог, который не позволит обра титься к другим формам приложения, если его не закрыть).

3.8.1. Реализация пункта меню Фгшл- >Выход
-Введите следующий код для обработчика пункта меню
Ф ай л -> В ы х о д :
void __fastcall T F o rm l: : F i l e E x i t C l i c k (TO bject *S e n d e r)
{
C l o s e ( ) ;
}
- Запустите приложение. Внесите какие-либо изменения в до кумент, после этого закончите работу приложения, выбрав пункт меню Файл->Выход. Происходит выход из приложения без со хранения документа.
- Измените код обработчика:
void __fastcall T F o rm l:: F i l e E x i t C l i c k (TObj e c t ♦ S en d er)
{
if (M emo->M odified)
{
int |
r e s u l t |
= |
A p p lic a tio n -> M e ssa g e B o x ( |
|
"Сохранить изм енения в докум енте?", |
||||
"Текстовы й |
р е д а к т о р " , |
MB_YESNOCANCEL | |
||
MB_ICONWARNING) ; |
|
|||
if |
( r e s u l t |
== |
IDYES) |
F ile S a v e C lic k (S en d e r) ; |
if |
( r e s u l t |
== |
IDCANCEL) return; |
}
C l o s e ( ) ;
}
-С нова запустите приложение. Внесите какие-либо измене ния в документ, после этого закончите работу приложения, выбрав пункт меню Файл - >Выход. В этом случае появляется диалоговое окно с предложением сохранить изменения в документе.
- Закончите работу приложения, нажав кнопку Закрыть главного окна. Происходит выход из приложения без сохранения документа.
- Для правильного завершения работы приложения изменит^ код обработчика пункта меню Файл - >Выход:
void __fastcall T F o rm l: : F i l e E x i t C l i c k ( T O b j e c t * S en d er)
{
C lo se ( ) ;
}
- Напишите обработчик события O nC lose для формы:
void __fastcall T F o rm l: : F o rm C lo s e (T O b je c t * S e n d e r, T C lo s e A c tio n ^ A c tio n )
{
if (M emo->M odified)
{
int r e s u l t |
= A p p lic a tio n - > M e s s a g e B o x ( |
|
"Сохранить |
изм енения |
в д о к у м е н т е ? ", |
"Текстовый |
р е д а к т о р " , |
MB_YESNOCANCEL | |
MB_IC0NWARNING); switch ( r e s u l t )
{
case IDYES:
F i l e S a v e C li c k ( S e n d e r ) A c ti o n = c a F r e e ;
break; case IDNO:
A c ti o n = c a F r e e ; break;
case IDCANCEL:
A c ti o n = caN one; break;
}
}
}
Событие O n C lo se возникает при закрытии приложения. Об ратите внимание, что обработчику передается дополнительный параметр A c tio n . Если A c tio n принимает значение c a F r e e , приложение закончит работу, если caN one, то отмена завершения.
- Запустите программу и проверьте правильность ее работы.
3.8.2. Управление доступом к командам
Управление доступом к командам - это разрешение или за прещение доступа к кнопкам или пунктам меню в зависимости от состояния программы. Например, если в текстовом редакторе не выделен текст, то доступ к пунктам меню В ы резать, Копиро в а т ь и У дали ть должен быть заблокирован. Точно так же, если в буфере обмена не содержится какого-либо текста, команду В ста в и т ь следует заблокировать.
Чтобы разрешить доступ к пункту меню, нужно установить для свойства E n a b le d значение tr u e . Чтобы запретить доступ к
компоненту, необходимо изменить значение свойства E n a b le d на
f a l s e . Само по себе разрешение или запрещение доступа к ком поненту является простой операцией. Основная работа состоит в том, чтобы создать код, который будет определять, когда и как за прещать или разрешать доступ.
Доработаем приложение, добавив управление доступом для пунктов меню В ы р езать, К опировать, В стави ть и Удалить.
Эти пункты меню должны быть доступны только в том случае, если в компоненте Memo выделен текст. Что касается вставки, то нужно сделать так, чтобы доступ к пункту меню был разрешен только при наличии текста в буфере обмена. Сложность в этом случае заключается в том, что текст в буфер обмена может быть скопирован любым другим приложением.
Команды В ы р езать, К опировать и У далить должны быть доступны после выделения текста. Если вы посмотрите справоч
ные файлы |
VCL, то обнаружите, что ТМешо имеет свойство |
S e lL e n g th , |
которое содержит длину выделенного текста в ком |
поненте ТМето. Вся сложность заключается в том, что нет никако
го способа узнать, |
когда пользователь выделил текст. События |
O n T e x tS e le c te d |
не существует, так что в этом случае мы не |
сможем воспользоваться уведомляющими событиями.
В этом случае лучше всего воспользоваться событием On I d l e . Когда ваше приложение заканчивает обработку всех на
копившихся сообщений, Windows посылает ему сообщение WM_ENTERIDLE. Когда приложение C++Builder получает сообще
ние WM_ENTERIDLE, оно инициирует событие O n ld le |
объекта |
|
A p p l i c a t io n . |
Вы можете написать обработчик |
события |
O n ld le , который можно связать с событием O n ld le |
объекта |
|
A p p l i c a t io n . |
Этот обработчик будет вызываться каждый раз, |
когда происходит событие O n ld le .
Теперь перейдем к пункту меню Вставить. В VCL существует
класс с именем T C lip b o a r d , |
который инкапсулирует операции с |
буфером обмена. Одним из |
методов T C lip b o a r d является |
H asF o rm at. Этот метод проверяет, находятся ли в данный мо мент в буфере обмена данные определенного формата. Если это так, то функция H a sF o rm a t возвращает t r u e . Используя этот метод, можно определить, содержится ли текст в буфере обмена:
if (Clipboard()->HasFormat(CF^TEXT)) EditPaste->Enabled = true;
Если в буфере обмена находится текст, то мы разрешаем дос туп к пункту меню В с т а в и т ь .
Таким образом, для управления доступом к кнопкам и пунк там меню выполните следующие действия:
- Добавьте в заголовочный файл команду препроцессора:
#include cClipbrd.hpp> |
|
-Добавьте в раздел p r i v a t e определения |
класса T F orm l |
объявление метода: |
|
void __fastcall Onldle(TObject* Sender, |
bool& Done); |
- В обработчик события O n C re a te формы добавьте сле дующую строку:
Application->OnIdle = &OnIdle;
-Напишите обработчик события O n ld le . Этот метод будет вызываться каждый раз, когда приложение входит в состояние ожидания. В этом методе также поддерживается управление дос тупом к командам С о х р ан и ть и С о х р ан и ть к ак .
void __fastcall T F o rm l::0 n ld le ( T O b je c t* Sender, boolfc Done)
{
/ / ------------------------------------------------------------------------------------
/ / |
|
Код у п равлен ия |
к |
командам "Вырезать", |
||
/ / |
"К опировать" и |
"Удалить" |
|
|
||
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
b o o l |
t e x t S e l e c t e d |
= |
M emo->SelLength > |
0; |
||
E d itC u t - > E n a b le d = |
t e x t S e l e c t e d ; |
|
||||
E d itC o p y - > E n a b le d |
= |
t e x t S e l e c t e d ; |
|
|||
E d i t D e l e t e - > E n a b l e d = t e x t S e l e c t e d ; |
|
|||||
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
/ / |
Код у п равлен ия |
к |
команде |
"Вставить", |
||
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
b o o l |
cb H asT ex t = C lip b o a r d () - >HasFormat (CF_TEXT) ; |
|||||
E d i t P a s t e - > E n a b l e d |
= cbH asT ext; |
|
||||
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
/ / |
Код уп р авл ен ия |
к |
команде |
"Выделить |
все", |
|
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
b o o l |
h a s T e x t = M emo->Lines->Count > 0; |
|
||||
E d i t S e l e c t A l l - > E n a b l e d = h a s T e x t; |
|
|||||
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
/ / |
Код уп р авл ен ия |
к |
команде |
"Отмена", |
|
|
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
b o o l |
m o d i f i e d = Memo->Modified; |
|
||||
E d itU n d o - > E n a b le d |
= |
m o d if ie d ; |
|
|||
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
/ / |
Код у п равлен ия |
к |
командам |
"Сохранить" и |
||
/ / |
"Сохранить как" |
|
|
|
|
|
/ / |
------------------------------------------------------------------------------------ |
|
|
|
|
|
F ile S a v e - > E n a b le d |
= |
m o d if ie d |
&& h a sT e x t; |
|||
F ile S a v e A s - > E n a b le d |
= h a s T e x t; |
|
}
- Запустите приложение и проверьте правильность его работы.
Вопросы для самоконтроля
1. Назначение свойства A lig n компонентов и его возможные
значения.
2.Как создать пункты меню программы?
3.Как вставить или удалить пункт меню?
4.Как определить клавишу быстрого выбора для пункта меню?
5.Как добавить разделительную черту в меню?
6.Как назначить горячие клавиши пункту меню?
7.Как создать обработчик пункта меню?
8.Назначение метода M essag eB o x объекта A p p l i c a t i o n .
9.Перечислите свойства и методы компонента ТМешо, встре тившиеся в программе.
10.Перечислите свойства и методы компонента L in e s , встретившиеся в программе.
11.Свойства и методы компонента TOpenDialog.
12.Свойства и методы компонента TSaveDialog.
13.Вывод диалогового окна. Виды диалоговых окон.
14.Перечислите события компонента TForm . Когда возника ют эти события?
15.Назначение компонента T S a tu sB a r.
16. Почему при размещении на форме компонента T S a tu s B a r он занимает нижнюю часть формы?
17.Управление доступом к кнопкам и пунктам меню.
18.В чем заключается сложность управления доступом к кнопкам и подпунктам меню П р а в к а ?
19.Как работает обработчик пункта меню Файл - >Новый?
20.Как работает обработчик пункта меню Файл - >Открыть?
21. Как работает обработчик пункта меню Ф а й л - С о х р а
н и т ь ?
22. Как работает обработчик пункта меню Ф а й л - С о х р а
н и т ь к а к ?
23. Как работает обработчик пункта меню Файл - >Выход?