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

Разработка Windows - приложений в среде Borland. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
строит прямоугольник, заданный координатами левого верхнего уг­ла и правого нижнего угла.
После построения сектора или прямоугольника выводится ле­генда диаграммы, поясняющая используемые при построении обо­значения. Прямоугольник, определеный точками pointRB и pointLT отображает тип заливки, выбранной для должности, название кото­рой выводится уже известной функцией TextOut.
Осталось в конец метода
float sg=0, ss=0, sc=0, sum=SumPay(crew); // sum – сумма всех ок-
if(sum!=0) {
sg=SumPay(crew, "сторож")/sum; // приведенные значения ss=SumPay(crew, "сантехник")/sum; // приведенные значения sc=SumPay(crew, "дворник")/sum; // приведенные значения
}
TBrush tbr(TColor::LtGreen); // сплошная зеленая
TBrush tbr_cr(TColor::LtRed,HS_CROSS); // штриховка решет-
TBrush tbr_dcr(TColor::LtBlue,HS_DIAGCROSS); // диагональ-
TPen pen(TColor::Black,2); // перо толщиной два
TRect r=GetClientRect(); // получим размеры
r.top = r.top+r.bottom/2; // рисовать будем в
TPoint pointLT(r.right*0.7,r.top-20); // верхний угол первой
TPoint pointB(r.right*0.5-30,r.bottom); // нижний угол первой
dc.SetBkColor(TColor::Sys3dFace); // устанавливаем фон
EvPaint добавить инструкции:
ладов
кисть
кой
ная решетка
пикселя
клиентской области ок­на
нижней половине
легенды
гистограммы
под текстом легенды
121
// далее рисуем три прямоугольника или сектора в зависимости от типа диаграммы:
ShowDiagram( dc, tbr_cr, r, pointB, pointLT, ss, 0, "сантехники");
ShowDiagram( dc, tbr, r, pointB, pointLT, sc, 360.0*ss,
"дворники");
ShowDiagram( dc, tbr_dcr, r, pointB, pointLT, sg, 360.0*(ss+sc), "охрана");
dc.RestoreObjects(); // восстанавливаем исходные
инструменты контекста
Запустите программу, заполните базу данными на сотрудников и нажмите кнопку «Статистика». Появится модальное окно, в верх­ней половине окна итоговые данные отобразятся в табличном виде, а в нижней половине
окна будет построена круговая диаграмма:
122
Выберите переключатель «Гистограмма» и посмотрите на ре­зультат:
Обмен данными. Буфер обмена (передачи)
В предыдущем разделе дополнительный диалог использовался для обработки и вывода информации. При этом новых данных в программу из диалога не поступало. Обсудим теперь возможность использования дополнительных диалогов для ввода данных и про­цедуру обмена данными между диалогом и основным приложением. Добавим в проект еще один диалог, созданный на основе нового класса
. Вызовите ClassExpert (меню View → ClassExpert) и в контек­стном меню панели Classes команду “Add new class”. В появившем­ся окне “Add new class” выберите в качестве базового класса TDialog и задайте в поле “Class name” имя нашего нового класса, например TDiaInput. Обязательно задайте идентификатор создаваемого ре­сурса в поле “Resource Id” – IDD_INPUT. Подтвердите создание класса – кнопка “OK”. Появится окно выбора параметров нового диалога. Как и
ранее, можно ничего не менять.
Нажмите кнопку “OK”. Будет создан новый диалог и в проект добавлены модули нового класса diainput.cpp и diainput.h. Найдите в редакторе ресурсов созданный диалог IDD_INPUT и отредакти­руйте его. В окне свойств диалога задайте заголовок диалога «Ввод»
123
и снимите флажок “Context Help” на вкладке “Extended”. Удалите кнопку “Help”.
Отредактируйте основной диалог – IDD_CLIENT. Добавьте кнопку «Ввод» и создайте функцию-обработчик нажатия на эту кнопку – BNClickedInput. Введите в созданную функцию код:
TDiaInput(this, IDD_INPUT).Execute();
или просто
TDiaInput (this).Execute();
и добавьте в заголовочный файл основного диалога (wrkdlgcl.h) ди­рективу:
#include "diainput.h
Запустите программу на исполнение и проверьте, отображается ли новый диалог после нажатия на эту кнопку «Ввод». Если все в порядке, то вернитесь к редактированию нового диалога IDD_IN-
PUT.
В левой стороне окна разместите вертикально две надписи (элемент управления “А” – Static Text) и задайте в окне свойств нуж­ный текст – «должность» и «имя». Добавьте справа
от надписи «должность» комбинированный список (элемент управления Combo- Box), задайте в его окне свойств на вкладке «ComboBox» нужный тип – “Dropdown List” и снимите флажок “Sort”. Справа от надписи «имя» поместите редактируемое поле (элемент управления “ab|” – Text Edit) и очистите свойство “Caption”.
Под надписями поместите группу из трех переключателей (эле-
мент управления Radio Button) для задания пола сотрудника
(«муж-
ской», «женский» и «современный»):
124
Вспомните, что порядок создания переключателей должен быть последовательным, один за другим непосредственно. Проверьте: меню Dialog → Set Creation Order. Если все правильно, нажмите клавишу “Esc”. Установите свойство “Group Flag” у первого пере­ключателя («мужской»), у остальных переключателей группы дан­ное свойство должно быть отключено.
Далее создайте необходимые объектные переменные: присвойте через Class Expert имена элементам управления. Комбинированному списку присвойте имя
EditNameInput, а переключателям – RadioMaleInput, Radio­FemaleInput и RadioModernInput соответственно. Сохраните все и
попробуйте запустить проект.
Замечание: Иногда Class Expert не справляется с обилием иден­тификаторов и программа «вылетает». Чаще всего это вызвано тем, что различным идентификаторам присвоены (в модуле workapp.rh) одинаковые числовые значения. Исправить такую ситуацию не­сложно, можно сов workapp.rh и изменить значения идентификаторов. Числа могут быть любыми, главное – не повторяющимися. Строго говоря, одина­ковые числовые значения не всегда приводят к ошибкам, но такая рекомендация, как мне кажется, понятнее. Гораздо реже в результате сбоя, вызванного, как правило, многократным добавлением и удале­нием элементов, возникают различных элементов управления. В этом случае придется изменить эти имена в окне свойств соответствующих элементов или «вруч­ную» отредактировать модули проекта. Будем надеяться, что вы счастливо избежали подобного сбоя или сумели исправить ситуа­цию.
Теперь разберемся с процессом обмена данными. В каждом классе диалога, в начале соответствующего можно найти буфер обмена. В нашем случае, в файле diainput.h он будет описан следующим образом:
struct TDiaInputXfer {
//{{TDiaInputXFER_DATA}}
TComboBoxData ComboJobInput;
char EditNameInput[ 255 ];
uint RadioMaleInput;
просто отредактировать заголовочный файл ресур-
ComboJobInput. Редактируемому полю имя
одинаковые имена идентификаторов у
заголовочного файла,
125
uint RadioFemaleInput;
uint RadioModernInput;
//{{TDiaInputXFER_DATA_END}}
};
а в файле diainput.cpp будет объявлена соответствующая структур­ная переменная:
static TDiaInputXfer TDiaInputData;
Устанавливается буфер передачи в конструкторе класса диалога:
SetTransferBuffer(&TDiaInputData);
При загрузке диалога в элементы управления выводятся значе­ния, хранящиеся в соответствующих полях буфера обмена. В случае выхода из диалога после нажатия пользователем кнопки “OK” в по­лях структуры запоминаются значения соответствующих элементах управления. Если диалог закрыт с по­мощью кнопки “Cancel”, измененные значения игнорируются.
Все было бы хорошо, но структурная переменная TDiaInput- Data определена непосредственно в модуле diainput.cpp, а нам она потребуется и в основном диалоге, в модуле wrkdlgcl.cpp. Поэтому сделаем ее глобальной. Для этого в файле diainput.cpp уберите ключевое
а в заголовочном файле diainput.h сразу за приведенным выше оп­ределением структуры TDiaInputXfer поместите объявление:
(unsigned int) у буферов переключателей на тип WORD. Здесь должно быть двухбайтовое целое, а не четырехбайтовое. Если не изменить, то два последних переключателя будут неправильно опо­знаваться в в заголовочном файле “windef.h”.
слово static:
TDiaInputXfer TDiaInputData;
extern TDiaInputXfer TDiaInputData;
Следующий важный момент – замените в структуре типы uint
буфере обмена. Типы данных uint и WORD определены
, измененные пользователем в
126
Закончим редактирование диалога «Ввод». Вызовите Class Ex- pert, выберите класс нового диалога TDiaInput, раскройте список
виртуальных функций и перегрузите метод SetupWindow класса TDiaInput. В созданную заготовку функции добавьте инструкции
для заполнения списка и выбора начальной установки в группе пе­реключателей (пол – «современный»):
ComboJobInput -> AddString("дворник");
ComboJobInput -> AddString("сантехник");
ComboJobInput -> AddString("сторож");
ComboJobInput -> SetSelIndex(0);
CheckRadioButton(104, 106, 106); // установка по значе-
нию идентификатора
Вместо строчки:
CheckRadioButton(104, 106,106);
можно, как и ранее, написать инструкцию с использованием имен идентификаторов группы переключателей (диапазон с IDC_RADIO-
BUTTON3 по IDC_RADIOBUTTON5, выбран IDC_RADIOBUT­TON5):
CheckRadioButton(IDC_RADIOBUTTON3,
IDC_RADIOBUTTON5, IDC_RADIOBUTTON5);
И наконец отредактируйте модуль основного диалога – файл
wrkdlgcl.cpp. Найдите уже созданную нами ранее функцию-обра­ботчик нажатия на кнопку «Ввод» – BNClickedInput и после строч­ки:
TDiaInput(this).Execute();
добавьте инструкции:
char buff[256];
wsprintf(buff,"должность - %s\nимя - %s\n",
127
TDiaInputData.ComboJobInput.GetSelection().c_str(),
TDiaInputData.EditNameInput);
if(TDiaInputData.RadioMaleInput == BF_CHECKED){
strcat(buff, "пол - муж");
}
if(TDiaInputData.RadioFemaleInput == BF_CHECKED){
strcat(buff, "пол - жен");
}
if(TDiaInputData.RadioModernInput == BF_CHECKED){
strcat(buff, "пол - средний");
}
MessageBox( buff, "Считано");
Как уже говорилось, поля буфера передачи TDiaInputData со­держат значения, выбранные пользователем в диалоге «Ввод» (если была нажата кнопка «OK»). Имена полей соотвествуют именам, за­данным элементам управления диалога. Поэтому поле TDiaInput- Data.ComboJobInput соответствует состоянию комбинированного списка. Метод GetSelection возвращает списка. Поскольку это значение типа string (не верьте встроенной справке Borland – это не char*), приходится преобразовывать его в
char* с помощью метода c_str класса string. Значением поля Edit­NameInput является строка символов, введенная в это поле. Значе- нием полей радиокнопок (RadioMaleInput и др.) будет константа BF_CHECKED, если соответствующий переключатель
пользователем. Таким образом, полученные из диалога «Ввод» зна­чения можно использовать в нашем основном диалоге, например, для организации расширенного поиска в базе данных. В приведен­ном примере они просто выводятся в окно сообщений MessageBox. Конечно, в нашей базе данных не было поля «пол сотрудника». Группа переключателей была введена только для иллюстрации редачи выбранного в такой группе значения. Запустите программу и нажмите кнопку «Ввод», выберите желаемые установки.
Выйдите из диалога «Ввод», нажав кнопку “OK”. Выбранные значения сохранились в буфере обмена и доступны в основном диа­логе:
значение выбранной строки
выбран
пе-
128
129
ГЛАВА IV. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
Визуальная среда редактора ресурсов Borland предоставляет разработчику широкий выбор элементов управления. Наиболее рас­пространенные элементы расположены на вкладке «Standard» – это командные кнопки, надписи (метки), редактируемые поля, списки, флажки и переключатели:
Неподписанные объекты вкладки “Standard” собственно не яв­ляются элементами управления, не имеют списка сообщений и предназначены для декоративного оформления диалога. При этом линии и рамка это, на самом деле, один и тот же элемент Frame (рамка). Принципы работы с большинством объектов, расположен­ных на вкладке “Standard”, уже обсуждались в предыдущих главах. Поэтому основном конспективно, за исключением вопросов, не рассматри­вавшихся ранее. Далее в этой главе дополнительно рассматриваются некоторые из элементов управления, расположенных на вкладке
«Common».
друга, как по функциональному назначению, так и по внешнему ви­ду, они имеют ряд общих характеристик, часть которых можно про­смотреть и изменить на вкладе “General” модального окна свойств элемента – Properties. Для этого дважды щелкните мышкой по нуж­ному элементу или выберите меню элемента:
в этой главе соответствующая информация приводится в
О
БЩИЕ ХАРАКТЕРИСТИКИ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ
Несмотря на то, что элементы управления отличаются друг от
соответствующий пункт контекстного
130
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]