Создание диалоговых окон в VBA — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Создание диалоговых окон в VBA

2021-06-30 35
Создание диалоговых окон в VBA 0.00 из 5.00 0 оценок
Заказать работу

Диалоговое окно создается в редакторе VBA в виде формы по команде Insert - UserForm. Возникает пустая форма, ограниченная маркерами. Одновременно возникают панель инструментов ToolBox (рис.8.1).


увеличить изображение
Рис. 8.1. Создание формы в редакторе VBA

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

На панели ToolBox имеются следующие элементы управления:

Кнопка   Описание
Select Object Выделение объектов Предоставляет возможность выделить объект
Label Надпись Создает надпись в диалоговом окне
TextBox Поле Позволяет вводить текст
ComboBox Раскрывающийся список Объединяет возможности поля ввода и списка
ListBox Список Предоставляет возможность выбора элемента списка
CheckBox Флажок Создает флажок
OptionButton Переключатель Позволяет выбрать один параметр из нескольких возможных
ToggleButton Переключающая кнопка Создает переключатель "Вкл/Выкл"
Frame Рамка Создает прямоугольник вокруг группы элементов управления
CommandButton Командная кнопка Создает кнопку для запуска команды
TabStrip Строка вкладок Создает вкладки
MultiPage Страницы Создает несколько страниц
ScrolBar Полоса прокрутки Создает полосу прокрутки
SpinButton Кнопка прокрутки Дает возможность указать числовое значение
Image Изображение Вставляет рисунок

Задание 8.1

Создать три одинаковых тора. Радиусы малой и большой окружностей задать в диалоговом окне. Соединить все три тора либо в конструкцию "тор в торе" либо цепочкой. Закрасить торы в три последовательных цвета.

Составим таблицу элементов управления для UserForm:

Параметр Элемент Имя элемента
Диалог UserForm  
Радиус малой окружности TextBox  
Радиус большой окружности TextBox  
Переключатель "Тор в торе" OptionButton  
Переключатель "Цепочка" OptionButton  
Переключатель "Красный" OptionButton  
Переключатель "Желтый" OptionButton  
Переключатель "Зеленый" OptionButton  
Закрытие диалога CommandButton  
Отказ от диалога CommandButton  
Надписи Label  

Разместим элементы на форме, например, так, как показано на рис.8.1. Текстовые надписи выполнены с помощью инструмента Label. Текстовые поля созданы элементом TextBox, а числовые значения вписаны в них в строке Text окна Properties. Переключатели (радиокнопки) установлены путем перетаскивания на форму элементов OptionButton. Кнопки с надписями OK и Cancel образованы элементом управления CommandButton. Имена элементам следует задавать близкие к выполняемым ими функциям.

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

Public Sub Torus()TorsForm.ShowEnd Sub

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

Вставьте модуль и скопируйте в него следующий текст:

Private Sub Cancel_Click()Unload MeEnd Sub Private Sub OK_Click() Dim clr As IntegerDim dCenter(0 To 2) As Double 'центрторовDim dY(0 To 2) As Double 'точкапо YDim dX(0 To 2) As Double ' точкапо XDim toPointY(0 To 2) As Double 'точкапо Y длясмещения Dim dRadius1      As Double           ' радиустораDim dRadius2       As Double          ' радиуструбкитораDim dAng       As Double             ' уголповоротатораDim MyTorus       As Acad3DSolid   ' торDim Layer          As AcadLayer      'слойDim MyTorus1       As Acad3DSolid   ' торDim Layer1          As AcadLayer  'слойDim MyTorus2       As Acad3DSolid   ' торDim Layer2          As AcadLayer  'слой        ' задание значений переменных: 'центрторовdCenter(0) = 0#dCenter(1) = 0#dCenter(2) = 0# 'вторая точка для задания прямой вращения для поворота тора - прямая параллельна OYdY(0) = 0#dY(1) = 10#dY(2) = 0# 'вторая точка для задания прямой вращения для поворота тора - прямая параллельна OXdX(0) = 10#dX(1) = 0#dX(2) = 0#' задание размеров тора:'угол поворота вокруг осейdAng = 3.14 / 2dRadius2 = Val(TorsForm.smallRad.Text)dRadius1 = Val(TorsForm.bigRad.Text) 'точка для перемещенияtoPointY(0) = 0#toPointY(1) = (4 * dRadius1) / 3 toPointY(2) = 0# ThisDrawing.SendCommand ("_VSCURRENT R _VIEW Top ")ThisDrawing.SendCommand ("setvar gridmode 0 ")Set MyTorus1 = ThisDrawing.ModelSpace.AddTorus(dCenter, dRadius1, dRadius2)If TorsForm.Red.Value Then clr = 1If TorsForm.Yellow.Value Then clr = 2If TorsForm.Green.Value Then clr = 3 Set MyTorus = ThisDrawing.ModelSpace.AddTorus(dCenter, dRadius1, dRadius2)Call MyTorus.Rotate3D(dCenter, dY, dAng) 'поворотвокругоси OY на 90 Set MyTorus2 = ThisDrawing.ModelSpace.AddTorus(dCenter, dRadius1, dRadius2) If TorsForm.type1.Value ThenCall MyTorus2.Rotate3D(dCenter, dX, dAng) 'поворотвокругоси OX на 90ElseCall MyTorus.Move(dCenter, toPointY)Call MyTorus2.Rotate3D(dCenter, dY, dAng) 'поворотвокругоси OX на 90toPointY(1) = -toPointY(1)Call MyTorus2.Move(dCenter, toPointY)End If ThisDrawing.SendCommand ("_VPOINT 1,1,1 ") 'заданиеслоев, цветовторамSet Layer1 = ThisDrawing.Layers.Add("Layer1") ' созданиеновогослояLayer1.color = clr 'задание слою цветаMyTorus1.Layer = Layer1.Name 'присвоениюторуновогослоя Set Layer = ThisDrawing.Layers.Add("Layer")Layer.color = clr + 1MyTorus.Layer = Layer.Name Set Layer2 = ThisDrawing.Layers.Add("Layer2")Layer2.color = clr + 2MyTorus2.Layer = Layer2.NameUnload Me End Sub'изменяем демонстрационную картинкуPrivate Sub type1_Click()TorsForm.Image1.Picture = LoadPicture(GetAppPath + "tor_in_tor.jpg") End Sub'изменяем демонстрационную картинкуPrivate Sub Type2_Click()TorsForm.Image1.Picture = LoadPicture(GetAppPath + "chain.jpg")End Sub 'получает директорию проектаPublic Function GetAppPath()'путь к файлу проектаDim projFilePath As StringprojFilePath = AcadApplication.ActiveDocument.Application.VBE.ActiveVBProject.FileName'индекспоследнегослэшавпутиDim lastSlash As IntegerlastSlash = InStrRev(projFilePath, "\")'директорияпроектаGetAppPath = Replace(projFilePath, Replace(projFilePath, "\", "", lastSlash, Len(projFilePath) - lastSlash), "")End Function Private Sub UserForm_Initialize()TorsForm.Image1.Picture = LoadPicture(GetAppPath + "tor_in_tor.jpg")End Sub

Сохраните эту программу как файл Project_Torus. dvb. Картинки, приведенные ниже, сохраните в файлах Tor_in_tor.jpg и Chain.jpg. Файлы проекта и картинок поместите в одну папку.


увеличить изображение

 

Одной из задач программирования является организация интерактивности, т.е. возможности получения программой информации от пользователя. Это можно сделать двумя способами - из командной строки и через диалоговое окно.

Пример.

Рассмотрим обращение к объекту Utility. Он принадлежит объекту Document и управляет методами получения информации от пользователя.

Dim iReturn as IntegeriReturn = ThisDrawing.Utility.GetInteger ("Введитецелоечисло: ")

Здесь переменной iReturn присваивается целое число, введенное пользователем в командную строку. Такой метод применяется для ввода коротких и простых данных: чисел, текста или объекта. Чтобы избежать появления нескольких приглашений в одной строке, используют константу vbCrLf в начале приглашения:

Prompt1 = vbCrLf & "Задайте центральную точку: "ПримерSub AddCircle ()Dim vPt As VariantDim dRadius As DoubleDim myCircle As AcadCirclevPt = ThisDrawing.Utility.GetPoint (, vbCrLf & "Введитеточкуцентра: ")dRadius = ThisDrawing.Utility.GetReal ("Введитерадиус: ")Set myCircle = ThisDrawing.ModelSpace.AddCircle (vPt, dRadius)End Sub

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

Метод Синтаксис Описание
GetEntity Объект. GetEntity (объект, указанная точка, приглашение) Пользователь указывает объект. Метод возвращает объект и указанную точку. Пример: ThisDrawing.Utility. GetEntity(getObj,basePnt, "Выделите объект")
GetInteger Возвращаемое значение = GetInteger (Приглашение) Допустимо любое целое число в диапазоне от -32768 до 32767. Пример: getInt = ThisDrawing.Utility.GetInteger ("Введите целое число")
GetPoint Возвращаемое значение = GetPoint (точка, приглашение) Возвращает значение типа variant (оно содержит трехэлементный массив чисел типа double). Пользователь может указать точку или ввести ее координаты. Если имеется необязательный параметр точка, то AutoCAD прорисовывает "резиновую линию" от заданной точки до текущей позиции указателя. Пример: getPnt = ThisDrawing.Utility. GetPoint (, "Задайте точку: ")
GetReal Возвращаемое значение = GetReal (Приглашение) Получает вещественное (положительное или отрицательное число). Пример: GetReal = ThisDrawing.Utility.GetReal ("Введите вещественное число")
GetString Возвращаемое значение = GetString (содержит_пробелы, приглашение) Получение строки. Булев параметр содержит_пробел определяет, может ли получаемая строка содержать пробелы. Если параметр равен TRUE, то строка может содержать пробелы, а пользователь должен нажать ENTER для окончания ввода. Если значение параметра равно FALSE, то сигналом окончания ввода может служить не только нажатие ENTER, но знак пробела.

Упражнение

Создать процедуру, получающую информацию от пользователя

Создайте новый чертеж. Выберите команду Tools - Macro - VBA Manager. Щелкните по кнопке NEW, а затем по кнопке Visual Basic Editor. Выберите команду Insert - Module, а затем Insert - Procedure. Наберите в модуле следующий текст:

Public Sub HappyFace()Dim prompt As String, prompt2 As StringDim cen As VariantDim rad As DoubleDim cir As AcadCircleDim arc As AcadArcDim pi As DoubleDim dStart As Double 'начальныйуголDim dEnd As Double 'конечныйуголpi = 3.1415prompt = vbCrLf & "Задайте центральную точку: "prompt2 = vbCrLf & "Задайте радиус: "'получение центральной точки и радиуса от пользователяcen = ThisDrawing.Utility.GetPoint(, prompt)rad = ThisDrawing.Utility.GetDistance(cen, prompt2)Set cir = ThisDrawing.ModelSpace.AddCircle(cen, rad)'рисуем улыбкуdStart = 225 * pi / 180 'pi/180 - перевод в радианыdEnd = 315 * pi / 180Set arc = ThisDrawing.ModelSpace.AddArc(cen, rad / 2, dStart, dEnd)'рисуемглазаcen(0) = cen(0) - rad / 4cen(1) = cen(1) + rad / 4Set cir = ThisDrawing.ModelSpace.AddCircle(cen, rad / 8)cen(0) = cen(0) + rad / 2Set cir = ThisDrawing.ModelSpace.AddCircle(cen, rad / 8)End Sub

Сохранитепроекткак Project_HappyFace. dvb впапке AutoCAD2007\Support. Вернитесь к чертежу и выберите команду Tools - Macro - Macros. В диалоговом окне выберите процедуру HappyFace и щелкните по кнопке Run. Ответьте на приглашения.

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

Как и во всех языках программирования, в VBA существует развитая технология поиска ошибок. Простейший сеанс отладки сводится к установке точек прерывания. Перейдите в редакторе в процедуру, где предполагается наличие ошибки. Поместите курсор в первую выполняемую строку и нажмите F9 или выберите команду Debug - Toggle Breakpoint. В строку будет добавлена точка прерывания.

Выполните операторы по одному, нажимая клавишу F8. На каждом шаге просматривайте значения переменных. При помещении указателя мыши на переменные типов Integer, Double, и String в подсказке выводится их текущее значение.

Когда ошибка обнаружена, выберите команду Run - Reset и внесите исправления в код. При следующем запуске процедуры точка прерывания останется активной. Отключить ее можно нажатием клавиши F9. Нормальный запуск процедуры можно осуществить командой Run Sub, либо нажатием клавиши F5.

Если программа зависает в редакторе Visual Basic, то выйдите в окно AutoCAD и прервите выполнение команды нажатием клавиши ESC.

Ключевые термины

Объектная модель AutoCAD - Иерархическая структура всех объектов AutoCAD.

Доступ - доступ к иерархии объектов, в частности, к свойствам и методам объекта Document, обеспечивается посредством объекта ThisDrawing.

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

Родительский объект - объект более высокого ранга. с которым данный объект постоянно связан. Все объекты имеют свойство Application, как непосредственную ссылку на корневой объект.

Пользовательская форма - диалоговое окно с элементами управления.

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

Краткие итоги

Объектно-ориентированный язык VBA открывает широкие возможности автоматизации работы в среде AutoCAD. Все объекты AutoCAD организованы в виде иерархической структуры с корнем дерева в виде объекта Application. Связь VBA с активным чертежом AutoCAD обеспечивается посредством объекта ThisDrawing. С его помощью можно получить немедленный доступ ко всем свойствам и методам объекта Document, а также ко всем другим объектам иерархии. Кроме того, у всех объектов есть свойство Application, которое и является ссылкой на объект Application. Пользовательские формы VBA являются удобным способом создания диалоговых окон для введения в программу пользовательских данных.

Вопросы

1. Каковы основные понятия объектной модели AutoCAD?

2. Как обеспечивается связь VBA с активным чертежом AutoCAD?

3. Каковы основные алгоритмы создания и редактирования примитивов?

4. Как установить новые слои?

5. Какие особенности работы с VBA в трех измерениях?

6. Как создаются в VBA диалоговые окна?

Внимание! Если Вы увидите ошибку на нашем сайте, выделите её и нажмите Ctrl+Enter.

© Национальный Открытый Университет "ИНТУИТ", 2021 | www.intuit.ru


 

Национальный Открытый Университет "ИНТУИТ": www.intuit.ru

Валерий Пакулин


Поделиться с друзьями:

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

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

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.01 с.