Всем привет !
Поясните, пожалуйста :
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 !
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
VBS. ByVal,ByRef, аргументы при вызове SUB
Модератор: Глоб.модераторы
-
- эксперт
- Сообщения: 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 Вы правы, дополнительные параметры не нужны. Возможно программист что-то затевал глобальное, но лишние постройки остались не востребованы.
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 Вы правы, дополнительные параметры не нужны. Возможно программист что-то затевал глобальное, но лишние постройки остались не востребованы.
-
- освоился
- Сообщения: 289
- Зарегистрирован: 02 апр 2015, 18:16
- Имя: Симонов Игорь Валерьевич
- Благодарил (а): 27 раз
- Поблагодарили: 9 раз
VBS. ByVal,ByRef, аргументы при вызове SUB
Спасибо большое !
Sub OnClick(ByVal Item)
то если далее в тексте будет вызван какой-либо другой скрипт, но с ByRef вместо ByVal, например :
Sub <Имя скрипта2>(ByRef Item)
то тогда внутри скрипта2 будет использован тот Item, который уже был считан предыдущим скриптом, стоящим в иерархии выше ?
Хотя сейчас мне это и трудно представить, зачем нужна такая "инкапсуляция", но, вероятно, это может в каких-то случаях требоваться.
4. А при вызове функции Function, которая возвращает значение, тоже могут применяться как ByVal, так и ByRef ?
3. Правильно ли я понимаю, что если, к примеру, ранее в тексте скрипта произошло считывание копии Item по ByVal вМихайло писал(а): ↑28 июл 2024, 13:32 .... Если ByRef, то передается адрес на имеющийся подлинник Item в памяти...
... Во втором случае, изменяя Item внутри Onclick, вы вносите изменения в оригинал. ByVal используется просто для передачи Item в процедуру для чтения, ByRef для чтения и изменения Item.
Sub OnClick(ByVal Item)
то если далее в тексте будет вызван какой-либо другой скрипт, но с ByRef вместо ByVal, например :
Sub <Имя скрипта2>(ByRef Item)
то тогда внутри скрипта2 будет использован тот Item, который уже был считан предыдущим скриптом, стоящим в иерархии выше ?
Хотя сейчас мне это и трудно представить, зачем нужна такая "инкапсуляция", но, вероятно, это может в каких-то случаях требоваться.
4. А при вызове функции Function, которая возвращает значение, тоже могут применяться как ByVal, так и ByRef ?
-
- освоился
- Сообщения: 289
- Зарегистрирован: 02 апр 2015, 18:16
- Имя: Симонов Игорь Валерьевич
- Благодарил (а): 27 раз
- Поблагодарили: 9 раз
VBS. ByVal,ByRef, аргументы при вызове SUB
Obj3QButtonAnimation Item, "OnPress"
Тут скрипт Obj3QButtonAnimation , используя Item соответствующей кнопки, меняет отображение этой кнопки на экране RT с "НЕ нажата" на "нажата". Т.е. пока оператор удерживает ЛКМ нажатой на этой кнопке.
Тут скрипт 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("ошибка!")
4. Тоже можно ByVal/ByRef. Переменные ByRef являются альтернативой выходной переменной функции. Функция задает значение выхода с помощью return, а также просто присвоением значений переменным ByRef - эти действия также попадают в вышестоящий скрипт.
Часто делается так: передается строка ByRef, функция в этой строке удаляет пробелы или заменяет кавычки (") на экранированные (/"). Можно было бы строку передать ByVal, а новую строку выдать обратно через return. Это тоже вариант. Но просто иногда надо выдать еще статус обработки строки: 0 - ОК, 1 - ошибка, строка не содержит каких-то символов, 2 - строка слишком короткая и т.д. Поэтому обычно статусы и результаты работы функции принято выдавать в return, а данные для обработки через ByRef. Удобно потом писать так:
If somefunc(somedata) != 0 then msgbox("ошибка!")