RUS  ENG 

Как сделать плагин. Руководство.

Страницы: Пред. 1 2 3 4 След.
RSS
Как сделать плагин. Руководство.
 
Цитата:
Разобрался. В выражении Set aDoc = Zulu.ActiveDocument пропущен объект Connector, т.е. должно быть вот так:
Set aDoc = Connector.Zulu.ActiveDocument
Видимо, Вы это мне и сказали, но я почему-то никак не могу связать вашу фразу с этим смыслом :(

Я имел в виду то, что в приведенном фрагменте кода объект Zulu никак не определен. Выглядело как переменная Zulu.
 
Цитата:
Теперь другой вопрос: при попытке запустить ещё одну форму функцией Form_2.Show Зулу выдаёт сообщение "ошибка 406. Non-modal forms cannot be displayed in this host application from an ActiveX DLL, ActiveX Control , or Property Page"
Возможно каким-либо образом открыть ещё одну форму из плагина? Или нужно обходиться только одной формой?

Здесь Вам Visual Basic сообщает, что он не может создать немодальную форму в этом приложении (т.е. не написанном на Visual Basic). Соответственно форму нужно отображать модально (укажите параметр Modal при вызове Show).
 
Цитата:
почему-то не работают функции вида
Set newCheckbox = Controls.Add("VB.checkbox", ControlName, Form1)
ошибка "Type mismatch"
Возможно ли программно вставлять чекбоксы по количеству слоёв в карте?

Мы не знаем как программно добавлять чекбоксы в форму Visual Basic. Здесь Вам лучше поискать примеры или статьи по Visual Basic по поводу программирования содержимого форм.
 
с отображением фторой формы разобрался - надо запускать её так: Form2_Layers.Show (1) Здесь (1) - это параметр Modal.

в цикле
For Each ИмяОбъекта In ИмяКоллекции
Операции над объектами
Next ИмяОбъекта

к какой коллекции нужно относить CheckBox?
Разобрался. Если отнести к Me.Controls - компиляция не происходит, говорит, что метод или участник ".Controls" не найден. В обычном проекте Visual Basic всё работает.
Нужно писать <имя формы>.Controls
Правда, пока всё равно не работает.

Что касается программного создания элементов, то создание кнопки выглядит так:
Dim ctlCommand As VB.CommandButton
Set ctlCommand = Controls.Add("VB.CommandButton", "ctlCommand1", Form1)
' определяем размер и место кнопки
ctlCommand.Move 2040, 50, 1500, 500
' устанавливаем надпись кнопки
ctlCommand.Caption = "кнопка"
' делаем её видимой
ctlCommand.Visible = True

В обычном проекте это работает, а в коде плагина Зулу - нет, спотыкается на строчке
Set ctlCommand = Controls.Add("VB.CommandButton", "ctlCommand1", Form1)

Здесь тоже есть "controls". Как нужно писать для Зулу?
Подставил имя формы перед Controls.Add - ошибка сменилась на "Object required".
 
В продолжене предыдущего поста. Как сделать циклический перебор объектов? Например, чекбоксов.
В VB работает код:

Dim x As Object
Dim text As String

For Each x In PluginForm.Controls 'в VB можно писать Me.Controls
If TypeName(x) = "CheckBox" Then
If x.Value = 1 Then
text = text & x.Caption & " выбран" & vbCrLf
Else: text = text & x.Caption & " не выбран" & vbCrLf
End If
End If
Next x
Label1.Caption = text

---
Разобрался. нужно писать так:
For Each x In UserControl.Controls

Почему-то название формы, которая имеет класс UserControl, в тексте кода не распознаётся как UserControl.
Если прописать
Dim PluginForm As UserControl и For Each x In PluginForm.Controls
то название формы PluginForm распознаётся как UserControl и предлагаются варианты методов и свойств, но всё равно не работает и ошибка в Зулу меняется на "91", "Object variable or With block variable not set".

Интересно, почему так?
 
Ekolog, перечисленные Вами ошибки относятся к коду Visual Basic и сообщает о них сам Visual Basic, к Zulu они никакого отношения не имеют.
Например Вы объявляете переменную Dim PluginForm As UserControl и дальше используете ее в цикле. Не инициализируя никак. Как так ?! Вот Вам Basic nи говорит "Object variable or With block variable not set".
Далее, "В обычном проекте это работает, а в коде плагина Зулу - нет" - это вообще какая-то ерунда. Один и тот же код должен одинаково компилироваться. Просто в "обычном" проекте, Вы, наверное, свойство Controls используете у объекта Form, а в плагине у объекта UserControl, что разумеется не одно и то же.
Ошибочно думать, что Вы пишете код "для Зулу" и поэтому он не компилируется или не выполняется. Не бывает кода "для Зулу". Просто Вы пишете неправильной код Visual Basic и он Вам об этом сообщает.
 
Просто в моём случае PluginForm - это название формы. Ведь мы же не инициализируем название формы в "обычном" проекте VB! Неувязочка!
А как его надо инициализировать?

И ещё подскажите, пожалуйста, как добавить чекбокс в коллекцию?
Добавить текстовое значение выходит, а по аналогии добавить чекбокс в коллекцию UserControl не выходит.
Set NextCheckbox = UserControl.Controls.Add("VB.checkbox", CheckboxName)
Опять же, в обычном проекте VB данная строчка работает.

Ничего не могу понять... только что не работало ни под каким соусом, потом бац! и заработало! :/
Итак, чтобы добавить чекбокс, делаем вот что:
Dim NextCheckbox As VB.CheckBox
Set NextCheckbox = UserControl.Controls.Add("VB.checkbox", "CheckboxName")
'здесь UserControl.Controls - коллекция управляющих элементов, .Add(что добавляем, как его зовут) - функция добавления
'далее сдвигаем чекбокс
NextCheckbox.Move 50, 50, 3135, 255
'задаём ему метку
NextCheckbox.Caption = "чек"
'делаем его видимым
NextCheckbox.Visible = True
 
Цитата:
Просто в моём случае PluginForm - это название формы. Ведь мы же не инициализируем название формы в "обычном" проекте VB! Неувязочка!
А как его надо инициализировать?

Имя (Name) формы (Form) как и имя UserControl'а прекрасно задается в проекте. Никаких "неувязок".

Цитата:
И ещё подскажите, пожалуйста, как добавить чекбокс в коллекцию?
Добавить текстовое значение выходит, а по аналогии добавить чекбокс в коллекцию UserControl не выходит.
Set NextCheckbox = UserControl.Controls.Add("VB.checkbox", CheckboxName)
Опять же, в обычном проекте VB данная строчка работает.

Мы, к сожалению, не знаем как программно добавлять чекбоксы в UserControl. Об этом я Вам уже писал несколькими постами ранее (9.12.2014). Наша компетенция в Visual Basic ограничена. Вам лучше поискать решения в Сети, либо в документации (MSDN), либо в сообществах, например codeguru.com, codeproject.com, expert-exchange.com (последний - платный).
Также еще раз обращаю Ваше внимание на то, что если код Visual Basic будет запускаться из Zulu, он от это не становится "необычным". Поэтому фраза "в обычный проекте это работает" лишена смысла. У Вас просто проекты разных типов. В одном случае используется объект Form (возможно, т.к. я лишь гадаю, что Вы вкладываете в понятие "обычный"), во втором - UserControl. И возможно динамическое создание Control'ов там и там отличается.
 
Я не о том, что в принципе не задаётся, а о том, что если его не задавать, то всё равно работает. Или я чего-то не заметил?

"Например Вы объявляете переменную Dim PluginForm As UserControl и дальше используете ее в цикле. Не инициализируя никак. Как так ?! Вот Вам Basic nи говорит "Object variable or With block variable not set"."

Подскажите, как надо инициализировать?
 
Строкой кода Dim PluginForm As UserControl Вы объявляете переменную типа UserControl (физически это ссылка на UserControl) и она пуста.
Соответственно, чтобы ей (переменной) пользоваться нужно ее заполнить оператором Set (Set PluginForm = что-то). Хотя по тому, что Вам хотелось бы добиться, скорее всего это был ложный путь. Этой переменной Вам не нужно.
 
На счёт переменной PluginForm Вы правы, она сама мне не нужна, мне нужен UserControl.
У меня ещё не сформировалось полное понимание об управлении в проекте VB. Не могли бы Вы объяснить все этапы, которые нужно выполнить, чтобы вот эта строчка заработала (уже после подключения к Зулу через IPluginConnector)?
Set NextCheckbox = UserControl.Controls.Add("VB.checkbox", "CheckboxName")

Когда я её вставил в первый раз, она не работала. Потом заработала, и я не могу понять, что было не так.
И ещё, в дочернем окне она, конечно же, не желает работать, как и до того в основной форме. Не могу понять, как её запустить.
Это какие-то дебри VB, которые я никак не могу отыскать.
 
Ekolog, данный форум посвящен программированию для Zulu. Обсуждаемые Вами вопросы к Zulu совершенно не относятся. Мы не обучаем программированию на Visual Basic, это выходит за рамки нашей компетенции. Для этого есть форумы по Visual Basic. Надеемся на Ваше понимание.
 
Цитата:

1. В Visual Basic Вам нужно создать новый проект. Тип проекта - ActiveX Control
2. Сделайте первоначальный дизайн формы (UserControl), скомпилируйте проект,

Сделал новый проект. Скопировал туда код из вашего проекта SimpleformPlugin. На этапе компиляции возникает ошибка компиляции "Определяемый пользователем тип не определён" и выделяет фразу Connector As IPluginConnector
 
Проверьте, что в References у проекта добавлены Zulu 7.0 Application, Zulu 7.0 Library и Zulu 7.0 Database Connection Library.
 
Поправил. Теперь при запуске плагина возникает ошибка
Plugin connect failed. Plugin: ''. Method: 'ConnectZuluPlugin'. Error: 0x800A0009. Subscript out of range.

В рабочем плагине тоже не была отмечена Database Connection Library, но всё работает.
 
В коде метода ConnectZuluPlugin у Вас ошибка. Обычно "Subscript out of range" возникает когда индекс выходит за границы массива.
Ссылка на "Database Connection Library" потребуется, когда нужно будет работать с табличными данными и базами данных. Я ее указал, чтобы Вам потом не искать.
 
Да, нашёл ошибку.
Подскажите, пожалуйста, как пересчитывать координаты? Смотрел преобразования в примере "Отравляющие вещества" - ничего не понял. На реальной карте выдаёт что-то несуразное.
 
Какие координаты, каким образом полученные, "откуда" и "куда" необходимо пересчитать ?
 
Вот два куска кода из "Отравляющих веществ":

If EventID = evMapLButtonDown Then
x = Param2 And 65535
y = Param2 / 65536
Set View = Src
x = View.GetRealY(x)
y = View.GetRealX(y)
OnZuluEvent = Control.OnMapClick(y, x)
Set View = Nothing
End If

Public Function OnMapClick(ByVal RealX As Double, ByVal RealY As Double)
If FindBtn.Value = 1 Then
DropX = RealX
DropY = RealY
MapX.Caption = Str$(RealX / 100)
MapY.Caption = Str$(RealY / 100)
FindBtn.Value = 0
OnMapClick = True
End If
End Function

Если запустить этот плагин на привязанной карте и выбрать точку, то координаты, выдаваемые плагином, сильно отличаются от правды.
Объясните пожалуйста, как пересчитывать координаты, полученные функцией GetRealX, в реальные координаты местности. Я так понимаю, именно они используются в системе координат объектов Зулу?
 
Пример "Отравляющие вещества" сделан для план-схемы как пример. Метод GetRealX можно применять только для план-схемы.
Для картографических проекций x и y не являются независимыми параметрами и работают в паре. В этом случае нужно использовать GetRealXY
 
"Метод GetRealX можно применять только для план-схемы."
- вот эту бы фразу в справку...

Как использовать метод GetRealXY?
 
http://politerm.com/zuludoc/zuluax/IMapView_GetRealXY.htm
 
Вы думаете, я не смотрел там, перед тем, как спросить?

Функция возвращает координаты. Как она может возвратить сразу две координаты?
Если координаты - это те Х и Y, которые в скобках, то как их выудить?
По идее, в скобках нужно вводить параметры для работы функции. Тогда что за Х и Y надо вводить в скобки, если она "Возвращает координаты центра отображения карты"? Для чего? VB предлагает это сделать.
Почему VB просит знак = после скобок?
В общем, сплошные вопросы. А примера в справке нет. Выручайте.
 
Описание подправили
http://politerm.com/zuludoc/zuluax/IMapView_GetRealXY.htm
Не знаю, какой тут нужен пример.

dim X as double
dim Y as double

View.GetRealXY(11, 12, X, Y)

В переменных X Y будет ответ (http://msdn.microsoft.com/ru-ru/library/c84t73c2.aspx)
 
Ого, так там совсем другая функция была!
А я как раз собирался спросить, нельзя ли по экранным координатам определить реальные.

Вот пишу я строку
View.GetRealXY(ScrX, ScrY, X, Y)
А VB меня и спрашивает: где, мол, знак = после скобок?
А я ему: А хто ж его знает??!
Так чего ему надо-то?
Страницы: Пред. 1 2 3 4 След.