1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

VBS. ByVal,ByRef, аргументы при вызове SUB

Модератор: Глоб.модераторы

Ответить

Автор темы
alex3110
освоился
освоился
Сообщения: 289
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 27 раз
Поблагодарили: 9 раз

VBS. ByVal,ByRef, аргументы при вызове SUB

Сообщение alex3110 »

Всем привет !

Поясните, пожалуйста :

VBS-скрипт №1:

Sub OnClick(ByVal Item)
Item.BackColor = RGB(255,0,0)
End Sub

ВОПРОСЫ_1 :
1.1 Правильно ли я понимаю, что :
- «Item» - это идентификатор того графического объекта ГО на экране WinCC RT, на котором произойдёт клик ЛКМ ?

1.2 Что такое ByVal применительно к вызову данной Sub-процедуры с именем OnClick ?
ByVal – этот текст указывающий на то, что Sub процедура с именем OnClick должна будет выполнить какие-то действия со «значением» какого-то атрибута того ГО, на котором будет выполнен клик мыши ?
ИЛИ
ByVal – этот текст, указывающий, что Sub процедуре с именем OnClick должно быть передано какое-то «значение», прежде чем эта процедура начнёт работать ? Если так, то какое «значение» и какого параметра (атрибута) ?

1.3 Почему тут нельзя было использовать ByRef вместо ByVal ?


VBS-скрипт №2:

Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)
Obj3QButtonAnimation Item, "OnPress"
End Sub

ВОПРОСЫ_2 :

2.1 Правильно ли я понимаю, что в первой строке скрипта, при вызове Sub-процедуры с именем OnLButtonDown, в скобках указывается то, что конкретно эта процедура должна «запомнить», т.е. должна «запомнить» Item, Flags и координаты x,y того ГО, на котором будет выполнено нажатие и удержание ЛКМ ?
Во второй строке будет вызван другой VBS-скрипт, который изменит вид ГО Item (а это "кнопка") на «нажатая».

2.2 Зачем тут, при вызове Sub процедуры с именем OnLButtonDown для ByVal нужно указывать максимальный набор параметров, т.е. и Item, и Flags, и координаты x, y ГО , на котором будет выполнено нажатие и удержание ЛКМ ?

Ведь в похожем скрипте №1 достаточно было указать только Item !

Михайло
эксперт
эксперт
Сообщения: 3643
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 8 раз
Поблагодарили: 286 раз

VBS. ByVal,ByRef, аргументы при вызове SUB

Сообщение Михайло »

1.1 Да
1.2 Есть два варианта: ByVal и ByRef. Если ByVal, то при передаче Item извне процедуре Onclick делается копия Item в памяти. Если ByRef, то передается адрес на имеющийся подлинник Item в памяти.
В чем мотивация: в первом случае, вы можете внутри Onclick изменять Item, но это будет изменение копии, а оригинал извне останется без изменений. Во втором случае, изменяя Item внутри Onclick, вы вносите изменения в оригинал. ByVal используется просто для передачи Item в процедуру для чтения, ByRef для чтения и изменения Item.
2.1 Все верно, только ByVal не позволит изменить подлинник Item, изменится только копия Item внутри OnLButtonDown. Не знаю, что делается во второй строке, но изменение Item бессмысленно, иба эта временная копия Item уничтожается при достижении End Sub. Скорее всего тут происходит только чтение.
2.2 Вы правы, дополнительные параметры не нужны. Возможно программист что-то затевал глобальное, но лишние постройки остались не востребованы.

Автор темы
alex3110
освоился
освоился
Сообщения: 289
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 27 раз
Поблагодарили: 9 раз

VBS. ByVal,ByRef, аргументы при вызове SUB

Сообщение alex3110 »

Спасибо большое !
:thankyou:
Михайло писал(а): 28 июл 2024, 13:32 .... Если ByRef, то передается адрес на имеющийся подлинник Item в памяти...
... Во втором случае, изменяя Item внутри Onclick, вы вносите изменения в оригинал. ByVal используется просто для передачи Item в процедуру для чтения, ByRef для чтения и изменения Item.
3. Правильно ли я понимаю, что если, к примеру, ранее в тексте скрипта произошло считывание копии Item по ByVal в
Sub
OnClick(ByVal Item)
то если далее в тексте будет вызван какой-либо другой скрипт, но с ByRef вместо ByVal, например :
Sub <Имя скрипта2>(ByRef Item)
то тогда внутри скрипта2 будет использован тот Item, который уже был считан предыдущим скриптом, стоящим в иерархии выше ?
Хотя сейчас мне это и трудно представить, зачем нужна такая "инкапсуляция", но, вероятно, это может в каких-то случаях требоваться.

4. А при вызове функции Function, которая возвращает значение, тоже могут применяться как ByVal, так и ByRef ?

Автор темы
alex3110
освоился
освоился
Сообщения: 289
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 27 раз
Поблагодарили: 9 раз

VBS. ByVal,ByRef, аргументы при вызове SUB

Сообщение alex3110 »

Obj3QButtonAnimation Item, "OnPress"

Тут скрипт Obj3QButtonAnimation , используя Item соответствующей кнопки, меняет отображение этой кнопки на экране RT с "НЕ нажата" на "нажата". Т.е. пока оператор удерживает ЛКМ нажатой на этой кнопке.

Михайло
эксперт
эксперт
Сообщения: 3643
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 8 раз
Поблагодарили: 286 раз

VBS. ByVal,ByRef, аргументы при вызове SUB

Сообщение Михайло »

3. Мне кажется вам нужно расслабиться. Вопрос состоит в том, что выбрать: ByVal или ByRef. Если ByVal, то функция не меняет переданную переменную. Если ByRef, то вышестоящие и последующие скрипты "почувствуют" изменение Item. Для примера можно обнулить Item = 0.

4. Тоже можно ByVal/ByRef. Переменные ByRef являются альтернативой выходной переменной функции. Функция задает значение выхода с помощью return, а также просто присвоением значений переменным ByRef - эти действия также попадают в вышестоящий скрипт.

Часто делается так: передается строка ByRef, функция в этой строке удаляет пробелы или заменяет кавычки (") на экранированные (/"). Можно было бы строку передать ByVal, а новую строку выдать обратно через return. Это тоже вариант. Но просто иногда надо выдать еще статус обработки строки: 0 - ОК, 1 - ошибка, строка не содержит каких-то символов, 2 - строка слишком короткая и т.д. Поэтому обычно статусы и результаты работы функции принято выдавать в return, а данные для обработки через ByRef. Удобно потом писать так:
If somefunc(somedata) != 0 then msgbox("ошибка!")
Ответить

Вернуться в «WinCC»