Методические указания. 1. Многострочные окна редактирования Memo (страница Standart) и RichEdit (страница Win32)
1. Многострочные окна редактирования Memo (страница Standart) и RichEdit (страница Win32)
КомпонентыMemo и RichEditявляются окнами редактирования многострочного текста. В компонентеMemo формат (шрифт, его атрибуты, выравнивание) одинаков для всего текста и определяется свойствомFont,а компонентRichEdit работает с текстом в обогащенном формате RTF. В остальном эти компоненты похожи.
Основные свойства:
¨ Font –шрифт текста
¨ Lines - текст окна в виде списка строк и имеющее тип TStrings.
¨ ScrollBars- определяет наличие полос прокрутки текста в окне.
ú SsNone – отсутствие(по умолчанию).Пользователь может перемещаться по тексту только с помощью курсора.
ú ssHorizontal - горизонтальная полоса прокрутки.
ú ssVertical - вертикальной полоса прокрутки
ú ssBoth– обе полосы прокрутки
Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойстваLines в окне Инспектора Объектов. При этом откроется окно редактирования списков строк. Можно редактировать или вводить текст в этом окне или нажать кнопку <CodeEditor> и работать в обычном окне Редактора Кода. В этом случае, завершив работу с текстом, нужно выбрать из контекстного меню, всплывающего при щелчке правой кнопкой мыши, команду Close Page и ответить утвердительно на вопрос о сохранении текста в свойстве.
Во время выполнения приложения можно изменять текст в окно редактирования с помощью методов свойстваLines.
(Memo1->Lines-> )
¨ Add(“Новая строка”)-добавление в конец текста строки «Новая строка».Возвращает номер новой строки.
¨ Append (“Новая строка”) -добавление в конец текста строки «Новая строка». Не возвращает значение.
¨ Delete (N) –удалить строку с номером N.
¨ Insert (N, “Строка”)–добавляет строку в позицию N
¨ Exchange (N1, N2) –меняет местами строки с номерами N1 и N2.
¨ Move (N1, N2) –перемещает строку с номером N1 в позицию N2.
¨ LoadFromFile (FileName) –загрузить список из текстового файла с именем FileName
LoadFromStream (Stream) -загрузить список из потока Stream
¨ SaveToFile (FileName) -сохранить список в текстовом файле с именем FileName
SaveToStream (Stream) -сохранить список в потоке Stream
¨ Clear ( ) -очистки текста в окне. Этот метод можно применять не только к свойству Lines, но и к самому окну Memo.
Memo1->Lines->Clear() или Memo1->Clear()
2. Создание меню с помощью мастера
С помощью мастера можно создать приложение с типовой конфигурацией главного меню. Чтобы запустить мастер необходимо:
Þ вызвать команду «New…» из главного меню «File»
Þ в появившемся окне «New Items» перейти на страницу «Projects»
Þ выбрать «Application Wizard».
После нажатия OK мастер начнет свою работу.
Процесс создания меню мастер проводит в несколько шагов, запрашивая у пользователя необходимые сведения.
1 шагНа первом шаге мастер предлагает выбрать разделы, которые будут содержаться в главном меню.
2 шагНа втором шаге, если был выбран раздел «File», есть возможность отредактировать расширения файлов, которые будут использоваться в диалогах открытия и записи файла. Для добавления новой записи нужно нажать на кнопку «Add» и в открывшееся окно ввести описание (Description) и расширение(я) (Extension(s)), например, «Файлы программ» и «.com»; «.exe»
3 шагНа третьем шаге с помощью кнопок «Remove», «Insert» и «Space» можно создать панель инструментов.
4 шагНа четвертом шаге необходимо задать имя (в верхнем поле) и каталог (в нижнем поле) приложения и, по желанию, включить следующие опции:
Þ Create MDI Application – создать многооконное приложение;
Þ Create a status line – создать строку состояния;
Þ Enable Hints – включить всплывающие подсказки.
После этого в выбранном каталоге будет создано новое приложение с заданным именем, включающее в себя созданное по ответам пользователя главное меню.
3. Компоненты MainMenu и РоpupMenu (панель Standart)
В C++Builder имеется два компонента, представляющие меню:MainMenu – главное меню и РоpupMenu –всплывающее меню. Эти компоненты имеют много общего.
Меню - невизуальные компоненты, т.е. место размещения их на форме в процессе проектирования не имеет значения для пользователя, так как он их не увидит, а увидит только меню, сгенерированные ими.
Компоненты меню необходимо связать с компонентами, к которым они относятся. Главное меню всегда связано с самой формой. Связь формы с главным меню MainMenu осуществляется через специальное свойство формы – Menu, в котором указывается ссылка на главное меню. Эта связь возникает автоматически при добавлении на форму MainMenu.
Связь компонента со всплывающим меню также осуществляется через специальное свойство, присущее почти всем компонентам – PopupMenu.Эта связь автоматически не возникает. Для ее установления в свойстве PopupMenu некоторого компонента необходимо самостоятельно указать ссылку на всплывающее меню, которое будет связано с данным компонентом, а свойство всплывающего меню AutoPopдолжнобыло установлено в true. Тогда при при нажатии на компоненте правой кнопки мыши в процессе выполнения приложения будет появляться всплывающее меню. Такое всплывающее меню называется контекстным.
4. Проектирование меню с помощью Конструктора Меню
Основное свойство компонентов меню —Items.Редактирование меню, т.е. заполнение свойства Items, осуществляется в Конструкторе Меню.Его вызов производится двойным щелчком на компонентеили нажатием кнопки с многоточием рядом со свойствомItems в окне Инспектора Объектов. В результате откроется окно, вид которого представлен на рис.1, в котором можно спроектировать все меню.
ü Создание раздела.Для создания нового раздела необходимо поместить курсор в рамку из точек, обозначающую место расположения раздела (см. рис.1) и задать в Инспекторе Объектов его свойство Caption,которое обозначает надпись раздела. Если в свойство Caption ввести символ «-», то будет создана разделительная черта.
Каждый раздел меню, т.е. каждый элемент свойства Items, является объектом типа TMenuItem, обладающий своими свойствами, методами, событиями.
СвойствоName задает имя объекта, соответствующего разделу меню. Во избежание путаницы рекомендуется задавать объектам осмысленные имена.
ü Вставка нового раздела. Для вставки нового раздела необходимо выбрать раздел, выше или левее которого требуется сделать вставку и нажать клавишу «Ins» или вызвать команду «Insert» из контекстного меню (появляется при щелчке на окне правой кнопкой мыши, см. рис.1).
ü Перемещение раздела.Чтобы переместить раздел в другое место меню необходимо отбуксировать его туда мышью.
ü Создание подменю. Для создания подменю необходимо выбрать раздел, для которого требуется создать подменю, и нажать «Ctrl+®» или вызвать команду «Create Submenu» из контекстного меню.
ü Удаление раздела. Чтобы удалить раздел необходимо выделить его и нажать «Del» или вызвать команду «Delete» из контекстного меню.
ü Вставка раздела из шаблона. Для вставки раздела из шаблона необходимо вызвать команду «Insert From Template» из контекстного меню и выбрать нужный шаблон. Элементы шаблона создадут подменю выбранного элемента или новый раздел в главном меню. Пользователю предоставляется возможность контролировать наполнение списка шаблонов: удалять ненужные – команда «Delete Templates», сохранять созданные – «Save As Template» из контекстного меню.
ü Вставка раздела из другого меню.Эта операция часто используется для редактирования всплывающего меню, т.к. обычно его разделы повторяют некоторые из главного меню. Для вставки раздела из другого меню необходимо сначала перейти в это меню. Это можно сделать, вызвав команду «Select Menu» из контекстного меню. Затем выделить нужные разделы (несколько разделов можно выделить, удерживая Shift или Ctrl), скопировать разделы в буфер, нажав «Ctrl-C». Потом с помощью пункта «Select Menu» вернуться обратно и вставить разделы из буфера, нажав «Ctrl-V».
ü Задание «горячих клавиш» и клавиш быстрого доступа к разделу.
СвойствоShortCut определяет «горячие» клавиши, с помощью которых пользователь, даже не заходя в меню, может в любой момент вызвать выполнение процедуры, связанной с данным разделом. Чтобы определить «горячие» клавиши, надо открыть выпадающий список свойстваShortCut в окне Инспектора Объектов и выбрать из него нужную комбинацию клавиш. Эта комбинация появится в строке раздела меню.
Клавиши быстрого доступа задаются в свойстве Caption. Если некоторой букве надписи (например «S») предшествует символ «&», то обращение к соответствующей команде можно выполнять нажатием «Alt-S».
ü Задание раздела по умолчанию. Свойство Default определяет, является ли данный раздел разделом по умолчанию своего подменю, т.е. разделом, выполняемым при двойном щелчке пользователя на родительском разделе.
ü Задание изображения для раздела. В C++Builder-4 и выше предусмотрена возможность ввода в разделы меню изображений. Для этого служит свойство Bitmap.Выбор изображения производится подобно выбору изображения для свойства Glyph компонента BitBtn (см. лаб.раб.№1): при нажатии кнопки с многоточием в строке этого свойства открывается окно, нажав кнопку Load в котором можно перейти в обычное окно открытия файла рисунка. Выбрав изображение необходимо нажать OK.
5. Организация отклика на вызов пункта меню
Основное событие раздела —OnClick, возникающее при щелчке пользователя на разделе или при нажатии «горячих» клавиш. В обработчик этого события можно перейти, используя вкладку Events Инспектора Объектов в процессе конструирования меню или щелкнув мышью по разделу меню на форме (обратите внимание – на форме, а не в Конструкторе Меню).
6. Диалоги как модальные формы
Диалоговое окно представляет собой отдельно проектируемую форму. Каждая форма представлена в программе отдельным модулем с заголовочным файлом. Для возможности вызова диалога из основной формы необходимо подключить заголовочный модуль диалога в модуль основной формы с помощью директивы препроцессора include.
v Например, если главная форма определяется модулем «Main.cpp», а диалоговая – «MyDialog.cpp», то необходимо в файл «Main.cpp» добавить строку:
#include “MyDialog.h”
Диалоговая форма должна появляться и закрываться во время выполнения программы. Поэтому при проектировании целесообразно задавать свойство Visible – видимость – диалоговой формы false, а в программе предусмотреть изменение формы в видимую в ответ на какие-либо действия пользователя, например, при выборе им пункта меню. Форму можно сделать видимой методами Show ( ) и ShowModal ( ), например,
Form2->Show()
Метод ShowModal( ) открывает форму как модальную. Открытие форм как модальных используется в большинстве диалоговых окон. Модальная форма приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь не закроет эту форму. Модальная форма также не позволяет пользователю переключить фокус курсором мыши на другие формы данного приложения, пока форма не будет закрыта. Так что пользователь должен выполнить предложенные ему действия прежде, чем продолжить работу. Модальной может быть сделана любая форма, если она делается видимой методом ShowModal. Если та же самая форма делается видимой методом Show( ), то она не будет модальной.
Поведение модальной формы определяется ее основным свойством ModalResult. Это свойство доступно только во время выполнения приложения. При открытии формы методом ShowModal сначала свойство ModalResult=mrNone=0. Как только при обработке каких-то событий на форме свойству ModalResult будет присвоено положительное значение от 1=mrOK до 8=mrAll, модальная форма закроется.
Если на модальной форме размещена кнопка, то при ее нажатии происходит присваивание свойству ModalResult формы значения свойства ModalResult кнопки. Значение свойства ModalResult кнопки можно задать в процессе проектирования программы, выбрав его из выпадающего списка свойств в Инспекторе Объектов. Значение свойства ModalResult формы можно будет прочитать после ее закрытия.
v Пример:
{……
Form2->ShowModal();
if (Form2->ModalResult = = mrCancel)
Edit1->Text = ”В окне Form2 была нажата кнопка Отмена”
……}
Таким образом, программа, вызвавшая модальную форму, может узнать, что сделал пользователь, работая с этой формой, например, по какой он кнопке щелкнул.
7. Создание диалогового окна с помощью шаблона
Диалоговое окно можно создавать вручную, т.е. создать новую форму, используя команду «New Form» из главного меню «File», разместить на ней необходимые компоненты, определить действия, обработчики событий и т.д., а можно воспользоваться заготовками диалогов из шаблона. Шаблон позволяет вставить в приложение заготовку нового диалогового окна, на котором уже размещены типовые кнопки, чаще всего встречающиеся в диалогах, такие как OK, Cancel, Help; и для которого уже заданы некоторые свойства.
Чтобы вставить в приложение диалог из шаблона необходимо:
Þ вызвать команду «New…» из главного меню «File»
Þ в появившемся окне «New Items» перейти на страницу «Dialogs»
Þ выбрать нужный шаблон, например, StandardDialog или запустить мастер DialogWizard, который, запрашивая пользователя, за несколько шагов конструирует новое диалоговое окно.
При добавлении диалога в приложение будет вставлен новый модуль, представляющий диалоговую форму. Его следует сохранить в папке с приложением, задав какое-либо имя.
В процессе проектирования часто бывает, что главная форма скрывает за собой диалоговую. Чтобы выбрать скрытую форму можно использовать комбинацию клавиш «Shift+F12».
8. Вызов диалогового окна пунктом меню
Для вызова диалогового окна пунктом меню необходимо в обработчике события OnClickпункта меню делать диалоговое окно видимым. Как отмечалось, чаще всего для диалоговых окон используют метод ShowModal ( ), который позволяет открыть форму как модальную.
v Пример:
Используя шаблон, добавим в приложение диалоговое окно OKRightDlg. Для вызова диалога пунктом меню CallDlg обработчик события OnClick должен иметь следующий вид:
void __fastcall TForm1::CallDlgClick(TObject *Sender)
{ OKRightDlg->ShowModal(); // открытие формы OKRightDlg как модальной
……… // обработка результата закрытия диалоговой формы
}
9. Прием введенных значений из диалогового окна в основное окно приложения
Обмен данными между окнами можно осуществлять через глобальные переменные. Описать глобальную переменную нужно в заголовочном модуле диалога, имеющим расширение «.h»(быстро открыть заголовочный модуль можно нажав <Ctrl>+F6), а определить – в основном модуле диалога, имеющим расширение «.cpp».
v Пример:
Для рассмотренного в пункте 6 примера для описания глобальной переменной строка типа AnsiString нужно:
1. в файл «MyDialog.h» дописать:
extern AnsiString stroka;
2. в файл «MyDialog.cpp» -
AnsiString stroka;
Пусть на основной форме имеется компонент Memo1, в который должна добавляться строка из окна редактирования Edit1 диалога. Сначала эта строка должна записываться в глобальную переменную stroka.Это должно происходить при нажатии кнопки ОК на диалоге. Обработчик события OnClick для этой кнопки должен выглядеть следующим образом:
void __fastcall TOKRightDlg::OKBtnClick(TObject *Sender)
{ stroka = Edit1->Text; }
При нажатии кнопки ОК на диалоге его свойство ModalResult станет равным свойству ModalResult кнопки, а так как это свойство для кнопки отлично от нуля (от mrNone), а именно равно mrOK=1, то диалоговое окно закроется, но его свойство ModalResult останется доступным.
Проверяя это свойство в обработчике OnClick пункта меню можно узнать, какую кнопку нажал пользователь. Если он нажал ОК, то необходимо в Memo1 добавить строку stroka.Обработчик события OnClick для раздела меню CallDlg должен выглядеть следующим образом:
void __fastcall TForm1::CallDlgClick(TObject *Sender)
{ OKRightDlg->ShowModal();
if (OKRightDlg->ModalResult==mrOk) Memo1->Lines->Add(stroka);
}
v Пример программы «Анкета»:
Будем запрашивать у пользователя данные о ФИО и дате рождения и заносить их в общую таблицу.
Поместим на форму MyForm компоненты
Þ Memo1
Þ MainMenu1
С помощью конструктора добавим в меню пункт <Добавить строку>. Для этого
o Щелкнем 2 раза на компоненте MainMenu1
o Заполним свойсто Caption первого раздела: &Добавить строку
Создадим диалоговую форму для ввода данных. File ® New Form. Поместим на нее компоненты:
Þ Label1 – Caption = Фамилия
Þ Edit1
Þ Label2 – Caption = Имя
Þ Edit2
Þ Label3 – Caption = Отчество
Þ Edit3
Þ Label4 – Caption = Дата рождения
Þ DateTimePicker1
Þ Button1 – Caption = Ввод, ModalResult = MrOk
Þ Button1 – Caption = Отмена, ModalResult = MrCancel
Определим глобальную переменную для передачи данных из диалоговой форму в главную.
В файле Unit2.h (для вызова Ctrl+F6) напишем
struct TNewMen
{ AnsiString Fam, Name, Otch;
TDateTime Date;
};
extern TNewMen NewMen;
extern AnsiString Str;
В файле Unit2.cpp:
TNewMen NewMen;
extern AnsiString Str;
Для связи форм в файле Unit1.cpp:
#include “Unit2.h”;
Для записи данных в переменную в обработчике события OnClick для Button1 напишем
NewMen.Fam=Edit1->Text;
NewMen.Name=Edit2->Text;
NewMen.Otch=Edit3->Text;
NewMen.Date=DateTimePicker1->Date;
Str = NewMen.Fam+' '+NewMen.Name+' '+NewMen.Otch+' '+
NewMen.Date.FormatString("ddddd");
Для вызова диалоговой формы при нажатии пункта меню и принятия из нее данных в обработчике этого события (щелкнуть на пункте меню) напишем:
Form2->ShowModal();
if (Form2->ModalResult==mrOk) Memo1->Lines->Add(Str);
Создадим в текущем каталоге файл “Anketa.txt” (Файл®Создать®Текстовый документ) и добавим операторы для считывания данных из файла при начале работы и записи в файл при завершении.
void __fastcall TForm1::FormCreate(TObject *Sender)
{ Memo1->Lines->LoadFromFile("Anketa.txt");}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{ Memo1->Lines->SaveToFile("Anketa.txt"); }