Текстовое поле как элемент диалога может быть
Перейти к содержимому

Текстовое поле как элемент диалога может быть

  • автор:

Тесты / Вопросы / Основы использования и конфигурирования 1С Предприятие

Disynergy.ru – Сдача тестов без предоплаты +7(924) 305-23-08 help@disynergy.ru

Disynergy.ru – Сдача тестов без предоплаты

Whatsapp/Telegram/Viber: +7(924) 305-23-08

1. Агрегатными объектами конфигурации называются объекты конфигурации, …

2. Алгоритм поведения документа определяется .

3. В качестве обязательных реквизитов каждый справочник имеет .

4. В окне редактирования объекта свойства Имя, Синоним и Комментарий входят в состав группы «…»

5. Ввод документа на основании – это возможность …

6. Верным утверждением является «. »

7. Внешние отчеты …

8. Все регистры на этапе конфигурирования описываются набором …

9. Движения документа — это .

10. Для запуска системы 1С:Предриятие можно использовать режимы.

11. Для реквизита документа Дата установить тип данных «Дата» .

12. Если необходимо создать регистр сведений для хранения данных по номенклатуре товаров, реализуемых фирмой,…

13. Значения перечислений устанавливаются …

14. Иерархические справочники – это …

15. Макеты документа .

16. На закладке «. » окна редактирования регистра сведений определяется структура хранения данных регистра

17. Набор свойств объекта конфигурации …

18. Неверно, что в 1С:Предприятие существуют регистры .

19. Неверно, что имя объекта конфигурации .

20. Неверно, что работа со справочниками может осуществляться в режиме …

21. Неверно, что тип данных «. » относится к базовым

22. Независимым называется регистр сведений,…

23. Особенность реквизитов отчета в том, что .

24. Отношение подчиненности между справочниками заключается …

25. Палитра свойств доступна .

26. Перечисления предназначены для …

27. Периодическим называется регистр сведений, …

28. Под измерениями регистров понимают …

29. Под объектом конфигурации понимается …

30. Под ресурсами регистров понимают набор …

31. Подчиненные документы — это .

32. При форматировании синтаксических конструкций встроенного языка «синтаксический отступ» выполняет автоматическое …

33. Регистр бухгалтерии предназначен для …

34. Регистр накопления предназначен для …

35. Регистр расчета предназначен для .

36. Регистр сведений …

37. Регистры в 1С:Предприятие используются для …

38. С помощью конструктора . можно создать печатную форму отчета

39. Синоним объекта конфигурации …

40. Синтаксический контроль модуля предназначен для .

41. Системными реквизитами любого справочника являются .

42. Текстовое поле как элемент диалога может быть .

Disynergy.ru – Сдача тестов без предоплаты +7(924) 305-23-08

Disynergy.ru – Сдача тестов без предоплаты +7(924) 305-23-08 help@disynergy.ru

43. Текстовый редактор 1С:Предприятие предназначен для …

44. Типизированными объектами конфигурации называются объекты конфигурации, …

45. Типообразующими объектами конфигурации называются объекты конфигурации.

46. Форма объекта конфигурации включает в себя .

47. Чтобы открыть модуль документа, надо …

Disynergy.ru – Сдача тестов без предоплаты +7(924) 305-23-08

Диалоги. Знакомство с элементами управления — MFC

Диалоги и элементы управления — очень обширная тема. Например, для полного освещения темы элементов управления потребовалась бы целая книга. Поэтому в данных методических указаниях мы рассмотрим сначала основы, а затем только наиболее широко используемые элементы управления. Это послужит Вам хорошим фундаментом на пути к углубленному изучению MFC.

Диалог (диалоговое окно) представляет собой специальный вид окна, которые предназначены для взаимодействия с пользователем. Обычно они используются для изменения настроек приложения и ввода информации. Диалоги используются очень часто. Например, практически все окна настроек приложения Microsoft Word являются диалогами.

  • Обыкновенная кнопка (push button) — это кнопка, которую пользователь «нажимает» мышью или клавишей Enter, переместив предварительно на нее фокус ввода.
  • Контрольный переключатель (check box) может быть либо выбранным, либо нет. Если в диалоге есть несколько контрольных переключателей, то могут быть выбраны одновременно несколько из них.
  • Радиокнопка (radio button) — это почти то же самое, что и контрольный переключатель. Только при наличии нескольких кнопок в группе может быть выбрана только одна.
  • Список (list box) содержит набор строк, из которого можно выбрать одну или несколько. Широко используется при отображении имен файлов.
  • Поле ввода (edit box) — это элемент, позволяющий ввести строку текста.
  • Комбинированный список (combo box) представляет собой список со строкой ввода.
  • Статический элемент (static control) предназначен для вывода текста или графики, но не предназначен для ввода.

Классы MFC для элементов управления

В MFC содержатся классы для всех стандартных элементов управления. Эти классы описывают сами элементы, а также содержат функции для работы с ними. Их называют классами управления. Они порождаются от класса CWnd. Таким образом, все они обладают характеристиками окна. Ниже приведены основные классы управления:

Класс Элемент управления
CButton Кнопки, селекторные кнопки и контрольные переключатели
CEdit Поля ввода
CListBox Списки
CComboBox Комбинированные списки
CScrollBar Полосы прокрутки
Cstatic Статические элементы

В MFC допускается также и непосредственное обращение к элементам управления, но на практике это происходит очень редко. Намного удобнее пользоваться соответствующими классами. Наиболее часто элементы управления используются с диалоговыми окнами, хотя можно создавать и отдельные элементы, расположенные в главном окне.

Модальные и немодальные диалоги

Есть два типа диалогов: модальные и немодальные. Наиболее распространены первые. В случае модальных диалогов, при активизации диалога основное окно приложения становится пассивным и перестает реагировать на действия пользователя до тех пор, пока он не закроет диалог. В случае немодальных диалогов, диалог существует независимо от других окон, и основное окно также может быть активизировано. Программировать немодальные диалоги немного труднее. Мы рассмотрим оба типа диалогов.

Диалоги как ресурсы

Как уже было упомянуто выше, диалоги не создаются программно. Вместо этого, при необходимости из ресурсов загружаются описания диалогов, и Windows по этому описанию формирует окно и размещает на нем все элементы управления.

Диалоги редактируются визуально из ресурсного редактора. Диалог вместе со всеми элементами управления представляет собой один ресурс со своим идентификатором. Кроме того, каждый элемент управления имеет свой идентификатор, который может быть только числовым. Обычно идентификаторы имеют префикс в соответствии с названием данного элемента управления, хотя при желании можно использовать любые идентификаторы.

Класс CDialog

В MFC все диалоги являются экземплярами либо класса CDialog, либо порожденных от него классов. Лишь самые простые диалоги используют непосредственно класс CDialog. В общем же случае, необходимо определять собственный класс. Класс CDialog имеет конструкторы со следующими прототипами:

Параметр ResourceName или ResourceID определяет идентификатор диалога в ресурсах, строковый или числовой. Параметр Owner — это указатель на окно-собственник, если равен 0, то собственником будет главное окно приложения. Последняя форма конструктора предназначена для создания немодальных диалогов, о которых будет сказано в дальнейшем.

Обработка сообщений от диалогов

Все диалоги являются разновидностью окон. Поэтому для них используется такой же механизм сообщений, как и для главного окна. Для каждого диалога организуется собственная очередь сообщений, так же точно, как и для главного окна.

Каждый раз, когда элемент управления диалога активизируется, диалогу посылается сообщение WM_COMMAND. С этим сообщением передается идентификатор элемента управления. Для обработки сообщений в карту сообщений диалога нужно поместить макрос ON_COMMAND(). Многие элементы управления генерируют также идентификационный код, который позволяет определить, какое действие было произведено с элементом управления. Во многих случаях по этому коду выбирается тот или иной обработчик. Как будет показано далее, в MFC имеется механизм, подобный макросу ON_COMMAND(), с помощью которого можно связывать идентификационные коды с обработчиками.

Вызов диалога

После того, как объект класса диалога создан, необходимо вызвать член-функцию DoModal(). Результатом будет модальное отображение диалога. Прототип функции следующий:

Функция возвращает код завершения, генерируемый диалогом при закрытии, или -1, если окно не может быть отображено. Если при отображении диалога произошла ошибка, возвращается IDABORT. Функция не завершается, пока диалог не будет закрыт.

Закрытие диалога

По умолчанию диалог закрывается при получении сообщения с идентификатором либо IDOK, либо IDCANCEL. Они предопределены и обычно связаны с кнопками подтверждения и отмены. Класс CDialog содержит встроенные обработчики для этих двух случаев, OnOK() и OnCancel(). Их не нужно включать в очередь сообщений диалога. Но их можно переопределить, что дает возможность программисту управлять закрытием диалога. Для программного закрытия диалога нужно вызвать член-функцию с прототипом:

Параметр определят значение, которое вернет функция DoModal(). Обычно возвращаются значения IDOK или IDCANCEL, другие значения используются редко.

Пример программы с диалоговым окном

Ниже приведены исходные тексты примера программы с диалогом. Диалог выбирается с помощью меню. Он имеет три элемента управления — кнопки «Red», «Green» и «Cancel». Также переопределена функция OnCancel(), что позволяет при попытке закрытия диалога вывести окно с подтверждением. Диалог закрывается программно, с возвратом кода завершения 7, который затем возвращается функцией DoModal() и отображается в окне. Это сделано лишь для демонстрации, реально же обычно возвращается IDCANCEL. Диалог создавался визуально в среде Visual C++. Здесь приводится также файл с идентификаторами, сгенерированный средой. В дальнейшем этот файл приводиться не будет, потому что, вообще говоря, он не предназначен для чтения человеком. Так как все идентификаторы в примерах имеют осмысленные имена, то загрузив проект в среду IDE, Вы сможете сразу узнать, какие идентификаторы каким элементам управления соответствуют.


Рис. 7. Пример приложения с диалогом

Инициализация диалога

Часто различные переменные и элементы управления, связанные с диалогом, должны быть инициализированы до того, как диалог будет отображен. Чтобы позволить диалогу выполнить подобные действия, Windows автоматически посылает ему сообщение WM_INITDIALOG в момент создания. При получении такого сообщения MFC автоматически вызывает член-функцию OnInitDialog(), которая является стандартным обработчиком, определенным в классе CDialog. Эта функция должна переопределяться в программе, если необходимо выполнение различных инициализационных действий. Прототип функции такой:

Эта функция вызывается до того, как диалог будет отображен. Она должна возвращать TRUE, чтобы Windows могла передать фокус ввода (т. е. сделать активным) на первый элемент управления в окне.

Первым действием в переопределенной функции должен быть вызов функции CDialog::OnInitDialog().

В дальнейшем мы будем использовать эту функцию в примерах.

Списки

Список является одним из наиболее распространенных элементов управления. В MFC работа со списком осуществляется через класс CListBox.

Основы работы со списками

Списки являются элементами управления, требующими двустороннего взаимодействия между ними и программой. То есть список может как посылать, так и принимать сообщения. В частности, сообщения посылаются списку при его инициализации. Сюда входит передача набора строк, которые будут отображены в окне списка (по умолчанию список создается пустым). Когда список инициализирован, он посылает сообщения о действиях, произведенных с ним пользователем.

Прием идентификационных кодов списка

Список может генерировать сообщения различных типов. Например, сообщения посылаются при двойном щелчке на элементе списка, при потере списком фокуса ввода и при выборе другого элемента из списка. Каждое такое событие описывается идентификационным кодом. Этот код является частью сообщения WM_COMMAND. Некоторые другие элементы также используют идентификационные коды.

Единственный код, которым мы воспользуемся, называется LBN_DBLCLK. Он посылается, когда пользователь выполняет двойной щелчок на элементе списка. (При определении списка в ресурсах должна быть установлена опция Notify, чтобы он мог генерировать это сообщение.) Когда выбор произведен, необходимо запросить список, чтобы узнать о том, какой элемент выбран.

Для обработки сообщения LBN_DBLCLK необходимо поместить его обработчик в карту сообщений. Но это будет не макрос ON_COMMAND(). Вместо этого в данном случае используются специальные макрокоманды. Для нашего сообщения это будет ON_LBN_DBLCLK(). Она имеет такой вид:

Многие сообщения обрабатываются подобным образом. Названия всех макросов для таких сообщений начинаются с префикса ON_LBN_.

Передача сообщений списку

В традиционных Windows-программах сообщения посылаются элементам управления с помощью API-функций, например SendDlgItemMessage(). Но в программах на MFC для этих целей применяются соответствующие функции-члены. Они автоматически посылают нужное сообщение элементу управления. В этом заключается преимущество MFC по сравнению с традиционным методом программирования.

Списку может быть послано несколько разных сообщений. Для каждого класс CListBox содержит отдельную член-функцию. Например, рассмотрим следующие функции:

Функция AddString() вставляет указанную строку в список. По умолчанию она вставляется в конец списка. Начало списка имеет индекс 0. Функция GetCurSel() возвращает индекс текущего выделенного элемента. Если ни один элемент не выбран, возвращает LB_ERR. Функция GetText() получает строку, связанную с указанным индексом. Строка копируется в символьный массив по адресу StringVariable.

Получение указателя на список

Функции CListBox работают с объектами CListBox. Значит, необходимо получить указатель на объект списка, что делается с помощью функции GetDlgItem(), являющейся членом класса CWnd:

Эта функция возвращает указатель на объект, чей идентификатор передан как параметр. Если такой объект не существует, то возвращается 0. Необходимо понимать, что указатель, возвращаемый функцией, является временным. Он действителен только в пределах текущего обработчика.

Значение, возвращенное функцией, должно быть приведено к типу указателя на конкретный класс управления. Например, в нашем случае это тип CListBox*.

Инициализация списка

Посколькlу по умолчанию список создается пустым, он должен инициализироваться каждый раз, когда отображается диалог. Для этого необходимо переопределить функцию OnInitDialog(), в которой в список добавлялись бы строки. Если при добавлении элементов в список их число превысит то, которое помещается в окне списка, то в этом окне автоматически появится вертикальная полоса прокрутки.

Пример программы

Мы расширим предыдущий пример программы и добавим в диалог список. Выбор элемена списка осуществляется либо с помощью двойного щелчка на элементе, либо при нажатии на кнопку «Выбери фрукт». Обратите внимание, что в обоих случаях вызывается один и тот же обработчик, который сначала получает адрес объекта списка, затем получает номер выделенного пункта, а по номеру получает выделенную строку. Строка печатается в окне.


Рис. 8. Пример приложения со списком

Поле ввода

Это последний элемент управления, который мы рассмотрим в качестве введения в диалоги и элементы управления. Поля ввода используются очень широко, так как дают возможность ввести строку по своему усмотрению. Даже зная, как создавать только поля ввода и списки, уже можно писать полезные программы.

Поля ввода принимают многие сообщения и сами могут генерировать несколько типов сообщений. Однако обычно отвечать на большинство из них нет необходимости. Как Вы скоро убедитесь, поля ввода самостоятельно выполняют большинство функций редактирования. Для этого не требуется взаимодействия с программой. Нужно только решить, когда затребовать содержимое поля ввода.

Для получения текущего содержимого поля вода, состоящего из одной строки, используется функция GetWindowText(). Ее прототип таков:

В результате ее выполнения содержимое поля ввода будет скопировано в строку по адресу StringVariable. Эта функция позволяет получить текст, связанный с любым окном или элементом управления. Применительно к обычному окну функция получает заголовок окна.

В момент создания поле ввода является пустым. Для инициализации его содержимым используется еще одна функция-член класса CWnd — SetWindowText(). Она отображает строку в элементе управления, который вызвал эту функцию. Вот ее прототип:

Пример программы с полем ввода


Рис. 9. Приложение со строкой редактирования в диалоге

Немодальные диалоги

Немодальные диалоги получают сообщения параллельно с основным окном bприложения. То есть, как минимум два окна будут одновременно активными. Поэтому работа с немодальными диалогами требует чуть больше усилий, должны быть выполнены дополнительные операции.

Для создания немодального диалога нужно выполнить два действия. Во-первых, нужно создать «пустой» объект диалога, то есть не связанный с шаблоном из ресурсов. Привязка к ресурсам осуществляется через функцию Create(). Рассмотрим этот процесс подробнее.

Для создания объекта немодального диалога нужно использовать конструктор CDialog::CDialog() без параметров. Он объявлен как protected-член класса. Это означает, что он может быть вызван только изнутри член-функции порожденного класса. Это сделано для того, чтобы программист обязательно определял свой порожденный класс для немодального диалога, и определял в нем дополнительные операции для немодального диалога.

Когда экземпляр создан, он привязывается к ресурсам с помощью функций:

Первый параметр определяет идентификатор диалога в ресурсах. Второй параметр, как обычно, определяет окно-собственник для диалога.

Необходимо помнить о том, что объект немодального диалога должен существовать в течение всего времени использования диалога. Функция Create() отображает окно и после этого немедленно завершается. А объект окна должен существовать.

В отличие от модальных окон, немодальные не становятся автоматически видимыми при вызове. Чтобы диалог сразу был видимым, нужно в ресурсном редакторе установить опцию Visible. Или можно использовать функцию ShowWindow().

Для закрытия немодального диалога нужно использовать функцию DestroyWindow(). Это означает, что функции OnCancel() и/или OnOK() должны быть переопределены.

Пример программы с немодальным диалогом


Рис. 10. Пример приложения с немодальным диалогом

Текстовое поле как элемент диалога может быть

Визуальные средства разработки приложений в Windows в последнее время становятся обыденным инструментом любой приличной системы программирования. Предлагать систему программирования, способную создавать диалоговые программы, но лишенную визуальных средств проектирования экранных форм, пожалуй, просто неловко.

В этом разделе описывается работа со встренным конструктором диалогов (экранным дизайнером) HomeLisp. Последовательность действий по созданию визуального интерфейса в HomeLisp довольно схожа с работой в таких системах, как Visual Basic, VBA или Deplphi. Разумеется, возможности и событийная модель HomeLisp, описанная здесь, заметно скромнее, чем у перечисленных выше профессиональных систем разработки. Тем не менее, даже эти скромные возможности вполне позволяют создать простой графический интерфейс для программ, написанных на HomeLisp.

Основой графического пользовательского интерфейса применительно к HomeLisp является т.н. диалог — модальная форма, содержащая элементы управления. Элементами управления являются:

Событийная модель HomeLisp очень проста: с каждым элементом управления связан один тип событий. С полем ввода (TextBox) связано событие KeyPressed, заключающееся в том, что пользователь ввел в поле ввода символ. С остальными элементами управления связано событие Click (щелчок мыши). Процедура-обработчик события для поля ввода получает, как параметр, ASCII-код клавиши, нажатой пользователем. Обработчики события Click не получают параметров.

В экранном дизайнере диалог может быть «нарисован» мышью (при минимальном участии клавиатуры). Дизайнер также генерирует заглушки процедур-обработчиков событий для каждого из элементов управления. Содержательную часть кода процедур-обработчиков событий должен написать человек.

Сверстанный диалог можно сохранить в текстовом файле с расширением «.dlg» (и впоследствии восстановить с целью продолжения работы). Полностью готовый диалог следует «протранслировать» в Лисп-код, после чего диалог готов для выполнения.

Для того, чтобы из среды разработки вызвать дизайнер, пользователь должен активизировать четвертую кнопку панели инструментов:

или пункт главного меню «Диалоги». Окно экранного дизайнера выглядит так:

Дизайнер содержит командную панель (органы которой задублированы в главном меню) и панель инструментов. Панель инструментов, в свою очередь, включает средства выбора элементов управления, выпадающий список элементов управления и окно свойств. Справа от панели инструментов расположена форма проектируемого диалога.

Опишем органы управления дизайнером чуть подробнее. Командная панель (тулбар) дизайнер имеет вид:

Кнопки командной панели (перечисленные слева направо) предназначены для:

Загрузить диалог сохраненный ранее в файле .dlg;

Сохранить диалог в файле формата .dlg;

Вырезать выделенный текст и поместить его в буфер обмена (кнопка активна только в режиме корректировки программного кода);

Скопировать выделенный текст и поместить его в буфер обмена (кнопка активна только в режиме корректировки программного кода);

Вставить текст из буфера обмена с текущего положения курсора (кнопка активна только в режиме корректировки программного кода и при непустом буфере обмена);

Вставить стандартный шаблон вызова функции с текущего положения курсора (кнопка активна только в режиме корректировки программного кода);

Сгенерировать Лисп-код диалога (включает программное создание диалога, добавление органов управления и назначение обработчиков событий);

Выйти из конструктора диалогов и вернуться в среду разработки.

Панель инструментов конструктора показана на отдельном рисунке ниже:

Два ряда кнопок в верхней части панели служат для выбора «рисуемого» элемента управления. При этом самая левая кнопка в первом ряду (с изображением стрелки) служит для отказа от выбора типа. Активная в данный момент кнопка обводится синей рамкой.

Ниже в отдельной рамке располагается двухкнопочный переключатель свойства/события. Этот переключатель активен только если на форме имеется хотя бы один элемент управления.

Еще ниже располагается выпадающий список объектов диалога. Каждому элементу управления дается уникальное стандартное имя и оно добавляется в выпадающий список объектов. Если пользователь удалит элемент управления, его имя автоматически удалится из списка объектов диалога.

Под списком объектов диалога располагается окно свойств активного элемента управления. Любое из свойств может быть изменено. Для этого следует щелкнуть по полю ввода, распложенному правее нужной надписи. Дальнейшее зависит от вида свойства. Для простых свойств (текст надписи, геометрические размеры) откроется желтое поле ввода, в которое можно с клавиатуры ввести новое значение (которое заменит старое). Нажатие клавиши Esc позволяет отказаться от замены. Для сложных свойств (шрифт, цвет, иконка) в поле ввода появится кнопка Дальше. , после чего либо вызывается стандартный диалог (выбор шрифта, цвета), либо отображается форма выбора иконки из внутреннего пула иконок.

Ниже работа с дизайнером будет рассмотрена на примере создания простого диалога, содержащего два поля ввода и две командные кнопки. В первое поле ввода пользователь вводит целое число, нажимает первую кнопку, и во втором поле появляется факториал введенного числа. Вторая кнопка служит для завершения диалога.

Для изменения размеров формы (ширины и высоты) можно либо «подцепить» соответствующую границу формы мышью и придать форме нужные размеры, либо дважды щелкнуть мышью по полю ввода в окне свойств диалога (против надписей «ширина» или «высота») и задать нужный размер формы диалога. Двойной щелчок по полю ввода против надписи «заголовок» позволяет задать отображаемый заголовок формы.

Для того, чтобы разместить на форме элемент управления, следует щелкнуть мышью по иконке нужного элемента, перевести курсор мыши на проектируемую форму, установить его в точку, где будет располагаться левый верхний угол элемента управления, нажать левую клавишу мыши, и, не отпуская левой клавиши, повести мышью вниз и вправо. При этом на форме возникнет коричневая рамка, показывающая место, где будет располагаться добавляемый элемент управления. На приводимом ниже рисунке пользователь размещает текст-бокс (поле ввода).

После того, как пользователь отпустит левую клавишу мыши, рамка исчезнет, а на месте рамки появится соответствующий элемент управления:

Видно, что элемент управления окружен желтыми квадратиками-маркерами. Двигая эти квадратики мышью, можно менять размеры элемента управления. Можно также перемещать элемент управления, как единое целое. для этого следует ввести курсор мыши внутрь области, занимаемой элементом управления, нажать левую клавишу мыши и двигать элемент управления, не отпуская левую клавишу.

Описанным выше образом, размещаем на форме диалога еще одно поле ввода (для результата) и две командные кнопки. Вид полученного диалога приводится ниже:

Пусть читатель обратит внимание, что в выпадающй список, расположенный между палитрой инструментов и окном свойств, добавляются имена выбранных элементов управления. Первое поле ввода будет называться _TXT_1, второе — _TXT_2 и т.д. Диалогу тоже присваивается имя _DLG_. В поля ввода при их создании автоматически заносится текст Поле_ввода_1, Поле_ввода_2 и т.д. Аналогично, на командных кнопках формируются надписи Кнопка-1, Кнопка-2 и т.д.

Теперь необходимо очистить поля ввода и изменить надписи на кнопках. Для этого следует щелкнуть мышью по нужному элементу управления (например, по первому полю ввода), перейти в окно свойств и щелкнуть мышью по полю ввода справа от слова «текст». Поле окрасится в желтый цвет, и в нем появится курсор. Необходимо удалить все символы из этого поля и нажать Enter:

Аналогичным образом очищается второе поле ввода, а на кнопки наносятся надписи «Вычислить» и «Закрыть» соответственно:

На командные кнопки можно посадить иконки. Для того, чтобы сделать это, выделяем щелчком мыши нужную кнопку, переходим в окно свойств, и дважды щелкаем по белому полю справа от надписи «иконка». На поле появится кнопка с тремя точками:

Щелкаем по этой кнопке, — появится форма выбора иконки:

Выбираем нужную иконку, нажимаем кнопку «Принять», — и диалог принимает окончательный вид:

Теперь необходимо назначить кнопкам процедуры-обработчики событий. Начнем с кнопки «Закрыть». Выделяем эту кнопку щелчком мыши, а затем щелкаем по кнопке с изображением желтой молнии. Открывается окно редактирования кода:

В теле функции-обработчика события пишем вызов DLGHIDE:

Щелкаем по кнопке с изображением руки (переходим от редактирования кода к дизайну), выбираем кнопку «Вычислить» и, щелкнув по желтой молнии, открываем ее обработчик. В этом обработчике пишем следующее:

Тело функции-обработчика представляет собой PROG-конструкцию. Используются две локальные (связанные) переменные x и y. В переменую x заносится текст, введенный пользователем в первое поле ввода. Чтобы предотвратить возможные ошибки, вычисление факториала заключается в TRY-EXCEPT-группу. Поскольку функция fact требует аргумента типа FIXED, то используется функция STR2FIX. Если при вычислении факториала произойдет любая ошибка, переменная y получит значение «Ошибка при вычислении». В любом случае, значение переменной y заносится в текстовое поле _TXT_2.

Диалог готов. Перед тем, как генерировать Лисп-код, диалог рекомендуется сохранить. Для этого следует выбрать пункт главного меню «Сохранить» или нажать кнопку на панели инструментов с изображением дискеты. Откроется окно «Сохранить как»:

Выбираем имя test и нажимаем кнопку сохранить. Выдается сообщение «Диалог сохранен». Теперь следует сгенерировать Лисп-код нашего диалога. Для этого нажимаем седьмую кнопку панели инструментов (или выбираем пункт главного меню «Сгенерировать»). Снова появится окно «Сохранить как»:

Задаем имя test и нажимаем кнопку «Сохранить». Выдается сообщение «Лисп-код сгенерирован», а в выбранной директории появится файл test.lsp, содержащий полный код диалога. При желании можно посмотреть Лисп-код. Он будет выглядеть так:

Можно попытаться исполнить сгенерированный код. Для этого выходим из дизайнера (нажав кнопку «Выход»), и пробуем загрузить и выполнить файл test.lsp. На экране появляется спроектированная выше форма. Вводим в первое поле ввода 10 и нажимаем кнопку Вычислить:

Диалог вполне работоспособен. Если ввести в поле ввода отрицательное число, то будет выдано сообщение об ошибке:

Осталось добавить, что поскольку диалог был сохранен, его можно многократно корректировать в дизайнере. Для этого сохраненный диалог нужно открыть, для чего следует нажать первую кнопку панели инструментов или выполнить пункт главного меню «Открыть».

Кроме того, как уже отмечалось выше, при составлении функций-обработчиков доступна возможность вставки шаблонов стандартных конструкций. Для этого на панели инструментов имеется точно такая же кнопка, как и на панели главного окна IDE.

Текстовое поле как элемент диалога может быть

В .NET существует несколько стандартных классов, которые позволяют организовать диалог программы с пользователем. Это

OpenFileDialog — выбор имени файла при открытии документа;

SaveFileDialog — задание имени при сохранении документа;

ColorDialog — выбор цвета;

FontDialog — для настройки шрифтов;

FolderBrowserDialog — работа с каталогами;

PageSetupDialog — настройка печати;

PrintDialog — организация печати;

PrintPreviewDialog — предварительный просмотр документа.

Вначале рассмотрим работу с диалогами в целом, а затем на примерах разберёмся, как использовать различные стандартные диалоги для решения своих задач.

Общая схема применения стандартных диалогов

Порядок работы с любым стандартным диалогом может быть следующим:

выбираем на панели компонентов Tools необходимый элемент и размещаем его на форме;

определяемся с тем, как мы будем вызывать этот диалог. Обычно это делается по щелчку мыши по кнопке (на форме должен быть объект типа Button ) или выбор определяем в каком-то пункте меню (устанавливаем на форму объект типа MenuStrip );

затем создаём обработчик событий для кнопки или пункта меню (в зависимости от того, что выбрано в пункте 2). Практически всегда обработчик событий будет иметь такой вид:

void Имя_Click(object sender, EventArgs e)

// Выполнение каких-либо действий.

// Обычно — это применение выбранных в окне диалога параметров

Имя_Click() — имя обработчика событий, задаётся системой автоматически;

Диалог — имя объекта нужного класса-диалога. Чаще используют то имя, что даст система. Например, объект OpenFileDialog получит по-умолчанию имя openFileDialog1.

Как работает такой обработчик ( Имя_Click() )? Всё очень просто. В операторе if вызывается метод ShowDialog() — показать (открыть) диалог. В открытом окне диалога пользователь выбирает, задаёт тем или иным способом необходимые параметры. Затем он нажимает на кнопку для подтверждения выбора (для разных диалогов она может иметь разное название, например « Открыть » для диалога по выбору имени открываемого файла) или кнопку « Отмена » для отмены действий. Если пользователь подтвердил свой выбор, то метод ShowDialog() возвращает результат DialogResult.OK . При отмене действий метод вернёт DialogResult. Cancel .

Понятно, что по ветви « Да » оператора

и надо записать все необходимые действия по использованию того, что выбрал пользователь в окне диалога.

Теперь на примерах рассмотрим работу конкретных диалогов.

Задача . Создать простейший текстовый редактор. В этой программе должно быть меню, позволяющее пользователю выполнять какие-то действия с текстом: например, сохранять на диске набранный текст, открывать ранее созданный файл и так далее. Основное внимание уделим применению диалогов, а не собственно редактированию текста.

Работу будем вести постепенно, добавляя новые виды диалогов и показывая, как можно воспользоваться результатами их работы.

На форме вначале разместим два компонента: MenuStrip (имя по-умолчанию menuStrip1 ) — для организации меню и TextBox (имя по-умолчанию textBox1 ) — для работы с текстом. В окне свойств ( Properties ) для textBox1 присвоим значение true для свойства Multiline , т. е. мы хотим иметь многострочный редактор. Можно ещё и свойству Dock присвоить значение Fill (заполнять всю свободную область формы).

Классы OpenFileDialog и SaveFileDialog

Разместим на форме два стандартных компонента: OpenFileDialog и SaveFileDialog . По-умолчанию объекты этих классов получат имена o penFileDialog 1 и s aveFileDialog 1 соответственно.

В меню создадим пункт Файл , а в нём Открыть , Сохранить как и Выход . Напишем для них обработчики событий:

OpenToolStripMenuItemClick — для пункта Открыть ;

SaveToolStripMenuItemClick — для пункта Сохранить как ;

ExitToolStripMenuItemClick — для пункта Выход .

Возможный текст основной части программы (файл MainForm.cs):

public partial class MainForm : Form

// Выбрать и открыть текстовый файл,

// вывести его содержимое в текстовое поле

void OpenToolStripMenuItemClick(object sender, EventArgs e)

openFileDialog1.Filter = "text files (*.txt)|*.txt";

StreamReader r = File.OpenText(name_file);

while((s = r.ReadLine()) != null)

// Текст из элемента textBox1 сохранить в файле,

// имя которого задаётся в окне диалога

void SaveToolStripMenuItemClick(object sender, EventArgs e)

saveFileDialog1.Filter = "text files (*.txt)|*.txt";

StreamWriter w = File.CreateText(name_file);

// Выход из программы

void ExitToolStripMenuItemClick(object sender, EventArgs e)

Пояснения к данному тексту.

Имя файла name_file сделано полем класса MainForm на всякий случай: возможно, в более сложном варианте программы понадобится сохранять имя открываемого файла между вызовами обработчиков событий. Здесь это пока не требуется.

При выборе меню Открыть выполняется обработчик событий OpenToolStripMenuItemClick . В начале текста этого метода мы определяем, с какими типами файлов будем работать. Сделать это можно с помощью своеобразного фильтра — свойства Filter для объекта saveFileDialog1 :

saveFileDialog1.Filter = "text files (*.txt)|*.txt";

Свойство Filter представляет собой строку символов, которая состоит из двух частей, разделённых символом | (вертикальная черта). В первой части даётся пояснение о том, какие файлы требуются для отбора (у нас это файлы txt ( " text files (*.txt)" ), а во второй части записывается сам шаблон для отбора, который уже будет обрабатываться в программе (здесь это "*.txt" , т. е. любые файлы с расширением txt ).

Возможно задание не одного шаблона по выбору файлов, а нескольких. В этом случае в окне диалога программы будут показаны те файлы, которые подойдут под эти шаблоны.

Сделать такой шаблон несложно, вот пример:

openFileDialog1.Filter = "Все файлы (*.*)|*.*|text files (*.txt)|*.txt|CSarp files (*.cs)|*.cs";

Здесь свойство SupportMultiDottedExtensions означает возможность поддержки нескольких шаблонов выбора. Если оно истинно, то поддержка есть, если ложно — то нет. По умолчанию это свойство имеет значение false ( Надо заметить, что хотя это свойство и имеется, и может изменять своё значение, но и без него создаётся фильтр с несколькими шаблонами . Почему? Пока непонятно. Надо разбираться. Возможно, это глюк от MS. Возможно, это свойство устаревшее. Или его работа зависит от версии Framework).

Новый вид строки фильтра в нашем примере позволяет иметь три варианта шаблонов. Для каждого варианта задаётся пояснение и шаблон, разделённые символом | (вертикальная черта), а сами варианты также разделяются этим символом.

Если фильтр не задавать вообще, то в окне диалога будут показаны все файлы.

После того, как определились с типами открываемых файлов, записываем оператор

Здесь в условии оператора if делается проверка факта: выбрал пользователь файл, подходящий под наш фильтр, или нет. Если « Да », т. е. он выбрал файл и нажал на кнопку « Открыть » в окне диалога, то выполняются действия, записанные в блоке ветви « Да » оператора if . Главное — это получить имя выбранного файла:

Теперь необходимо организовать чтение из выбранного файла. Создаём объект r типа StreamReader , предназначенный для чтения из файла текстовых строк:

StreamReader r = File.OpenText(name_file);

а далее в цикле читаем текст построчно из выбранного файла. Делается это в цикле тем же методом ReadLine() , что ранее мы использовали для ввода данных с консоли. Прочитанные строки добавляем в конец временной переменной — строки t :

while((s = r.ReadLine()) != null)

«Добавка» "\r\n" нужна для того, чтобы обеспечить в последующем переход на новую строку в текстовом поле.

После завершения чтения из файла полученную информацию выводим в текстовом поле и закрываем файл:

При выборе меню Сохранить как выполняется обработчик событий SaveToolStripMenuItemClick . В этом методе всё делается аналогично тому, что мы только-что рассмотрели при открытии файла. Различие заключается только в том, что файл, имя которого было задано в окне диалога, открывается для записи текста, а затем собственно записываем информацию в файл:

StreamWriter w = File.CreateText(name_file);

Класс FontDialog

Данный класс предназначен для изменения шрифта текста. Использовать класс предельно просто:

размещаем на форме компонент FontDialog . По-умолчанию он получит имя fontDialog1 ;

в меню добавим ещё один пункт ( Font );

напишем для него обработчик событий.

Вот текст обработчика событий:

// Изменение шрифта текста в диалоговом окне класса FontDialog

void FontToolStripMenuItemClick(object sender, EventArgs e)

Схема обработчика — стандартная. Если пользователь внёс какие-то изменения для шрифта и нажал кнопку « OK » для их подтверждения, то изменённый шрифт тут же можно использовать:

После завершения работы данного обработчика шрифт текста в текстовом поле textBox1 изменится на заданный в окне диалога.

Класс ColorDialog

Этот класс предназначен для изменения цвета. Применение также предельно простое:

размещаем на форме компонент ColorDialog . По-умолчанию он получит имя colorDialog1 ;

в меню добавим ещё один пункт ( Color );

напишем для него обработчик событий.

Вот текст обработчика событий:

// Изменение цвета шрифта текста в диалоговом окне класса ColorDialog

void ColorToolStripMenuItemClick(object sender, EventArgs e)

Можно изменять цвет символов в текстовом поле, как это сделано в данном примере: свойство ForeColor — это цвет символов в текстовом поле textBox1 . А можно было поменять цвет фона для textBox1 :

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *