Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ПП1 (C++ БД).doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
5 Мб
Скачать
☆

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.

В этих компонентах заданы следующие фильтры:

В этих фильтрах перечислены все типы графических файлов, с которыми может работать диалог. Так что вам остается удалить, если хотите, фильтры тех файлов, с которыми вы не собираетесь работать, добавить, может быть, фильтр «Все файлы (*.*)» и перевести на русский язык названия типов.