ScriptControl - присвоение переменных по имени.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 15:18

Доброго дня товарищи. Подскажите пожалуйста, есть ли какой-нибудь способ в ScriptControl установить переменную по строковому идентификатору ?

Поясню - хотелось получить нечто вроде этого, но к сожалению не нашёл:
Код: Выделить всё
ScriptControl.CodeObject.Variables("a") = value


Про установку в явном виде :
Код: Выделить всё
ScriptControl.CodeObject.a = value
, я в курсе, но возникла необходимость динамически объявлять переменные внутри скриптконтрола и задавать их значения.

Делать через нечто:
Код: Выделить всё
ScriptControl.Execute "Dim " & varName & ": " & varName & " = " & value

как-то криво. Поэтому решил обратиться к Вам. :roll:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ScriptControl - присвоение переменных по имени.

Сообщение Хакер » 01.04.2015 (Ср) 15:21

CallByName.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 15:37

Так она же в VBScript отсутствует или ошибаюсь ? У меня ScriptControl создан в среде БС (банковской системы). А её модули написаны на VBScript. :oops:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ScriptControl - присвоение переменных по имени.

Сообщение Хакер » 01.04.2015 (Ср) 15:44

CallByName надо использовать не в коде, который исполняется контролом, а во внешнем коде, который управляет контролом. Или ты хочешь сказать, что и он на VBScript?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 15:50

Хакер писал(а):CallByName надо использовать не в коде, который исполняется контролом, а во внешнем коде, который управляет контролом. Или ты хочешь сказать, что и он на VBScript?


Вот-вот. Я правильно понял вашу идею, как раз потому и сделал уточнение про БС:
У меня ScriptControl создан в среде БС (банковской системы). А её модули написаны на VBScript.


Про CallByName, то я не забывал. ) Чувствую сейчас Вы скажите - "ЮЗАТЬ СКРИПТКОНТРОЛ В КОДЕ, КОТОРЫЙ И ТАК ИНТЕРПРЕТИРУЕТСЯ ??? АРХИГЛУПО !"

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ScriptControl - присвоение переменных по имени.

Сообщение Хакер » 01.04.2015 (Ср) 15:50

Хорошо, простой вопрос: откуда вообще берётся имя ScriptControl1? Почему не ScriptControl2?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 16:09

Поясню - в примерах кода выше, я использовал имя ScriptControl, просто как логичное имя переменной. В действительности, в моём коде он фигурирует как objScriptControl . Экземпляр этого объекта я создаю сам в коде VBS файла, который выполняет БС :

Код: Выделить всё
Dim objScriptControl: Set objScriptControl = CreateObject("ScriptControl")
objScriptControl.Language = "VBScript"
...


Т.е изначально его в среде интерпретатора нет.

P.S Наверное будет лучше, если заранее обрисую ситуацию, чтобы сократить количество встречных вопросов и сэкономить Ваше время. )

Среда БС представляет из себя exe модуль, который запускается с сетевого ресурса на рабочих местах сотрудников (это клиентская часть комплекса). Этот модуль связывается c так называемым "сервером приложений". Проще говоря серверной частью комплекса. Серверная часть, в свою очередь, связывается с SQL сервером. Обмен между клиентской и серверной частью собран частично на чистом TCP обмене данными и частично на RPC. В клиентской части вставлен, как я понял, всё тот же ScriptControl, в который загружаются скрипты с сервера. И вся эта телега как-то работает. :D

Сейчас возникла задача дописать свой модуль. Внутри него должны выполняться проводки и расчёты. Т.е движение средств по счетам, рассчёт процентов и т.п. Формул рассчёта сумм, номеров счетов, разделов счетов и т.п тьма тьмущая. К тому же для каждой операции, свой набор действий. Закладывать их жёстко в код очень неудобно, так как модуль на стадии разработки, то корректировок в процессе довольно много и каждый раз лезть в код и искать, где что очень неудобно. В итоге было решено всё это вытащить в EXCEL таблицу. В ней сотрудники ковыряют формулы и настраивают номера счётов и меняют порядок действий. Потом я гружу данные из EXCEL таблицы в БД. В итоге получаю таблицы с нужными данными. Потом в VBS скрипте я выгружаю записи, создаю переменные в ScriptControl-е, выполняю выражения и делаю проводки.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ScriptControl - присвоение переменных по имени.

Сообщение Хакер » 01.04.2015 (Ср) 16:42

Ну вот.
Значит:
  • Можно написать стороннюю ActiveX-библиотеку, которая будет предоставлять услугу по вызову CallByName.
  • Если у тебя уже есть (а по-моему ты говорил, что есть) сторонняя библиотека, которая позволяет из VBScript-а дёргать произвольные API-функции из DLL, то можно с помощью такой библиотеки дёргать CallByName прямо из msvbvm60.
  • Может быть силами БС в пространство имён БС-скрипта уже импортирован объект, предоставляющий первый или второй сервис.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: ScriptControl - присвоение переменных по имени.

Сообщение ger_kar » 01.04.2015 (Ср) 17:23

CallByName это вызов методов некоторого объекта по строковому имени, а тут же речь идет о переменных, причем тут CallByName?
Бороться и искать, найти и перепрятать

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 17:41

Хакер, я думал об этом. Но беда в том, что у нас рабочих мест в банке штук 30. Распихивать DLL-ку по всем компам и регить геморно. ) Поэтому я думал, есть способ попроще )

ger_kar,
ger_kar писал(а):CallByName это вызов методов некоторого объекта по строковому имени, а тут же речь идет о переменных, причем тут CallByName?


Я так понял, имелось в виду:
Код: Выделить всё
CallByName objScriptControl.CodeObject, "a", VbLet, 1


Так как все переменные и процедуры доступны как свойства у ScriptControl.CodeObject

P.S Надеюсь, я правильно это назвал, иначе Хакер меня покарает :roll:
Последний раз редактировалось ALX_2002 01.04.2015 (Ср) 17:44, всего редактировалось 1 раз.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 18:27

В общем пока что залатал дыру таким кодом:

Код: Выделить всё
Dim sc
Set sc = CreateObject("ScriptControl")
sc.Language = "VBScript"

SetVar "TestVar1", "1"

SetVar "TestVar2", "2"

MsgBox sc.CodeObject.TestVar1

MsgBox sc.CodeObject.TestVar2

Sub SetVar(name, value)
    sc.ExecuteStatement "Dim [" & name & "]:" & _
                        "Sub []([@]):" & _
                            "If IsObject([@]) Then:" & _
                                "Set [" & name & "] = [@]:" & _
                            "Else:" & _
                                "[" & name & "] = [@]:" & _
                            "End if:" & _
                        "End Sub"
    sc.CodeObject.[] value
End Sub


Понимаю, что это полная !@#$%, но других идей в голову не пришло. Причём в VB6 такое не прокатывает. Работает только в среде VBScript. Почему то VB6 валится на строке:
Код: Выделить всё
sc.CodeObject.[] value


Видимо не нравится ему такое название процедурки. Сделал его таким, чтоб шансов пересечься с другим кодом было как можно меньше.
Последний раз редактировалось ALX_2002 01.04.2015 (Ср) 19:09, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ScriptControl - присвоение переменных по имени.

Сообщение Хакер » 01.04.2015 (Ср) 18:35

ger_kar писал(а):CallByName это вызов методов некоторого объекта по строковому имени, а тут же речь идет о переменных, причем тут CallByName?

При том, что иди читай документацию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ScriptControl - присвоение переменных по имени.

Сообщение Хакер » 01.04.2015 (Ср) 18:38

ALX_2002 писал(а):Распихивать DLL-ку по всем компам и регить геморно. ) Поэтому я думал, есть способ попроще )

Если есть сетевая шара, то проблема с распихиванием устраняется, а необходиммость регистрации обходится SxS-манифестом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 18:43

Хакер, в этой области мои познания совсем скудны. Манифесты только 2 раза в жизни ковырял. Но мысль очень заманчивая. Надо будет подумать в эту сторону. :wink: Пасиб.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.04.2015 (Ср) 18:44

ALX_2002, а зачем вообще процедура (это я про ту, что с пустым именем)?
И нормально, что каждый раз делается Dim?

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re:

Сообщение ALX_2002 » 01.04.2015 (Ср) 18:48

Qwertiy,
Qwertiy писал(а):ALX_2002, а зачем вообще процедура (это я про ту, что с пустым именем)?


1) А как лучше сделать ?

Qwertiy писал(а):И нормально, что каждый раз делается Dim?


2) Dim делаю каждый раз, так как не знаю задана уже переменная или нет. По идее через Eval можно проверять, но имеет ли смысл ? Или можно иначе ?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.04.2015 (Ср) 18:55

ALX_2002 писал(а):1) А как лучше сделать ?

Не знаю.
1. Что если в ExecuteStatement запихнуть сразу внутренности Sub []([@])?
2. Почему бы не сделать отдельно SetVar и LetVar? Или это не подходит под задачу?

ALX_2002 писал(а):2) Dim делаю каждый раз, так как не знаю задана уже переменная или нет. Можно иначе ?

Мне просто кажутся подозрительными множественные объявления одной переменной. Да и одной функции [] - тоже. Или для VBS это нормально?
К тому же, необъявленные переменные же в любом случае ошибкой не считаются (если ты там option explicit не ставишь), а тип ты всё равно не указываешь.
Хотя, в любом случае не очень хорошо пахнет.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: ScriptControl - присвоение переменных по имени.

Сообщение ger_kar » 01.04.2015 (Ср) 18:58

Хакер писал(а):При том, что иди читай документацию.
Да там особо то читать нечего. Там всего то пару строк. Вот перевод:
Функция CallByName используется для получения или установки свойства или вызова метода во время выполнения, используя имя строки.
Бороться и искать, найти и перепрятать

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 19:00

Qwertiy,

Qwertiy писал(а):1. Что если в ExecuteStatement запихнуть сразу внутренности Sub []([@])?
2. Почему бы не сделать отдельно SetVar и LetVar? Или это не подходит под задачу?


Можно увидеть Ваш пример кода, как это реализовать ? :cyclops:

ger_kar,
ger_kar писал(а):Да там особо то читать нечего. Там всего то пару строк.

В MSDN документации всё очень подробно расписано:
Выполняет метод объекта; устанавливает или возвращает свойство объекта.

Синтаксис

CallByName(object, procedurename, calltype,[arguments()])

Синтаксис функции CallByName содержит следующие элементы:

Элемент Описание
object Обязательный; значение типа Variant (Object). Имя объекта, к которому применяется функция.
procedurename Обязательный. Значение типа Variant (String). Строковое выражение, содержащее имя свойства или метода объекта.
calltype Обязательный; значение типа Constant. Константа типа vbCallType, отражающая тип вызываемой процедуры.
arguments() Необязательный. Значение типа Variant (Array).


Примечания

Функция CallByName применяется для получения или установки свойства, или же для вызова во время выполнения метода с использованием имени, указанного в виде строкового значения.


Да и в online MSDN тоже подробно расписано: ссылка
Последний раз редактировалось ALX_2002 01.04.2015 (Ср) 19:06, всего редактировалось 1 раз.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.04.2015 (Ср) 19:05

Вообще-то я не разбираюсь в VBS... Идея примерно такая:
Код: Выделить всё
Sub LetVar(name, value)
  sc.ExecuteStatement name & " = " & value
End Sub

Sub SetVar(name, value)
  sc.ExecuteStatement "Set " & name & " = " & value
End Sub

Кстати, в твоём варианте в Dim квадратные скобки стоят, а в присваиваниях - нет, так что они стоят просто так :)

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.04.2015 (Ср) 19:07

ALX_2002 писал(а):Да и в MSDN тоже подробно расписано: ссылка

Это для VB.NET.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re:

Сообщение ALX_2002 » 01.04.2015 (Ср) 19:14

Qwertiy,

1) И как это будет работать если value является Date / Null / Object ? :shock:

2) Благодарствую. Поправил. )

3)
Qwertiy писал(а):Это для VB.NET.


Согласен, но смысл то тот же. )

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.04.2015 (Ср) 19:27

ALX_2002 писал(а):1) И как это будет работать если value является Date / Null / Object ? :shock:

Упс.. Согласен. Про это я как-то не подумал.
Оно и со String работать будет не так как хотелось бы.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: ScriptControl - присвоение переменных по имени.

Сообщение Хакер » 01.04.2015 (Ср) 19:33

Очень уж это грязные методы. Заставлять скриптовый движок каждый раз разбирать скрипт и по нему генерировать код...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: ScriptControl - присвоение переменных по имени.

Сообщение ALX_2002 » 01.04.2015 (Ср) 19:37

Хакер,
Хакер писал(а):Очень уж это грязные методы. Заставлять скриптовый движок каждый раз разбирать скрипт и по нему генерировать код...


Согласен. :oops: Самому не нравится. Поэтому параллельно изучаю Ваше предложение. Выясняю как скормить БС свою DLL. Выяснилось, что она не признаёт "чужеродные". При запуске клиента игнорирует мою DLL. Видимо где-то список хранится, что копировать на все компы, а что нет.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 58

    TopList