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

лабы / gorev_akhajan_makakshiripov_ehffektivnaja_rabota_s_subd

.pdf
Скачиваний:
52
Добавлен:
26.04.2015
Размер:
3.17 Mб
Скачать

Рис. 9.12. Форма "Характеристика модели автомобиля" в Конструкторе формы

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

Изменять порядок следования полей можно двумя способами: интерактивно (Interactive) и с помощью списка (By List). Требуемый метод выбирается во вкладке Forms в раскрывающемся списке Tab Ordering диалогового окна Options (см. рис. 9.5).

Если установлен метод интерактивного изменения порядка активизации полей в форме, то при выборе команды Tab Order из меню View главного меню Visual FoxPro в верхнем левом углу каждого объекта появится его порядковый номер (рис. 9.13).

Рис. 9.13. Интерактивный метод изменения порядка активизации объектов в форме

Ⱦɚɧɧɚɹ ɜɟɪɫɢɹ ɤɧɢɝɢ ɜɵɩɭɳɟɧɚ ɷɥɟɤɬɪɨɧɧɵɦ ɢɡɞɚɬɟɥɶɫɬɜɨɦ %RRNV VKRS Ɋɚɫɩɪɨɫɬɪɚɧɟɧɢɟ ɩɪɨɞɚɠɚ ɩɟɪɟɡɚɩɢɫɶ ɞɚɧɧɨɣ ɤɧɢɝɢ ɢɥɢ ɟɟ ɱɚɫɬɟɣ ɁȺɉɊȿɓȿɇɕ Ɉ ɜɫɟɯ ɧɚɪɭɲɟɧɢɹɯ ɩɪɨɫɶɛɚ ɫɨɨɛɳɚɬɶ ɩɨ ɚɞɪɟɫɭ piracy@books-shop.com

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

Более быстрый метод состоит в нажатии на первый объект в последовательности без нажатия на клавишу Shift. При этом объекту присваивается номер один, а все остальные номера исчезают. Затем, нажимая Shift, обойдите все остальные объекты в нужном порядке. Когда все сделано, нажмите кнопку Reorder.

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

Рис. 9.14.

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

Как видно из рис. 9.14, напротив каждого объекта находится маленькая пиктограмма, служащая для облегчения определения типа объекта. Кроме того, кнопки By Row и By Column позволяют быстро автоматически определить требуемый порядок, хотя на сложных формах их применение может и не дать желаемого результата. Добившись нужного порядка активизации объектов, нажмите кнопку OK.

В этой форме мы допустили возможность транспортировки данных в Microsoft Word и Microsoft Excel (с построением диаграммы). Как мы это сделали, будет рассказано в следующей главе.

Описанные в данной главе формы используются в примере SAMPLE.EXE, поставляемом на дискете.

Создание формы "Прием заказов" на Access

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

Так же как в Visual FoxPro, основным инструментом для проектирования формы в Access является Конструктор формы, показанный на рис. 9.15. Для создания новой формы с помощью Конструктора формы в контейнере БД активизируйте вкладку Форма и нажмите кнопку Создать. В появившемся диалоговом окне Новая форма выберите в списке пункт Конструктор.

www.books-shop.com

Рис. 9.15. Конструктор формы в Access 7.0

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

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

ссылки на эту базу данных - и из других баз данных.

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

Public mywksp As Workspace Public mywksp1 As Workspace

'Создание переменных наборов данных

Public rstOrd As Recordset Public rstcust As Recordset Public rstAc As Recordset

Объекты типа Workspace необходимы нам для начала, завершения и отката транзакций. Объекты типа Recordset будут использоваться для работы с необходимыми нам данными, так как в некоторых случаях нам придется использовать формы, которые не имеют источника данных и соответственно не могут иметь связанных с какими-либо полями элементов управления. Например, форма "Прием заказов" не имеет источника данных.

Прием заказа начинается с нажатия на кнопку с соответствующим названием - "Прием заказа". После этого выполняется следующий код:

Private Sub Кнопка1_Click()

'Это строка условия поиска продавца в таблице Salesman Dim strSearch As String

'Инициализируем переменную рабочего пространства

Set mywksp = DBEngine.Workspaces(0)

' Инициализируем переменную набора данных

Set rstOrd = mywksp.Databases(0).OpenRecordset("order_", _ dbOpenDynaset) 'начинаем транзакцию

mywksp.BeginTrans

'Строка для поиска кода продавца создается из названия поля ' Last_name и login текущего пользователя приложения

strSearch = "Last_name=" & Chr(34) &_ mywksp.UserName & Chr(34) 'Добавляем запись

rstOrd.AddNew

www.books-shop.com

'Идентификатор продавца заносится в новую добавленную запись rstOrd!key_salman = DLookup("key_salman",_"salesman", strSearch) rstOrd.UPDATE

Me!cmbCust.Enabled = True

Me!txtFam.Enabled = True End Sub

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

strSearch = "Last_name=" & Chr(34) & mywksp.UserName &_ Chr(34) 'Добавляем запись

rstOrd.AddNew

'Идентификатор продавца заносится в новую 'добавленную запись

rstOrd!key_salman = DLookup("key_salman",_ "salesman", strSearch)

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

Private Sub cmbNcl_Click()

Set mywksp1 = DBEngine.Workspaces(0)

Set rstcust = mywksp1.Databases(0).OpenRecordset("customer", _ dbOpenDynaset) mywksp1.BeginTrans

DoCmd.OpenForm "Клиенты", acNormal, , , acAdd End Sub

Эта транзакция завершится уже в форме "Клиенты". При этом, несмотря на все прекрасные перспективы дальнейшего использования данных о клиенте, существует возможность отката и в этом случае, например, если клиент вдруг неожиданно скроется, не успев назвать свой адрес и факс. Без них он для вас неинтересен.

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

LostFocus (Потеря фокуса):

Private Sub txtFam_LostFocus()

If Len(Trim(txtFam)) >> 0 Then Me!cmbCust.RowSource = "SELECT DISTINCTROW _ customer.key_customer,customer.name_customer,_

customer.address, customer.tel FROM customer Where _ customer.name_customer like " & Chr(34) & Trim(txtFam) &_

"*" & _ Chr(34) & ";"

Else

Me!cmbCust.RowSource = "SELECT DISTINCTROW _ customer.key_customer,customer.name_customer, _ customer.address, customer.tel FROM customer ;"

End If End Sub

В данном коде используется свойство комбинированного списка - динамически изменять содержимое списка значений, другими словами, возможность использовать свойство RowSource

www.books-shop.com

для чтения и записи.

Выбрав клиента, необходимо выбрать и автомобиль для него. Для этого предназначена форма "Наличие автомобилей, дата выпуска, цена", которая вызывается с помощью кнопки "Выбор автомобиля". Используется метод OpenForm объекта DoCmd:

Private Sub cmbCAuto_Click() DoCmd.OpenForm _

"Наличие автомобилей, дата выпуска, цена", acNormal End Sub

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

Private Sub name_model_AfterUpdate() If Len(Trim(name_model)) >> 0 Then

Me.FilterOn = False

Me.Filter = "name_model=" & Chr(39) _ & Me!name_model & Chr(39) & _

"and name_firm=" & Chr(39) & Me!name_firm & Chr(39) Me.FilterOn = True

End If End Sub

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

Private Sub Кнопка9_Click() DoCmd.OpenForm "Подробно о модели", _

acNormal, , "[Name_model]=" & Chr(39) & _ Me![name_model] & Chr(39), acReadOnly End Sub

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

Private Sub Кнопка8_Click() Dim FStr As String

FStr = "name_customer=" & Chr(39) &_ Forms![Прием заказов].cmbCust & Chr(39) Set rstAc = mywksp.Databases(0).OpenRecordset("account", _ dbOpenDynaset) rstAc.AddNew

rstAc!key_customer = DLookup("key_customer", _ "customer", FStr) rstAc!key_auto = Me!key_auto

rstAc!date_write = Now() rstAc.UPDATE

Forms![Прием заказов].cmbAc.Enabled = True

DoCmd.Close acForm, "Наличие автомобилей,_дата выпуска, цена" End Sub

После возврата в форму "Прием заказов" вы принимаете окончательное решение о продаже автомобиля. Пользователь имеет последнюю возможность отказаться. После нажатия на кнопку "Оформление счета" транзакция завершается.

mywksp.CommitTrans

rstOrd.Close

rstAc.Close

www.books-shop.com

mywksp.Close Me![Кнопка1].Enabled = True DoCmd.OpenTable "account"

DoCmd.GoToRecord acTable, "account", acLast

Обратите внимание на то, что объекты rstOrd, rstAc и mywksp закрываются с помощью имеющегося у них метода Close. Если их не закрывать, то при нескольких повторных использованиях формы "Прием заказов" появится сообщение, что Access больше не может открыть таблицу.

Если покупатель все-таки решил не покупать автомобиль, то используйте кнопку "Отказ от заказа". При этом произойдет откат транзакции, и ни в одну из таблиц новые данные внесены не будут. Правда, есть один момент: если вы используете поле типа счетчик, то внутри базы данных его номер прирастет, поэтому при следующей попытке добавить запись, его значение будет больше на значение приращения.

Private Sub cmbRback_Click() mywksp.Rollback rstOrd.Close

rstAc.Close

mywksp.Close Me![Кнопка1].Enabled = True Me!cmbCust.Enabled = False Me!txtFam.Enabled = False Me!cmbAc.Enabled = False

End Sub

9.3. Разработка управляющего меню

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

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

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

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

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

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

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

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

Разработка меню в Visual FoxPro

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

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

www.books-shop.com

Visual FoxPro. После того как мы опишем с его помощью меню, необходимо сгенерировать программу. Файл с этой программой будет иметь расширение MPR, а файл после компиляции - MPX. Этот файл и следует запускать для работы с созданным меню. Недаром раньше такой инструмент программиста так и назывался - Генератор. Для генерации программы в меню Menu необходимо выбрать команду Generate.

Рис. 9.16. Конструктор меню в Visual FoxPro

Если в вашу задачу входит настройка главного меню Visual FoxPro, то самое подходящее в этом случае решение - в меню Menu выбрать команду Quick Menu. После этого в Конструкторе меню в качестве заготовки мы получаем копию существующего меню Visual FoxPro, с которым можем проделывать любые изменения, включая удаление каких-либо меню и команд, добавление новых и т. д. Не стоит слишком усердствовать с удалением, помните, что, изымая какую-либо команду из меню, вы теряете предусмотренную наличием этой команды функциональность. Например, удалив меню Edit, вы не сможете использовать стандартные возможности переноса, копирования и поиска при работе с текстом. В соответствии со сложившимися правилами включать свои собственные меню в главное меню следует перед меню Help, которое должно оставаться последним.

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

Запишем заголовки пользовательского меню в столбце Prompt. Если после выбора меню на экране должен появиться список команд, выберем в столбце Result пункт Submenu и щелкнем на появившейся справа кнопке Create. Мы окажемся на следующем уровне меню, где запишем заголовки команд, входящих в это подменю. Если структура нашего меню предусматривает еще один уровень вложения, повторите указанные действия. Для перехода с уровня подменю на верхний уровень необходимо выбрать его из комбинированного списка Menu Level. Если вы хотите выделить группы команд, поместите в столбце Prompt в строке, разделяющей группы команд меню, знаки \-. Вы всегда можете проверить, как визуально будет выглядеть ваше меню на экране, нажав клавишу Preview.

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

www.books-shop.com

Наиболее часто выполняемым командам в меню можно присвоить клавиатурные комбинации. Для этого напротив соответствующего заголовка необходимо щелкнуть мышкой на кнопке в колонке Options. На экране появится диалоговое окно Prompt Options, с помощью которого для меню можно задать дополнительные условия. Внешний вид этого окна с необходимыми комментариями приведен на рис. 9.17. Щелкнем на поле проверки Shortcut, появится диалоговое окно Key Definition. Нажмем нужное сочетание клавиш. Их обозначение появится в поле Key Label. Символы в поле Key Text будут написаны рядом с командой меню, их можно отредактировать. Командам меню принято присваивать клавиатурные комбинации, начинающиеся с клавиши Ctrl. В клавиатурных комбинациях Visual FoxPro использует скан-код клавиши, поэтому не имеет значения текущий регистр и не важно, включена ли русская или латинская раскладка клавиатуры. Если вы используете знаки \<< для меню верхнего уровня, Visual FoxPro автоматически поместит в поле Key Label сочетание клавиш Alt и выделенной этими знаками буквы. Если буква русская, при запуске меню произойдет ошибка. Поэтому надо открыть окно Key Definition и вручную в поле Key Label исправить русскую букву на соответствующую той же клавише латинскую.

Рис. 9.17.

Вы можете регулировать доступ к тем или иным командам меню с помощью поля проверки Skip For, находящегося в диалоговом окне Prompt Options. Если вы щелкнете на этом поле, появится уже знакомое вам окно Построителя выражения, в котором можно сформировать условие доступа к этой команде меню. Если условие будет равно .F., команда будет доступна, если .T. - недоступна. Наиболее часто эта возможность используется для регулирования доступа различных пользователей прикладной программы к тем или иным ее функциям.

Всвязи с тем, что Visual FoxPro поддерживает редактирование на месте OLE-объектов, с помощью поля проверки Negotiate мы можем для меню верхнего уровня указать, где меню будет располагаться после активизации OLE-сервера. По умолчанию действует установка None - меню убирается при редактировании OLE-объекта.

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

Вокне Prompt Options осталось еще одно поле проверки - Pad Name, о котором можно было бы ничего и не говорить, если бы мы не использовали русские заголовки для меню. При проектировании меню Конструктор автоматически присваивает имена меню на основании их заголовков. В то же время Visual FoxPro, как и его предшественники, на дух не переносит русских названий в меню. Не будем раздражаться по столь мелкому поводу, щелкнем на поле проверки Pad Name и изменим русское название на латинское.

Для выполнения каких-либо действий при выборе пользователем команд меню необходимо в колонке Result для каждой команды меню назначить команду Visual FoxPro, функцию или процедуру. Для назначения команды Visual FoxPro в столбце Result выберите пункт Command и наберите соответствующую команду в текстовом поле справа. Например, DO Log_user. Если указанная в этой команде процедура находится в блоке Cleanup Конструктора меню (о нем мы расскажем чуть позднее), то команду следует записать в виде: DO Log_user IN Main, где Main -

www.books-shop.com

это имя файла меню.

Для задания при выборе команды меню выполнения какой-либо процедуры, в случае, когда меню не имеет подменю, необходимо в колонке Result выбрать пункт Procedure. Щелкнуть на кнопке Create и в появившемся окне поместить необходимый код.

В ряде случаев с помощью команд меню могут выполняться какие-то сходные для всех команд этого меню действия, не требующие написания большого объема кода. В этом случае мы можем задать при выборе команды меню выполнение одной процедуры для меню, имеющего подменю. Для этого все команды меню должны в колонке Result иметь пункт Bar#, который не предусматривает привязки к команде какого-то действия. В списке Menu Level выберем соответствующий уровень меню. Из меню View Visual FoxPro выберем команду Menu Options, после чего на экране появится одноименное диалоговое окно. Нажмем кнопку Edit и наберем код в соответствии с приведенным ниже шаблоном:

<<Код, выполняемый при выборе любой из команд>> DO CASE

CASE BAR() = 1

<<Код, выполняемый для первой команды в меню>> CASE BAR() = 2

<< Код, выполняемый для второй команды в меню>>

...

ENDCASE

Функция BAR() возвращает номер выбранной команды меню. Вы можете при необходимости присвоить свои номера командам меню, использовав поле справа от колонки Result.

Общие установки для системы меню можно выполнить, выбрав из меню View Visual FoxPro команду General Options. После появления диалогового окна с таким же названием, приведенного на рис. 9.18, можно написать программный код, который будет выполняться перед расположением меню на экране, выбрав поле проверки Setup. Процедуры, которые вы используете для выполнения команд меню, и действия, которые необходимо выполнить после исчезновения меню с экрана, можно записать, выбрав поле проверки Cleanup. С помощью группы кнопок выбора Location можно задать условия расположения меню после его запуска:

Рис. 9.18.

Кнопка Replace - заменяет существующую систему меню.

Кнопка Append - добавляет данное меню к существующей системе.

Кнопка Before - располагает меню перед указанным в появляющемся справа списке меню.

Кнопка After - располагает меню после указанного в появляющемся справа списке меню.

www.books-shop.com

После запуска пользовательского меню вернуться к главному меню Visual FoxPro можно с помощью команды SET SYSMENU TO DEFAULT.

Если ваша пользовательская программа будет работать в виде самостоятельного модуля (EXEфайл) и вы планируете использовать меню в качестве главной программы вашего приложения, разместите команду READ EVENTS в блоке процедур Cleanup, а для команды меню, обеспечивающей прекращение работы приложения, задайте команду CLEAR EVENTS.

Разработка меню в Access

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

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

Рис. 9.19.

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

www.books-shop.com

Соседние файлы в папке лабы