Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Стандартные диалоги и их фрагменты
Windows располагает целым набором стандартных диалогов, которые могут использоваться любым приложением. В распоряжение программиста среда предоставляет компоненты, соответствующие этим диалогам; найти их можно на вкладке Dialogs. Эти компоненты относятся к невизуальным. Применить в приложении стандартное диалоговое окно можно так: поместите в форму компонент, соответствующий диалоговому окну. На форме появится только значок объекта, содержащего свойства диалога. Само окно будет создано только при работе программы в момент вызова диалога с помощью метода Execute(). На вкладке Dialogs всего восемь компонентов: шесть из них модальные, а два – FindDialog и ReplaceDialog – нет. Метод Execute() для этих диалогов создает окно и сразу же возвращает управление программе. Окно продолжает существовать, пока его не закроет пользователь. При необходимости произвести поиск или замену в тексте, вызываются обработчики событий данных компонентов. Для обеспечения возможности использования в приложении стандартных диалогов Windows открытия и сохранения файлов нужно поместить в форму компоненты OpenDialog и SaveDialog (страница Dialogs палитры компонентов). Основными свойствами классов TOpenDialog и TSaveDialog являются: Filter - список названий и масок шаблонов для выводимого списка файлов текущего каталога, например: Все файлы (*.*)|*.*), Options - параметры настройки стандартного диалога: 1) ofHideReadOnly – скрыть выключатель «только чтение», 2) ofOverwritePrompt – выдать запрос на подтверждение попытки перезаписать существующий файл, 3) ofPathMustExist и ofFileMustExist – выдать сообщение об ошибке при попытке ввести имя несуществующего каталога или файла, 4) ofNoReadOnlyReturn – выдать сообщение об ошибке при попытке сохранить файл на защищенном от записи устройстве, 5) и др. FileName - строка с полным именем выбранного пользователем файла (перед отображением диалога значение этого свойства используется для инициализации текстового редактора с именем файла). Для модального выполнения стандартного диалога в классе TCommonDialog предназначен метод bool Execute(); /* возвращает значение true, если пользователь ввел имя файла, и false, если он отказался от ввода */ Метода нужно поместить в обработчике события onclick соответствующей команды меню (например, «Открыть» или «Сохранить как»). Глобальная функция AnsiString ExtractFileName(AnsiString); может использоваться для выделения собственно имени файла и его расширения из полного имени файла (например, для отображения его в заголовке формы). Пример использования:
Пример использования: Пример использования: Основной метод, которым производится обращение к любому диалогу, — Execute. Эта функция открывает диалоговое окно и, если пользователь произвел в нем какой-то выбор, то функция возвращает true. При этом в свойствах компонента-диалога запоминается выбор пользователя, который можно прочитать и использовать в дальнейших операциях. Если же пользователь в диалоге нажал кнопку Отмена или клавишу Esc, то функция Execute возвращает false. Задание 1 Создадим простейшую программу, позволяющую просматривать файлы изображений. 1. Разместите компонент Image1 на форме Form1 так чтобы его размеры были примерно равны размерам формы. Для открытия файлов изображений понадобится компонент OpenPictureDialog (Окно для выбора графического файла), который находится во вкладке Dialogs (Окна общего диалога). 2. Для стартовой формы Form1 его свойству WindowState (Статус окна) установите значение wsMaximized (Максимальное). Свойству AutoSize (Авторазмер) компонента Image1 установите значение true. Теперь размеры компонента Image1 будут автоматически выравниваться в соответствии с размерами просматриваемого изображения. 3. В заголовок стартовой формы поместите надпись «Просмотр картинок». Напишите функцию обработки Image1Click: //вызов окна диалога ОТКРЫТИЕ ГРАФИЧЕСКИХ ФАЙЛОВ OpenPictureDialog1-> Execute(); //поместить в поле Image1 загруженный с диска файл Image1-> Picture-> LoadFromFile(OpenPictureDialog1-> FileName); 4. Вторая инструкция записана в двух строках. Эта инструкция в поле компонента Image1 с помощью его свойства Picture (Изображение) размещает графический файл, загруженный с диска посредством функции LoadFromFile (Загрузить файл по указанному пути), которая в круглых скобках должна содержать путь и имя файла. В нашем случае путь загружаемого файла и его имя передаются из окна диалога «Открытие графических файлов» посредством свойства FileName (Путь и имя файла). 5. Запустите приложение на выполнение и проверьте его пригодность для просмотра изображений. 6. Построенное приложение не позволяет просматривать очень распространенные графические файлы форматов JPG и JPEG. Графические файлы указанных форматов являются многократно сжатыми, а потому часто используются при хранении большого количества графической информации. Также формат JPG применяется для сжатия растровых изображений получаемых в матрице цифровой фотокамеры. Такое преобразование происходит непосредственно в фотокамере для экономии ее памяти. Чтобы избавить приложение от этого недостатка, нужно в заголовочной части файла Unit1.cpp записать директиву #include < jpeg.hpp>, которая обеспечит возможность работы в вашем приложении с графическими файлами форматов JPG и JPEG. 7. Просматриваемое изображение располагается в верхнем левом углу формы. Для автоматической центровки изображения на форме в эту же функцию обработки Image1Click нужно дописать две инструкции: //перемещение изображения в центр формы Image1-> Left=Form1-> ClientWidth/2-Image1-> Width/2; Image1-> Top=Form1-> ClientHeight/2-Image1-> Height/2; Обратите внимание на то, что эта добавка в программном коде обязательно должна располагаться ниже уже написанных ранее инструкций, так как сначала надо поместить изображение в поле компонента Image, а уж за тем сместить его в нужное место на форме. А вот свойства формы ClientWidth (Полезная ширина) и ClientHeight (Полезная высота) определяют площадь поверхности окна для размещения в нем других компонентов. Первая инструкция вычисляет координату левого края компонента Image так, что из половины ширины формы вычитается половина ширины компонента Image. Таким образом, осуществляется центровка изображения по горизонтали. Аналогично работает вторая инструкция, выполняя центровку изображения по вертикали. 8. В заголовок формы поместите путь и имя загружаемого файла изображения, добавив строку: //в заголовок формы поместить информацию о пути и имени файла Form1-> Caption = OpenPictureDialog1-> FileName; 9. Настройте окно общего диалога «Выбор графического файла» по вашему усмотрению, воспользовавшись его набором свойств. Например, свойству Title (Название) компонента OpenPictureDialog1 можно установить значение «Выбери картинку». Поэкспериментируйте с другими свойствами этого компонента, в том числе с его составными свойствами. Задание 2 Создать приложение — простой текстовый редактор, способный открывать существующий текстовый файл, создавать новый файл, сохранять файл. 1. Создайте новое приложение. 2. Переименуйте форму в MyNotepad. 3. Сделайте так, чтобы строка заголовка формы содержала надпись MyNotepad v1.0. 4. Сохраните приложение в личном каталоге под именем MyNotepad. Имя файла формы программы задайте Notepad.cpp. В процессе работы над приложением периодически сохраняйте результаты при помощи команды File/Save All. 5. В последующем (при создании приложений) может потребоваться разделитель (—), линия, отделяющая одни элементы приложения от других. Создадим, для примера, горизонтальный разделитель. Поместите в форму компонент Bevel, задайте его высоту равной 2 и сделайте так, чтобы он располагался по верхней границе формы на всю ее ширину. 6. В приложения кнопки обычно находятся на панелях. Поэтому создадим панель с требуемыми нам кнопками " New ", " Open ", " Save ". Поместите в форму компонент Panel из палитры компонентов. Переименуйте ее в ToolBar. 7. Сделайте высоту панели равной 32. Свойство BevelOuter установите в bvNone. Обратите внимание на изменения, происшедшие с панелью. 8. Сотрите значение свойства Caption. 9. Измените свойство Align на alTop. Обратите внимание на взаимное расположение панели и разделителя. 10. В качестве кнопок используем компонент SpeedButton, специально предназначенный для установки в панель. Поместите компонент SpeedButton в панель (не в форму! ). Не беспокойтесь о точном положении кнопки, выравнивание осуществим позднее. 11. Переименуйте кнопку в FileOpenBtn. 12. Установите свойство Left кнопки равным 5. 13. С помощью палитры выравнивания отцентрируйте кнопку в панели по вертикали. 14. На кнопку, реализованную через компонент SpeedButton (или через BitBtn ) может быть помещен графический объект — значок, характеризующий функцию кнопки. Дважды щелкните в колонке Value напротив свойства Glyph компонента SpeedButton. Откроется окно редактора изображений. При помощи соответствующих кнопок перейдите вкаталог …\Builder\Borland Shares\Images\Buttons и выберите файл Fileopen.bmp ( указать точный путь невозможно, так как он различен для разных версий Borland С++ Builder ). Если все действия были выполнены правильно, на кнопке появится графическое изображение. 15. Аналогичным образом добавьте в панель кнопки FileSaveBtn и FileNewBtn. Разместите их " без зазора" по горизонтали. 16. На все кнопки создайте короткие всплывающие подсказки, аналогичные тем которые используются в Windows. 17. Добавьте в форму компонент Memo. Данный компонент предназначен для отображения текстовой информации, а также для ее набора. Информация определяется свойством Lines компонента. 18. Добейтесь того, чтобы компонент Memo занимал все оставшееся поле формы. 19. Дважды щелкните в колонке Value инспектора объектов напротив свойства Lines. В открывшемся окне удалите надпись Memo1. 20. Разрешите использование в компоненте Memo линеек прокрутки ( ScrollBar ). 21. Добавьте в форму, место не имеет значения, компоненты OpenDialog и SaveDialog. У данных компонентов настройте фильтр на работу с текстовыми (*.txt) и всеми файлами (*.*). 22. Форма должна иметь вид такой же как показано на рисунке.
23. Ниже приведен листинг программы, реализующей создание нового файла, считывание и сохранение файла. Найдите функции — обработчики события щелчка по соответствующей кнопке панели Вашего приложения. Реализуйте эти функции у себя. TMyNotepad *MyNotepad; // __fastcall TMyNotepad:: TMyNotepad(TComponent*Owner) : TForm(Owner) { } // void __fastcall TmyNotepad:: FileOpenBtnClick(TObject*Sender) { if (OpenDialog1 − > Execute()) { if (Memo1 − > Modified) { int res=Application − > MessageBox(" The current file has changed. Save changes? ", " MyNotepad Message", MB_YESNOCANCEL | MB_ICONWARNING); if (res == IDYES) FileSaveBtnClick(Sender); if (res == IDCANCEL) return; } Memo1 − > Lines − > LoadFromFile(OpenDialog1 − > FileName); } } void __fastcall TMyNotepad:: FileNewBtnClick(TObject*Sender) { if (Memo1 − > Modified) { int res=Application − > MessageBox(" The current file has changed. Save changes? ", " MyNotepad Message", MB_YESNOCANCEL | MB_ICONWARNING); if (res == IDYES) FileSaveBtnClick(Sender); if (res == IDCANCEL) return; } if (Memo1 − > Lines − > Count > 0) Memo1 − > Clear(); SaveDialog1 − > FileName = " "; } // _____________________________________________________________________ void __fastcall TmyNotepad:: FileSaveBtnClick(TObject *Sender) { if (SaveDialog1 − > FileName! = " " ) { Memo1 − > Lines − > SaveToFile(SaveDialog1 − > FileName); Memo1 − > Modified = false; } Else { SaveDialog1 − > Title=" Save As"; if (SaveDialog1 − > Execute()) { Memo1 − > Lines − > SaveToFile(SaveDialog1 − > FileName); Memo1 − > Modified=false; } } } Задание 3 Задача: формировать список автовладельцев (фамилия; номер, марка, цвет автомобиля и код региона), редактировать данные, осуществлять поиск, вводить и выводить списки в файлы. Такую программу Вам предстоит сейчас написать. Вид главного окна показан на рис.1. Оно содержит следующие компоненты: Edit – для ввода фамилии; два компонента MaskEdit – для ввода по шаблону номера и кода, два комбинированных списка ComboBox для выбора марки цвета и Memo - многострочный редактор. Рис. 1 Вид приложения 1. Установите заголовок формы Владельцы автомобилей, рамку окна сделайте тонкой (свойство BorderStyle значение bsSingle), чтобы окно не могло изменять свои размеры. 2. Создайте главное меню; пусть оно содержит пункты: Файл (с подпунктами Открыть, Сохранить, Выход), Опции (с единственным пунктом Настройки…). 3. Вставьте пять компонент Label, задав соответствующий текст в свойстве Caption. 4. Используйте Edit для ввода фамилии. Для Edit определите максимальную длину строки MaxLenght=15, шрифт Times New Roman|Полужирный|12, а для автоматической подстройки размеров объекта установите AutoSize=true. 5. Вставьте компонент MaskEdit с MaxLenght=6 для ввода номера автомобиля по шаблону и MaskEdit с MaxLenght=2 для задания кода региона. 6. Задайте шаблон для ввода номера: в поле MaskEdit введите строку L999LL; 1; X[25]; а для кода региона - 99; 1; X. 7. Для выбора марки и цвета автомобиля добавьте два компонента ComboBox. Для ComboBox1 щелчком на свойстве Items откройте диалоговое окно и введите список марок автомобилей. Аналогичное окно для ComboBox2 заполните строками с названиями цвета. 8. Добавьте в форму редактор с именем Memo1 (компонент Memo) для формирования списка. Обеспечьте вертикальную и горизонтальную прокрутку. 9. Вставьте кнопку для добавления информации в список. 10. Отделите меню от остальных объектов, вставив компонент Bevel. Привяжите его к верхнему краю рабочей области окна (Align = alTop), если необходимо, измените размеры. и поэкспериментируйте со свойствами Shape и Style. Для полноценной обработки информации Ваша программа должна уметь извлекать введенный в поля текст; работать с выделенными фрагментами текста и с буфером обмена. Эти действия выполняются над фрагментами текста обработчиками событий с помощью анализа свойств и применением методов, доступных соответствующим компонентам. Введенный текст содержится в свойстве Text полей ввода. MaskEdit, кроме того, в свойстве EditText содержит промежуточный, черновой вариант текста. Метод Clear() очищает текстовые объекты, заменяя строки свойства Text на пустые строки. Свойство Modified разрешает проверить, изменялся ли текст во время редактирования. Метод GetTextBuf() позволяет извлечь текст из объекта и возвращает количество введенных символов, например: char buf[256]; int count=Edit1-> GetTextBuf(buf, sizeof(buf)); Компонент Memo использует для хранения текста свойство Lines. Это массив строк класса Strings, который определен в VCL специально для поддержки строковых операций. Число строк в массиве содержит свойство Memo1-> Lines-> Count. Программно к отдельной строке можно обратиться по номеру, например, String s = Memo1-> Lines-> Strings[0]; Для ввода текста имеется специальный редактор (для его вызова дважды щелкните на свойстве Lines или на кнопке с многоточием). Работа с выделенными фрагментами и с буфером обмена одинакова для всех трех рассматриваемых компонентов. При выделении фрагмента текст автоматически помещается в строку SelText, а его начало и длина – в целочисленные свойства SelStart и SelLength, где их можно будет найти программно. Для работы с фрагментом имеется несколько методов: SelectAll() выделит весь текст компонента, ClearSelection() очистит весь выделенный фрагмент, GetSelTextBuf() копирует выделенный текст в символьную строку и возвратит число символов, а SetSelTextBuf заменит выделенный текст нуль терминированной строкой. Вот прототипы двух последних методов: int GetSelTextBuf(char * Buffer, int BufSize)); void SetSelTextBuf(char * Buffer); Для работы с буфером обмена также существует несколько методов, например, CopyToClipboard() копирует в него выделенный текст, а PasteFromClipboard() вставляет содержимое буфера в объект. Создадим обработчики событий. 11. Для вызова разработанного ранее диалогового окна (Form2), пункт меню Настройка… должен иметь следующий обработчик: void __fastcall TForm1:: Optionclick(TObject *Sender) { // Сохранить текущие пометки радиокнопок и переключателей bool Radio1= Form2-> RadioButton1-> Checked; bool Radio2= Form2-> RadioButton2-> Checked; bool Radio3= Form2-> RadioButton3-> Checked; bool Check1=Form2-> CheckBox1-> Checked; bool Check2=Form2-> CheckBox2-> Checked; int result=Form2-> ShowModal(); if (result==mrOk) { // Прочесть установки и выполнить действия if (Form2-> RadioButton1-> Checked) { ComboBox1-> Enabled= true; MaskEdit1-> Enabled= false; } if (Form2-> RadioButton2-> Checked) { ComboBox1-> Enabled= false; MaskEdit1-> Enabled= true; } if (Form2-> RadioButton3-> Checked) { ComboBox1-> Enabled= true; MaskEdit1-> Enabled= true; } if (Form2-> CheckBox1-> Checked) Button1-> Enabled= true; else Button1-> Enabled= false; if (Form2-> CheckBox2-> Checked) Memo1-> ReadOnly=false; else Memo1-> ReadOnly=true; } if (result==mrCancel) // восстановить значения переключателей { Form2-> RadioButton1-> Checked=Radio1; Form2-> RadioButton2-> Checked=Radio2; Form2-> RadioButton3-> Checked=Radio3; Form2-> CheckBox1-> Checked=Check1; Form2-> CheckBox2-> Checked=Check2; } 12. В начале каждой строки списка будем вставлять номер. Для определения номера строки воспользуемся свойством, которое хранит количество строк в компоненте Memo: Memo -> Lines -> Count. 13. Кнопка, отвечающая за внесение абонента в список, после того как поля ввода были заполнены, должна иметь обработчик события OnСlick. Вот такой код этот обработчик может содержать: void __fastcall TForm1:: Button1Click(TObject *Sender) void __fastcall TForm1:: Button1Click(TObject *Sender) { char nom[6], string[10]=" � "; int nomer; AnsiString record_auto; // получение номера текущей записи nomer= Memo1-> Lines-> Count; itoa (nomer, nom, 10); for (int i=0; i< 5; i++) string[i]=' '; string[5]; strcat(string, nom); strcat (string, ". " ); // формирование записи record_auto=(AnsiString) string; record_auto+=Edit1-> Text; record_auto+=" "; record_auto+=ComboBox1-> Text; record_auto+=" "; if (MaskEdit1-> Enabled& & MaskEdit2-> Enabled) { record_auto+=MaskEdit1-> Text; record_auto+=" "; record_auto+=MaskEdit2-> Text; record_auto+=" "; } if (ComboBox2-> Enabled) {record_auto+=ComboBox2-> Text; record_auto+=" "; } Memo1-> Lines-> Insert(nomer, record_auto); } Открытие и сохранение файла со списком абонентов будем осуществлять, как это и принято в Windows, в стандартных диалоговых окнах меню Файл. Для этого используем компоненты OpenDialog и SaveDialog. Вместе с методом Execute они обеспечат возврат имени файла, выбранного пользователем (свойство FileName); код ввода и сохранения данных напишите самостоятельно. 14. Ввставьте компонент SaveDialog в Form1, оставьте его имя по умолчанию, измените заголовок на Сохранение списка (свойство Title); 15. двойным щелчком на значении свойства Filter в инспекторе объектов, откройте окно редактора фильтров, в левой части которого задается текстовое описание типов открываемых файлов, а в правой – маска отбора файлов. Введите для нашего примера: слева – Текстовые файлы (*.txt), а справа – *.txt. 16. создайте обработчик события для пункта меню Файл | Сохранить. Вот его возможный код: void __fastcall TForm1:: SaveDialogClick(TObject *Sender) { if (SaveDialog1-> Execute()) { Memo1-> Lines-> SaveToFile(SaveDialog1-> FileName); Memo1-> Modified=false; } } 17. Для открытия файла следует выбрать компонент Open File, установить соответствующий заголовок, фильтр идентичный предыдущему, а в обработчик пункта меню Файл | Открыть внести следующий код: void __fastcall TForm1:: OpenDialogClick(TObject *Sender) { if (Memo1-> Modified) { int rezult=Application-> MessageBox (" Список был изменен. Сохранить изменения? ", " Сообщение", MB_YESNOCANCEL | MB_ICONWARNING); if (rezult==IDYES) SaveDialogClick(0); if (rezult==IDCANCEL) return; } OpenDialog1-> FileName=" "; if (OpenDialog1-> Execute()) { if (Memo1-> Lines-> Count> 0) Memo1-> Clear(); Memo1-> Lines-> LoadFromFile (OpenDialog1-> FileName); SaveDialog1-> FileName=OpenDialog1-> FileName; } } 18. обработчик выхода из программы. Он может быть весьма простым и выглядеть следующим образом: void __fastcall TForm1:: Exit1Click(TObject *Sender) { Close(); } 19. Не помешает добавить в него код, проверяющий, сохранен ли в файле список абонентов, и если не сохранен, то предупредить об этом пользователя, который должен будет принять решение. Контрольные вопросы 1. Назовите системные диалоги. 2. Основной метод, которым производится обращение к любому диалогу? 3. Какие диалоговые окна являются модальными? 4. Назовите основными свойствами классов TOpenDialog и TSaveDialog. 5. В каком свойстве компонента SaveDialog устанавливаются расширения сохраняемых файлов? Практическая работа №20 Тема: «Использование дерева данных в приложениях». Цель работы: Научиться использовать дерево данных в приложениях. Время выполнения: подготовка – 5 мин; выполнение – 165 мин.; проверка – 10 мин; всего – 180 мин. Теоретические сведения Популярное:
|
Последнее изменение этой страницы: 2017-03-08; Просмотров: 715; Нарушение авторского права страницы