Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C++Builder. Учебный курс

.pdf
Скачиваний:
14
Добавлен:
15.11.2022
Размер:
9.54 Mб
Скачать

- Свойству 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. Как работает обработчик пункта меню Файл - >Выход?