- •Прикладное программирование
- •Часть 1
- •Прикладное программирование
- •Часть 1
- •1. Информация о дисциплине
- •1.1. Предисловие
- •2.1. Рабочая программа (220 часов) Введение
- •Раздел 1. Технология программирования
- •Раздел 2. Ввод данных
- •1.2. Содержание дисциплины и виды учебной работы
- •1.2.2. Перечень видов практических занятий и контроля
- •2. Рабочие учебные материалы
- •Раздел 3. Управляющие окна
- •Раздел 4. Развитые компоненты
- •Раздел 5. Основные понятия субд
- •Раздел 6. Программирование баз данных
- •6.1. Невизуальные компоненты для построения бд
- •Раздел 7. Основные приёмы программирования бд
- •Раздел 8. Развитые приёмы программирования бд
- •Раздел 9. Интерфейс прикладного программирования api
- •Заключение
- •2.2. Тематический план изучения дисциплины
- •Тематический план для студентов заочной формы обучения
- •Структурно-логическая схема дисциплины «Прикладное программирование»
- •2.4. Временной график изучения дисциплины при использовании информационно-коммуникационных технологий
- •2.5. Практический блок
- •2.5.1. Практические занятия
- •2.5.2. Лабораторный практикум
- •2.5.2.1. Лабораторные работы для очной формы обучения
- •2.5.2.2. Лабораторные работы для очно-заочной формы обучения
- •2.5.2.3. Лабораторные работы для заочной формы обучения
- •2.6. Балльно-рейтинговая система оценки знаний
- •3. Информационные ресурсы дисциплины
- •3.1. Библиографический список
- •Опорный конспект Введение
- •Раздел 1. Технология программирования
- •1.1. Основная тенденция технологии программирования
- •Раздел 2. Ввод данных
- •2.1. Организация надежного ввода
- •2.2. Обработка строк
- •2.3. Средства группирования компонентов
- •Раздел 3. Управляющие окна
- •3.1. Управление выбором
- •3.2. Диалоговые окна
- •3.3. Многострочные окна
- •Раздел 4. Развитые компонеты
- •4.1. Работа с данными типа DateTime
- •4.2. Работа с двумерными массивами
- •4.3. Компоненты навигаторов.
- •4.4. Использование указателей
- •Раздел 5. Основные понятия субд
- •5.1. Общие сведения о базах данных (бд)
- •5.2. Концепция управления бд из среды Builder
- •5.3. Файлы и индексы
- •Раздел 6. Программирование баз данных
- •6.1. Невизуальные компоненты для построения бд
- •6.2. Навигация по нд
- •6.3. Доступ к полям нд
- •6.4. Визуальные компоненты для работы с бд
- •Раздел 7. Основные приёмы программирования бд
- •7.1. Сортировка, фильтрация и редактирование нд
- •7.2.Организация надежного ввода данных в бд
- •Раздел 8. Развитые приёмы программирования бд
- •8.1. Построение связей между таблицами бд
- •8.2. Работа с изображениями.
- •Раздел 9. Интерфейс прикладного программирования api
- •9.1 Встраивание звука
- •9.2. Вызов других приложений
- •Заключение
- •3.3. Глоссарий (краткий словарь основных терминов и положений)
- •3.4. Технические средства обеспечения дисциплины
- •3.5. Методические указания к выполнению лабораторных работ
- •3.5.1. Лабораторные работы, семестр 1
- •Работа 1.1. Проектирование программного проекта.
- •Вспомогательный теоретический материал Основная тенденция технологии программирования
- •Компонент ActionList
- •Связь пунктов меню Main Menu1 с действиями ActionList
- •Связь действий ActionList с изображениями ImageList
- •Кнопки быстрого доступа
- •Всплывающие подсказки
- •Использование стандартных действий
- •10 Правил технологии программирования
- •Работа 1.2. Надёжный ввод
- •Работа 1.3. Контейнеры
- •Работа 1.4. Компоненты выбора
- •Работа 1.5. Диалоги
- •Работа 1.6. Многострочные окна
- •Работа 1.7. Определение даты и временного интервала.
- •Работа 1.8. Обработка двумерных массивов.
- •Работа 1.9. Работа с каталогами и файлами.
- •3.5.2. Лабораторные работы, семестр 2
- •Работа 2.1. Начальное создание базы данных
- •Вспомогательный теоретический материал Общие сведения о базах данных
- •Концепция управления бд из среды Builder
- •Средство dbe (Database Borland Engine – машина Borland управления базой данных)
- •Альяс базы данных
- •Поля файла бд
- •Набор данных таблицы бд
- •Управление наборами данных в среде Builder
- •Модуль данных DataModule
- •Файлы и индексы
- •Содержание работы
- •Работа 2.2. Сортировка набора данных, русификация заголовков
- •Работа 2.3. Организация надежного ввода
- •//Проверка полей Panel2 - только для режима замены
- •Работа 2.4. Ввод данных посредством вспомогательных словарей.
- •Работа 2.5. Связи таблиц типа 1:1 и 1:n
- •Работа 2.6. Поля синхронного просмотра типа Lookup
- •Работа 2.7. Поиск и фильтрация
- •Работа 2.8. Особенности сохранения изображений в бд
- •Работа 2.9. Встраивание звука
- •Работа 2.10. Вызов других приложений
- •Методические указания к практическим занятиям
- •Заключение
- •4. Блок контроля освоения дисциплины
- •Часть 1, первый семестр – контрольная работа, зачёт.
- •Часть 1, второй семестр – курсовой проект, экзамен.
- •4.1. Задание на контрольную работу и методические указания к её выполнению
- •Вниманию студентов, обучающихся с элементами дот.
- •Задание на курсовой проект и методические указания к его выполнению
- •Этапы работы над курсовым проектом
- •4.3. Текущий контроль Тренировочные тесты
- •4.4. Итоговый контроль Вопросы к зачёту, семестр 1
- •Вопросы к экзамену, семестр2
3.2. Диалоговые окна
В приложениях часто приходится отображать различные окна с сообщениями, чтобы дать пользователю какие-то указания или задать вопрос, на который возможен один из стандартных ответов:
«да» , «нет», «отменить», «прервать».
Для этой цели можно воспользоваться ранообразными готовыми процедурами. Простейшей из таких процедур является ShowMessage (показать сообщение), отображающая окно сообщения с кнопкой ОК. Ее можно вызвать из любой точки программы оператором:
ShowMessage(<строка>),
где под термином <строка> подразумевается строка типа AnsiString, выводимая на экран.
Выполнение: в центре экрана формируется окно с изображением кнопки OK, в которое выводится строка, записанная в операторе вызова как параметр. Заголовок окна совпадает с именем файла проекта, под которым он хранится в рабочем каталоге.
Поскольку имя проекта должно быть записано латинскими буквами, окно процедуры ShowMessage не является привлекательным. На рис. 14 представлено окно, формируемое следующей процедурой
ShowMessage(“Вы приступаете к работе с компонентом TabControl”);
Рис. 14. Простейший вывод алфавитной строки
Как видно из рисунка, выводимая надпись может содержать как русские, так и латинские буквы, однако название окна, размещённое в его верхней полосе, остается мало понятным (в примере – “Panel”), поскольку оно является программным именем файла проекта. Средства системы C++Builder позволяют его заменить на русский эквивалент, воспользовавшись настройками опций приложения.
Строка, передаваемая процедуре ShowMessage для вывода, может содержать наряду с алфавитными символами и управляющие команды, которые записываются в виде так называемых escape-последовательностей. Не рассматривая грамматики этих выражений, заметим, что управляющие последовательности представляют собой пару символов, первый из которых – «\» ( back slashe – собственно знак клавиши Escape), а второй – одиночная латинская буква. Роль управляющих символов приводится в [1], в данном комплексе мы ограничимся единственной командой – «перевод строки дисплея». Эта управляющая последовательность записывается как «\n» в любом месте строки вывода. Она не воспроизводится на экране как символ, но прерывает вывод строки и продолжает вывод с начала новой строки. Например процедура
ShowMessage(“Вы приступаете к работе с компонентами \nTabControl и \nPageControl ”);
вызовет форму, приведённую на рис. 15, при условии, что вы также изменили в настройках опций проекта свойство Title на русское наименование.
Рис. 15. Вывод строки с escape-командой
Процедура ShowMessage является незаменимым средством для организации «контрольных выводов», то есть распечатки на экране промежуточных результатов вычислений. Этот приём служит мощнейшим средством поиска логических ошибок в программе. Пусть, например, в процессе программирования вычисляются промежуточные значения X и Y, и программист желает знать эти величины. Главным средством, конечно, является пошаговая отладка, когда система C++Builder переводится из режима компиляции в режим интерпретации [4]. Но, к сожалению, это не всегда возможно, и в таких случаях на выручку и приходит метод контрольных печатей. Следующий фрагмент программы иллюстрирует этот метод:
{ int X,Y;
. . . . .
X=24; Y= -3;
ShowMessage("X="+IntToStr(X)+" Y="+IntToStr(Y));
. . .
}
Результат такой «контрольной» печати (а по существу, вывода на экран контрольной точки) представлен ниже.
Рассмотренная процедура ShowMessage отображают окно, в котором пользователь, прочтя текст, должен просто нажать ОК.
Функции MessageDlg
Более широкими возможностями обладают средства, с помощью которых пользователю задается какой-то вопрос и анализируется полученный ответ. Основная из этих функций – MessageDlg (диалог с выводом сообщения).
Она вызывается следующим образом:
MessageDlg ( <строка сообщения>,<тип окна>,
<набор кнопок>,<кадр файла справки>);
где
строка сообщения – произвольная строка типа AnsiString, текст которой
появляется в окне;
тип окна – указатель формы окна с помощью системных констант
типа TMsgDlgType;
набор кнопок – определитель количества и типа кнопок, появляющихся
в окне с помощью системного указателя MsgDlgButtons;
кадр файла справки – номер кадра в справочном файле.
Параметры функции MessageDlg
Параметр |
Тип, роль |
Значения |
Описание |
строка сообщения |
AnsiString |
строка символов |
сообщение, появляющееся в окне |
тип диалогового окна |
TMsgDlgType определяет конструкцию окна |
mtConfirmation |
Окно подтверждения |
mtlnformation |
Информационное окно |
||
mtError |
Окно ошибок |
||
mtWarning |
Окно предупреждений |
||
mtCustom |
Настраиваемое окно без рисунка |
||
|
Вид кнопки |
||
набор кнопок
|
TMsgDlgButtons определяет, какие кнопки будут присут-ствовать в окне |
mbYes |
Yes |
mbNo |
No |
||
mbOK |
OK |
||
mbCancel |
Cancel |
||
mbHelp |
Help |
||
mbAbort |
Abort |
||
mbRetry |
Retry |
||
mblgnore |
lgnore |
||
mbAll |
All |
||
mbCancel |
Cancel |
||
кадр файла справки |
int |
целое положительное число |
Цифровой номер кадра в справочном файле. Текст этого кадра будет выведен на экран, если пользователь нажмет клавишу F1, когда появился диалог. Если справка не запла-нирована, устанавливается 0. |
Вызов MessageDlg отображает диалоговое окно и ожидает ответа пользователя. Эта функция разработана в числе первых библиотечных подпрограмм, когда авторы системы Builder ещё не пришли к единой синтаксической структуре операторов вызова, поэтому конкретное описание оператора вызова MessageDlg приведёт к слишком длинному объяснению. Необычным в списке параметров является оператор присвоения системному параметру TMsgDlgButtons наименования кнопки, появляющейся в окне:
TMsgDlgButtons() << mbOK,
в котором вместо привычного знака равенства используется символ «<<». Это так называемое «присвоение данных из входного потока». Не вдаваясь в причины происхождения термина, примем такую манеру записи как грамматическую особенность языка C++.
Приведём несколько простых примеров, которые студент может принять за образец. Более детальное описание оператора вызова диалоговых сообщений приводится в контекстной справке системы Builder.
Следующий фрагмент программы выводит на экран окно предупреждений с единственной кнопкой «OK» (рис. 16.)
MessageDlg(
"Вы приступаете к работе с TPageControl ", //текст сообщения
mtWarning, // тип окна
TMsgDlgButtons() << mbOK , //тип кнопки
0); //номер кадра help-файла
Рис. 16. Окно предупреждений функции MessageDlg (типа mtWarning)
Этот вариант по своему применению практически не отличается от простейшего сообщения ShowMessage: пользователь просто уведомляется о какой-то ситуации, но ему не предоставляется возможности выбора дальнейших действий.
Достоинства процедуры MessageDlg начинают проявляться, когда вам предоставляется возможность такого выбора. Например, следующий фрагмент программы выводит на экран информационное окно с двумя кнопками «OK» и «Cancel», с помощью которых пользователь может выбирать одно из двух возможных действий (рис. 17).
MessageDlg("Вы хотите начать работу с TPageControl ?",
mtInformation, TMsgDlgButtons() << mbOK << mbCancel, 0);
Обратите внимание, что здесь системному параметру TMsgDlgButtons присваиваются значения двух кнопок mbOK и mbCancel. Это возможно потому, что переменная TMsgDlgButtons на самом деле является массивом.
Рис. 17. Информационное окно функции MessageDlg (типа mtInformation)
Различие между окнами типа mtInformation и mtConfirmation состоит практически только в наименовании окна, что, конечно, делает диалог более точным и конкретным.
Диалоговые окна, создаваемые процедурой MessageDlg, могут содержать большее количество кнопок, что создает хорошую базу для организации сложного диалога с большим количеством разветвлений. Это иллюстрирует следующий пример (рис. 18.)
MessageDlg(
"Запись некорректна. Дальнейшие действия:\nУдалить(Yes)\nПропустить(Cancel)\nИгнорировать(Ignore)",
mtError, TMsgDlgButtons()<<mbYes<<mbIgnore<<mbCancel,0);
Обратите внимание на использование управляющего кода \n в строке сообщений (см. выше).
Рис. 18. Окно вывода сообщения об ошибке функции MessageDlg (типа mtError)
Организация разветвлений с помощью функции MessageDlg
Основное достоинство процедуры MessageDlg состоит в том, что её можно использовать в качестве функции, возвращающей в точку вызова некоторое значение, на основании которого можно принять решение о дальнейшем ходе вычислительного процесса. Это значение является цифровым, но для удобства его использования со стороны пользователя оно может выражаться в виде системных символьных констант, принимающих «значение» кнопки, нажатой пользователем. Эти константы имеют вид: mrYes, mrNo и т.д. Для организации разветвлений в диалоге функцию MessageDlg записывают как аргумент условного оператора if (см. следующий пример).
Например, в следующем фрагменте диалога пользователь может нажать либо кнопку Yes, либо No. Если нажата кнопка Yes, на экране возникнет сообщение: «Вы выбрали кнопку Yes», если же пользователь нажал на изображение кнопки No, сообщение примет вид: «Вы нажали кнопку No» (рис. 19.).
if (MessageDlg( "Подтвердите удаление записи ", mtConfirmation,
TMsgDlgButtons()<<mbYes<<mbNo, 0) == mrYes)
ShowMessage("Вы выбрали кнпку Yes");
else ShowMessage("Вы нажали кнпку No");
Рис. 19. Реакция функции MessageDlg на кнпку Yes (слева) и на кнпку No (справа)
Функция MessageDlgPos
В распоряжении пользователя имеется также функция MessageDlgPos, во всем подобная MessageDlg, но отображающая диалоговое окно сообщений в заданном месте экрана.
Вызов функции MessageDlgPos отличается от вызова MessageDlg присутствием координат X и Y, указывающих местоположение окна:
MessageDlgPos ( <строка сообщения>,<тип окна>,
<набор кнопок>,<кадр файла справки>,
X,Y);
где
строка сообщения – произвольная строка типа AnsiString, текст которой
появляется в окне;
тип окна – указатель формы окна с помощью системных констант
типа TMsgDlgType;
набор кнопок – определитель количества и типа кнопок, появляющихся
в окне с помощью системного указателя TMsgDlgButtons
кадр файла справки – номер кадра в справочном файле
X, Y – координаты окна:
При вызове MessageDlgPos диалоговое окно отображается в точке экрана с координатами X (по горизонтали) и Y (по вертикали) и далее система ожидает ответа пользователя. Координаты определяются целочисленными параметрами X и Y. Остальные параметры тождественны функции MessageDlg.
Например, сообщение
MessageDlgPos("Начало работы", mtWarning,
TMsgDlgButtons()<< mbOK,0,
Form1->Left ,
Form1->Top);
в качестве координаты X использует левую границу формы Form1->Left, а как ординату – верхнюю границу формы. Поэтому сообщение будет выведено в верхний левый угол окна формы (рис. 20).
Рис. 20. Вывод сообщения функцией MessageDlgPos в левый верхний угол экрана
При выводе сообщения в нижнюю часть экранной формы надо учитывать, что координаты X и Y указывают левый верхний угол окна, так что его надо сдвигать влево и вверх, чтобы оно не вышло за пределы общего окна. В операторе вывода следующего сообщения это учтено (рис. 21):
MessageDlgPos("Ошибок не обнаружено", mtError,
TMsgDlgButtons()<< mbOK,0,
Form1->Width -200,// сдвиг окна влево
Form1->Height-100); // сдвиг окна вверх
Рис. 21. Вывод сообщения функцией MessageDlgPos в правый нижний угол экрана
Функция MessageBox
Основным недостатком рассмотренных функций и процедур являлось отсутствие русификации диалоговых окон (английские надписи на кнопках) и невозможность указать текст заголовка окна. Эти недостатки позволяет устранить метод MessageBox переменной Application, всегда автоматически создаваемой Builder-ом. Эта процедура не относится к категории библиотечных функций системы программирования Builder, а является частью операционной системы Windows, и по соподчинению является методом объекта Application. Поэтому при её вызове необходимо указывать и имя объекта.
Общий вид оператора вызова этого метода таков
Application->MessageBox ( <Текст сообщения>,
<Заголовок окна>,
<Набор кнопок>);
Он отображает диалоговое окно с заданными кнопками, сообщением и заголовком и позволяет проанализировать ответ пользователя. Это окно подобно окнам, создаваемым функциями MessageDlg, за исключением возможности использовать русский язык в заголовке окна и на кнопках. Два его параметра – <Текст сообщения> и <Заголовок окна> – могут быть записаны на любом языке. Надписи на кнопках для русскоязычной версии Windows всегда будут русским.
Набор кнопок в окне сообщения определяется следующим системными константами:
Константа |
Кнопки |
Русские наименования |
MB_ABORTRETRYIGNORE |
Abort Retry Ignore |
Стоп Повтор Пропустить |
MB OK |
ОК принята по умолчанию |
OK |
MB_OKCANCEL |
ОК и Cancel |
OK и Отмена |
MB RETRYCANCEL |
Retry и Cancel |
Повтор и Отмена |
MB YESNO |
Yes и No |
Да и Нет |
MB_YESNOCANCEL |
Yes, No и Cancel |
Да, Нет и Отмена |
С помощью этого метода можно также осуществлять разветвления в программе в зависимости от нажатой пользователем кнопки. Функция MessageBox возвращает нуль, если не хватает памяти для создания диалогового окна. Если же функция выполнена успешно, то возвращаемая величина свидетельствует о следующем:
Возвращаемое системное значение |
Выбрана кнопка |
|
Системное обозначение |
Русское значение |
|
IDABORT |
Abort (Стоп). |
|
IDCANCEL |
Cancel |
Отмена или нажата клавиша Esc |
IDIGNORE |
Ignore |
Пропустить |
IDNO |
No |
Нет |
IDOK |
ОК |
OK |
IDRETRY |
Retry |
Повтор |
IDYES |
Yes |
Да |
Рассмотрим пример организации разветвлений на базе метода MessageBox. Фрагмент программы показывает, какую кнопку нажал пользователь, результат приведён на рис. 22:
if (Application->MessageBox (
"Удалить текущую запись ?",// сообщение в окне
"Ваши действия " , // заголовок окна
MB_YESNO) //набор кнопок
==ID_YES) // системное имя кнопки, с нажатием которой
//планируется по умолчанию
ShowMessage("Выбрана кнопка Yes");
else ShowMessage("Выбрана кнопка No");
Рис. 22. Организация разветвления с помощью метода MessageBox
В завершение раздела следует порекомендовать студенту разобрать самостоятельно и процедуры ShowMessageFmt и CreateMessageDialog.
На практике часто приходится выполнять стандартные действия: открывать и сохранять файлы, задавать атрибуты шрифтов, выбирать цвета палитры, производить контекстный поиск и замену и т.п. Для реализации этих действий в библиотеку Builder включены компоненты, реализующие соответствующие диалоговые окна. Они размещены на странице Dialogs. В следующей таблице приведен перечень наиболее часто используемых диалогов.
Системные диалоги в C++ Builder
Компонент |
Наименование |
Описание |
OpenDialog |
Открыть файл |
Создает окно проводника для поиска и открытия файлов |
SaveDialog |
Сохранить файл как… |
Создает окно проводника для сохранения файлов |
OpenPictureDialog |
Открыть рисунок |
Создает окно проводника для поиска и открытия графических файлов |
SavePictureDialog |
Сохранить рисунок |
Создает окно проводника для сохранения графических файлов |
FontDialog |
Шрифты |
Предоставляет возможность установить атрибуты шрифта |
ColorDialog |
Цвета |
Предоставляет возможность установить выбора цвета |
PrintDialog |
Печать |
Вывод на печать методом Printer |
PrinterSeupDialog |
Параметры принтера |
Ecnfyfdkbdftn gfhfvtnhs ghbynthf |
FindDialog |
Найти |
Создает окно для поиска фрагмента текста по контексту |
ReplaceDialog |
Заменить |
Создает окно для замены фрагмента текста по контексту |
Чтобы начать работу с диалогами, поместите на форму нужный компонент, то есть его пиктограмму. Все диалоги являются невизуальными компонентами, так что место их размещения на форме не имеет значения, в дальнейшем вы узнаете, что наиболее рационально хранить невизуальные компоненты в модуле DataModul.
При обращении к этим компонентам вызываются стандартные диалоги, вид которых зависит от версии Windows и настройки системы. Так что при запуске одного и того же приложения на компьютерах с разными системами диалоги будут выглядеть по-разному.
Основной метод, которым производится обращение к любому диалогу, – Execute(). Эта функция открывает диалоговое окно, и если пользователь произвел в нем какой-то выбор, то функция возвращает true. При этом в свойствах компонента-диалога запоминается выбор пользователя, который можно прочитать и использовать в дальнейших операциях. Если же пользователь в диалоге нажал кнопку Отмена или клавишу Esc, то функция Execute возвращает false. Поэтому стандартное обращение к диалогу имеет вид:
if ( «имя компонента-диалога»->Execute())
«операторы, выполняющиеся при выборе элемента предложенного списка»
Диалоги открытия и сохранения файлов – компоненты OpenDialog, SaveDialog, OpenPictureDialog, SavePictureDialog
На практике чаще всего используются диалоги поиска и сохранения файлов, то есть компоненты OpenDialog – диалог «Открыть файл» и SaveDialog – диалог «Сохранить файл как...». Чтобы организовать окно для открытия файла и выполнить над ним какие-то действия, следует написать программу по типу следующего фрагмента.
if (OpenDialog1->Execute())
ShowMessage("Выбран файл "+OpenDialog1->FileName);
Формируемый этой командой диалог представлен на рис. 23.
Рис. 23. Диалоговое окно «Открыть файл»
Если пользователь нажмет кнопку «Открыть», то функция OpenDialog1->Execute() приобретёт значение true и будет выполнен оператор ShowMessage, формирующий окно сообщения (рис. 24).
Рис. 24. Результат выбора файла в окне «Открыть файл»
Как видно из рисунка, метод OpenDialog1->Execute() определяет полное имя файла, состоящее из пути к директории, содержащей файл (F:\ProjTurboC\Help), и собственно имени файла (uHelp.cpp). Это имя помещается в свойство OpenDialog1->FileName, которое далее используется по своему усмотрению.
Диалог «Сохранить файл как...» – SaveDialog – строится аналогично. Чтобы организовать окно для сохранения файла, следует написать программу по типу следующего фрагмента.
if (SaveDialog1->Execute())
ShowMessage("Выбран файл "+SaveDialog1->FileName);
Эта команды сформирует окно (рис. 25).
Рис. 25. Диалоговое окно «Сохранить файл как …»
Если вы укажете в окошке «Имя файла» какое-то правильно сформированное имя файла, то под этим наименованием файл будет сохранён в текущей директории, имя которой записано в окошке «Папка» ( рис. 26).
Рис. 26. Результат выбора кнопки «Сохранить» в окне «Сохранить файл как…»
Типы искомых файлов, появляющиеся в диалоге в выпадающем списке Тип файла, задаются свойством Filter. В процессе проектирования это свойство проще всего задать с помощью редактора фильтров, который вызывается нажатием кнопки с многоточием около имени этого свойства в Инспекторе объектов. При этом открывается окно редактора, вид которого представлен на рис. 27.
Рис. 27. Редактор фильтров компонентов OpenDialog и SaveDialog
В его левой панели Filter Name вы записываете тот текст, который увидит пользователь в выпадающем списке Тип файла диалога. А в правой панели Filter записываются шаблоны фильтра *.txt, *.doc, *.cpp.
После выхода из окна редактирования фильтров заданные вами шаблоны появятся в свойстве Filter как строка вида:
текст|*.txt|документ|*.doc|программа|*.cpp
В этой строке тексты и шаблоны разделяются вертикальными линиями.
Если теперь вы нажмете маленькую стрелочку в правом углу окошка «Тип файла», то получите такой выпадающий список (рис. 28).
Рис. 28. Выпадающий список типов файлов
Свойство FilterIndex определяет номер фильтра, который будет по умолчанию показан пользователю в момент открытия диалога. Например, значение FilterIndex = 1 задает по умолчанию первый фильтр.
Свойство InitialDir определяет начальный каталог, который будет открыт в момент начала работы пользователя с диалогом. Если значение этого свойства не задано, то открывается текущий каталог или тот, который был открыт при последнем обращении пользователя к соответствующему диалогу в процессе выполнения данного приложения.
Свойство DefaultExt определяет значение расширения файла по умолчанию, которое указывается без точки (например, «doc»). Если значение этого свойства не задано, пользователь должен указать в диалоге полное имя файла с расширением. Свойство Title позволяет задать заголовок диалогового окна. Если это свойство не задано, окно открывается с заголовком, определенным в системе (например, «Сохранить файла как …» ). Но вы можете задать и свой заголовок, подсказывающий пользователю ожидаемые действия. Например, «Укажите имя удаляемого файла».
Свойство Options определяет условия выбора файла. Часть опций, которые вы можете установить программно или во время проектирования с помощью Инспектора объектов, показаны на рис. 29.
Рис. 29. Опции системных диалогов
По умолчанию все перечисленные опции, кроме ofHideReadOnly, выключены. С ролью опции студенту предлагается ознакомиться самостоятельно по [1]. Более подробно работы с системными диалогами изучаются во время прохождения лабораторных работ.
Мы рассмотрели диалоги открытия и сохранения файлов произвольного тина. В библиотеке имеются еще специализированные диалоги открытия и закрытия графических файлов: OpenPictureDialog и SavePictureDialog. Диалоговое окно компонента OpenPictureDialog приведено на рис. 30.
Рис. 30. Окно компонента OpenPictureDialog
От окна, открываемого компонентом OpenDialog, этот диалог отличается удобной возможностью просматривать изображения в процессе выбора файла. На рисунке курсор установлен на файле по имени Arrow_Up.bmp. В правой части диалога отведено поле для представления изображения, хранящегося в этом файле – синяя стрелка «вверх». Обратите внимание на заголовок окна – «Открыть файл изображение». Это не стандартное наименование окна, а собственное, указанное в свойстве Title объекта OpenDialog (см. выше).
Запускается окно компонента OpenPictureDialog по такой же схеме, что и диалог OpenDialog, например так:
if (SavePictureDialog1->Execute())
ShowMessage("Записывается файл "+SavePictureDialog1->FileName);
Диалоговое окно компонента SavePictureDialog приведено на рис. 31.
Рис. 31. Окно компонента SavePictureDialog
Заголовок окна в данном случае не изменялся и является стандартным. Пользователь выбрал файл HAND_Right.bmp, изображающий руку, указывающую направо. Обратите внимание на список типов файлов («Тип файлов»), открываемых этим диалогом, практически в фильтровочном списке указаны расширения всех графических форматов.
Свойства компонентов OpenPictureDialog и SavePictureDialog ничем не отличаются от свойств компонентов OpenDialog и SaveDialog. Единственное отличие – заданное значение по умолчанию свойства Filter в OpenPictureDialog и SavePictureDialog.
В этих компонентах заданы следующие фильтры:
В этих фильтрах перечислены все типы графических файлов, с которыми может работать диалог. Так что вам остается удалить, если хотите, фильтры тех файлов, с которыми вы не собираетесь работать, добавить, может быть, фильтр «Все файлы (*.*)» и перевести на русский язык названия типов.
