В начало
Статьи
Библиотека
Разное

Вот здесь - новый сайт, заходите немедленно!

kift - Коллекция Интересных Фактов и Теорий

А тут можно поболтать и побухтеть, милости просим:

kift - неизданное

Самоучитель Visual Basic

12.  Создание формы для вывода справки
13. Добавление окон-заметок. Наборы и циклы
14. Циклы VB
15. Основы отладки программ. Пользовательская процедура

11. «Сборка» проекта.

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

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

  • Но наша задача – объединить формы-заготовки в некое целое. Это можно сделать по-разному, например, добавить еще одну форму, поместить на нее кнопки, которые будут вызывать наши формы. Но это непрофессионально. Гораздо лучше использовать так называемый мультидокументный интерфейс.

Мультидокументный интерфейс (MDI – MultiDocumental Interface) – способ построения программы, когда в главном окне программы появляются окошки документов, так называемые дочерние окна.

  • Типичная программа с MDI структурой – сам VB.

  • Кроме MDI структуры существует SDI структура программ (SDI – SingleDocumental Interface – однодокументный интерфейс), когда программа работает лишь с одним документом одновременно. Созданные нами формы –  уже практически готовые типичные SDI приложения.

Для создания MDI-приложения следует:

  • создать так называемую MDI-форму,

  • создать и добавить к ней дочерние формы,

  • добавить код для взаимодействия MDI и дочерних форм.

Преобразуем наше приложение в MDI.

  • Приготовьтесь к работе.

  • Выполните команду меню ProjectAdd MDI Form.

  • В появившемся окошке нажмите кнопку «Открыть».

Обратите внимание – в окне Project Explorer появился необычный значок с подписью MDIForm1.

Откройте вновь меню Project.

Как видите, пункт Add MDI Form недоступен. В проекте может быть только одна форма мультидокументного интерфейса.

Измените имя добавленной формы с MDIForm1 на mfrmOrganizer.

  • Измените заголовок с MDIForm1 на « Органайзер» (без кавычек).

  • Сразу можете изменить свойство Icon, присвоив форме какой-нибудь особенный значок.

  • Назначьте форму mfrmOrganizer стартовым объектом проекта (вспомните, как мы это делали раньше при создании формы frmPhoneBook).

Теперь, в общем случае, требуется,

  • во-первых, сделать созданные нами формы дочерними формами, то есть, чтобы они появлялись в MDI-форме как ее порождения, зависели от нее и управлялись ею,

  • а, во-вторых, создать механизм управления дочерними формами.

Первая задача – сделать формы дочерними – решается очень просто.

  • Откройте окно визуального редактирования формы frmPhoneBook.

  • Убедитесь, что фокус находится на форме, а не на контролах.

  • В окне Properties измените свойство MDIChild (MDIДочерняя) с False на True (с Ложного на Истинный).

  • Сделайте то же самое для формы frmDiary.

Теперь эти формы будут вести себя как подчиненные MDI-форме.

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

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

Создание меню производится с помощью редактора меню:

  • Перейдите в окно визуального редактирования формы mfrmOrganizer.

  • Выполните команду меню ToolsMenu Editor... (ИнструментыРедактор Меню).

Появится окно редактора меню:

   
  • В строку Caption введите надпись на будущем пункте меню: « &Файл» (без кавычек).

  • В строку Name введите имя пункта меню, которым будет оперировать код программы: mnuFile.

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

   
  • Щелкните кнопку Next (Следующий).

  • Введите еще три пункта меню, с заголовком « &Вид» и именем mnuView, « &Окна» - mnuWindows, « &Справка» - mnuHelp, каждый раз нажимая Next для создания нового пункта.

  • Щелкните OK.

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

   

Из рисунка понятно, зачем в заголовки пунктов меню мы включали символ « &» (амперсанд).

  • К пункту меню вы можете обратиться путем нажатия клавиши [Alt], и, одновременно – клавиши с подчеркнутой буквой, например, открыть пункт « Файл» можно нажатием [Alt] + [Ф].

  • То есть, клавиша «Ф» - горячая клавиша для этого пункта.

Внимание! При проектировании меню следите, чтобы горячие клавиши не дублировались, иначе результат вы не угадаете. Например, можно назначить: « Файл» и « Окна» (одинаковые клавиши « А»). Как будет себя вести программа при нажатии [Alt] + [А] – неизвестно. Не делайте так!

Но оставить так, как есть – признак непрофессионализма. Так тоже не делайте! В нормальных программах для Windows обязательно бывает хотя бы один уровень подменю, которое открывается при выборе пункта главного меню.

Создадим пункты подменю.

  • Вновь откройте редактор меню.

  • Перейдите (в нижнем окне) на пункт « &Вид».

  • Щелкните Insert (Вставить).

Над выбранным пунктом появится место для нового пункта меню.

  • Внесите заголовок « В&ыход» и имя mnuExit.

  • Один раз щелкните на кнопке с изображением стрелки влево (в окне редактора, не надо нажимать кнопку на клавиатуре!).

Созданный пункт меню «сдвинется» влево:

   
  • Щелкните OK.

  • А теперь один раз щелкните на пункте « Ф айл» в окне визуального редактирования.

Вот что вы увидите:

   

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

  • Если вы собираетесь делать большее количество уровней подменю – скорее всего, вам следует серьезно пересмотреть структуру меню.

Теперь создадим другие подменю.

  • Откройте редактор меню.

  • Перейдите на пункт « &Окна».

  • Щелкните Insert.

  • Введите заголовок пункта меню « &Телефоны...» и имя mnuPhoneBook.

  • Щелкните «стрелку влево».

  • Точно так же введите пункты: заголовок « &Дневник...» – имя mnuDiary, заголовок « -» (знак минуса) – имя mnuSep1, заголовок « &Калькулятор...» - имя mnuCalc.

Окно редактора должно выглядеть так:

   
  • Щелкните OK.

  • Проверьте, как выглядит меню формы:
   

Как видите, знак минуса в заголовке превратился в горизонтальный разделитель. Его назначение – чисто косметическое, но имя ему назначать надо. Пункты с «троеточием» используются для вызова каких-то окон программы, пункты без «троеточия» (как, например, пункт « Выход» в меню « Файл») предназначены для непосредственного выполнения какой-то команды.

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

Теперь построим подменю « Окна» и « Справка».

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

  • В подменю «Окна» самостоятельно внесите подпункты:

Заголовок

Имя

К&аскадом

mnuCascade

&Горизонтально

mnuHoriz

В&ертикально

mnuVert

  • После этого в окне редактора меню перейдите на пункт « Окна» и установите флажок WindowList(Список Окон).

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

   

Форма приобретет подменю:

   

В меню « Справка» добавьте два подпункта: заголовок « С&правочная информация...» - имя mnuHelpText, и подпункт с заголовком « О программе...» и именем mnuAbout.

Вот так это будет выглядеть:

   

Внимание! Не забывайте «сдвигать» подпункты с помощью стрелки влево.

Сейчас ознакомимся с другими возможностями редактора меню.

  • Поэкспериментируйте с флажками Checked (Отмечено), Enabled (Дозволено), Visible (Видимо) редактора меню, устанавливая или сбрасывая флажки по очереди, запуская каждый раз программу и проверяя внешний вид измененных пунктов меню.

  • Верните все к первоначальному виду.

Поле с надписью Index позволяет создавать массивы пунктов меню. Реальная ситуация: в вашем меню не один десяток пунктов и множество разделителей, которые функциональности не имеют, а засоряют левый список в окне редактирования кода формы. Присваивайте всем разделителям, если их много, имя mnuSep, но позаботьтесь о назначении каждому уникального индекса (от 0 и далее).

  • Флажок Checked устанавливает или сбрасывает свойство Checked выбранного пункта меню. Если флажок установлен (свойство = True), то пункт меню будет отмечен «птичкой».

  • Флажок Enabled (и одноименное свойство) отвечает за то, доступен ли этот пункт меню. Если свойство = False, то пункт меню написан «серым» цветом и выбрать его нельзя.

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

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

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

В чем разница между списком Shortcut и подчеркиванием букв в надписях пунктов? Например, чтобы выполнить команду меню Ф айлВыход в нашей программе путем выбора подчеркнутых букв, следует нажать [Alt] + [Ф] (русскую), при этом откроется подменю « Файл», затем нажать [Ы]. Если команда находится в подменю 3-го – 4-го уровней, нажатий клавиш будет гораздо больше. Если же мы назначим клавиши- Shortcut для команды « Выход», к примеру, [Ctrl]+[Q], то выполнение команды будет вызвано нажатием этого сочетания клавиш независимо от того, в подменю какого уровня находится команда.

Назначьте пунктам клавиши- Shortcut:

Пункт

Shortcut

Выход

Ctrl + Q

Телефоны…

Ctrl + P

Дневник…

Ctrl + D

Калькулятор…

Ctrl + C

Справочная информация...

F1

О программе…

Ctrl + F1

Всегда старайтесь проектировать меню, более-менее соответствующее стандарту, неофициально принятому в Windows. Как образец берите MS Word, Excel и другие распространенные программы. Стремитесь, чтобы общепринятые команды, такие, как « Создать», « Открыть» и т.п. имели такие же подчеркнутые буквы и такие же Shortcut, как и в «классических» программах.

Меню нами создано. Теперь, чтобы оно работало, следует добавить в него код.

  • Перейдите в окно редактирования кода формы mfrmOrganizer.

  • В левом списке выберите контрол mnuExit (как помните, это меню с надписью « Выход»).

В окне кода появится заготовка обработчика события mnuExit_Click.

  • Внесите строку кода:

Unload Me

  • Готово, теперь добавьте комментарий.

Добавим код для вызова формы frmPhoneBook.

  • В списке объектов окна редактирования кода выберите объект mnuPhoneBook.

  • В созданный обработчик события Click добавьте строку:

frmPhoneBook.Show

Метод Show(Показать) заставляет программу «показать» указанный объект.

  • Если программа при этом впервые за время своей работы обращается к этому объекту, он будет загружен (и в нем произойдут событие Load и другие события, связанные с созданием этого объекта).

  • Почему мы не использовали другой метод, Load (Загрузить)? А потому, что тогда при каждом выборе этого пункта меню заново будет загружаться указанная форма. Это может привести к ошибкам (и обязательно приведет).

Самостоятельно добавьте код для пункта меню « Дневник...».

Запустите программу.

  • Выберите пункт меню « Телефоны...».

  • Выберите пункт меню « Дневник...»

  • Разместите дочерние окна так, чтобы окно « Дневник» накладывалось на окно « Телефонная книжка».

  • Снова выберите пункт « Телефоны...».

Как видите, порядок расположения окон не изменился.

Было бы лучше, если бы выбор пункта меню приводил к перемещению окна на передний план, даже если окно уже загружено и работает. Сделать это несложно:

Остановите программу и в обработчиках событий пунктов меню « Телефоны...» и « Дневник...» замените метод Show на метод ZOrder, например:

Private Sub mnuPhoneBook_Click()
	frmPhoneBook.ZOrder
End Sub

Метод ZOrder без параметров (или с параметром 0) приводит к перемещению окна на передний план. Параметр 1 (ZOrder 1) приведет к противоположному эффекту.

Испытайте программу.

Пока пропустим пункт меню « Калькулятор...» и займемся меню « Окна».

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

Перейдите в обработчик пункта меню mnuHoriz_Click.

Внесите в него строку:

Me.Arrange vbTileHorizontal

Метод Arrange (Расположить) как раз и занимается позиционированием дочерних окон. Он имеет параметры: vbCascade (Каскад) – располагает окна «каскадом», vbTileHorizontal (ЧерепицаГоризонтальная) – располагает окна по горизонтали, vbTileVertical (ЧерепицаВертикальная) – располагает окна по-вертикали, vbArrangeIcons (РасположитьЗначки) – упорядочивает свернутые пользователем дочерние окна.

Самостоятельно создайте обработчики событий для меню mnuVert и mnuCascade.

Запустите программу, вызовите дочерние окна и поэкспериментируйте с расположением окон.

Теперь добавим пункт mnuAbout.

  • Перейдите в обработчик события mnuAbout_Click.

  • Внесите строку:

frmAbout.Show vbModal

Необязательный параметр метода Show - vbModal заставляет программу не воспринимать никакие воздействия до тех пор, пока вызванное окно не будет закрыто.

Запустите программу.

  • Выберите пункт меню « О программе...».

  • Попробуйте совершить какие- то действия с программой, не закрывая окна « О программе».

  • Закройте окно « О Программе» и повторите попытки.

Теперь добавим к программе калькулятор.

  • Создавать калькулятор «с нуля» довольно сложно, а нам и не нужно – в составе Windows он уже есть. Задача в том, чтобы вызвать его из нашей программы, а не искать по всем каталогам…

  • Для этого следует использовать функцию языка Shell.

Перейдите в обработчик события mnuCalc_Click.

  • Внесите в него строку:

Shell “Calc.exe”

Команда Shel l (Оболочка) заставляет программу запустить другую программу, имя (и путь) которой указывается как параметр.

Испытайте программу.

Остался один незадействованный пункт – справка.

Создание полноценной справочной системы – длительный и довольно сложный процесс, выходящий за рамки нашего курса. Мы сделаем проще.

Откройте стандартный «Блокнот» Windows.

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

  • Сохраните этот текст в каталоге C:\VB Begin (т.е. в вашем рабочем каталоге) под именем Help.txt

Перейдите в обработчик события mnuHelpText_Click.

Внесите в него строку:

Shell "Notepad.exe " & App.Path & "\Help.txt", _
	vbNormalFocus
‘Notepad.exe – стандартный Блокнот Windows.

Здесь Вы видите объект App (от Application – Приложение). Он представляет собою Ваше приложение. Свойство Path (Путь) возвращает путь к приложению.

  • Можно было бы написать иначе:

Shell “Notepad.exe c:\VB Begin\Help.txt”

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

  • Второй параметр процедуры ShellvbNormalFocus (Нормальный [размер окна] с Фокусом) – способ отображения окна запускаемого приложения.

Запустите Вашу программу, выполните команду меню СправкаСправочная информация...

Как видите, открылся Блокнот с вашим файлом справки.

Для такой программки, как наша, этот способ вполне приемлем, а позже мы сделаем по-другому…

Проверьте код формы mfrmOrganizer, он должен выглядеть примерно так:

Option Explicit

Private Sub mnuAbout_Click()
	frmAbout.Show vbModal
End Sub

 

Private Sub mnuCalc_Click()
	Shell "Calc.exe"
End Sub

 

Private Sub mnuCascade_Click()
	Me.Arrange vbCascade
End Sub

 

Private Sub mnuDiary_Click()
	frmDiary.ZOrder
End Sub

 

Private Sub mnuExit_Click()
	Unload Me
End Sub

 

Private Sub mnuHelpText_Click()
	Shell "Notepad.exe " & App.Path & "\Help.txt", vbNormalFocus
End Sub

 

Private Sub mnuHoriz_Click()
	Me.Arrange vbTileHorizontal
End Sub

 

Private Sub mnuPhoneBook_Click()
	frmPhoneBook.ZOrder
End Sub

 

Private Sub mnuVert_Click()
	Me.Arrange vbTileVertical
End Sub

Итак, вы создали вполне полноценное меню и научились управлять им.

К сожалению, VB не позволяет прибавлять к меню значки (как, например, в самом VB или в Word) – вернее, это можно сделать, но необходимые знания выходят далеко за пределы нашего вводного курса.

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

Давайте попробуем:

  • Откройте окно визуального редактирования формы frmDiary.

  • Вызовите редактор меню.

  • Внесите заголовок меню « Пример» и имя mnuExample.

  • Нажмите OK.

  • Теперь запустите программу и на главной MDI-форме выберите пункт меню « Дневник...».

Как видите, меню главной формы заменяется единственным пунктом « Пример».

  • Теперь закройте форму дневника.

Меню восстановилось.

  • Остановите программу. Вновь откройте редактор меню для формы frmDiary и удалите меню.

Эта особенность поведения меню в MDI-программах обща для всех Windows-приложений, и ее необходимо учитывать и соответственно проектировать меню.

Вопросы

  1. Дайте определение MDI и SDI программам, опишите их структуру и принципы построения.

  2. Дайте определение меню. Какое инструментальное средство предназначено для создания меню? Какие свойства и события есть у меню? А какие методы?

  3. Для чего применяется метод Show? Чем он отличается от метода Load? ZOrder?

  4. Опишите команду Shell.

  5. Что представляет собою объект App? Для чего мы применили его свойство Path?

Задания

  1. Добавьте комментарии к созданному Вами коду.

  2. Конспект!

Созданное только что меню Созданный пункт подменю Созданное только что подменю Установите этот флажок
Hosted by uCoz