Страницы: 1
RSS
Передача свойств объекта в процедуру на запись
 
Повторите сообщение
 
Имеется множество объектов разных  классов, Property реализовано при помощи Let /Get
Необходимо их сохранять/загружать  в XML
Для загрузки используется  sub SaveProperty(ByRef Value as Variant)
Код
SaveProperty(Obj.X)
SaveProperty(Obj.Y)
SaveProperty(Obj.Z)
Хотелось бы написать зеркальную процедуру
LoadProperty(ByRef Value as Variant)
Код
LoadProperty(Obj.X)
LoadProperty(Obj.Y)
LoadProperty(Obj.Z)
Но присвоения значения не происходит, внутри процедуры Value принимает нужное значение, но на свойствах объекта это никак не отражается
PS: Просто реально много надо писать Save/Load, хотелось просто  скопировать кучу строк Save, и заменить через ctrl+F на Load((
 
Доброе время суток
Цитата
Vitek885 написал:
но на свойствах объекта это никак не отражается
Ну, если
Цитата
Vitek885 написал:
внутри процедуры Value принимает нужное значение,
А свойство нет, то чего вы собственно хотите? Какое отношение Value имеет к Obj.X?
 
Цитата
Андрей VG написал:
Какое отношение Value имеет к Obj.X?
Obj.X передается по ссылке как параметр, get отрабатывает и значение value=Obj.X при входе в процедуру, при присвоении Value нового значения , оно не записывается в Obj.X.

А как тогда передать свойство объекта в процедуру для записи в него значения?
 
Цитата
Vitek885 написал:
ри входе в процедуру, при присвоении Value нового значения , оно не записывается в Obj.X.
Почему вы считаете, что что-то должно записываться? Рассмотрит класс со свойством
Код
Private FX As Long

Private Property Get X() As Long
    X = FX
End Property

Каким образом вы измените Private FX? Get X всего лишь возвращает копию некоторого значения, как и всякая функция (а свойства и реализованы на функциях).
 
Цитата
Vitek885 написал: Property реализовано при помощи Let /Get
Даже там где свойство описано как
Код
Public X As String
не сохраняется....
Проблема в объявлении параметра "as variant" мне кажется
 
Цитата
Vitek885 написал:
Проблема в объявлении параметра "as variant" мне кажется
Значит встроена защита от таких изменений
 
Цитата
Vitek885 написал:
SaveProperty(Obj.X)
А разве скобки при вызове процедуры нужны?
 
Цитата
Alec Perle написал:
А разве скобки при вызове процедуры нужны?
А они, в данном случае что-то решают?
Вот пользовательский тип данных ведёт себя как и ожидалось, значение поля структуры меняется. Видимо, действительно для объектов открытые поля объекта каким-то образом защищаются, так как в этом случае отличие объекта от структуры минимально.
 
Цитата
Андрей VG написал:
встроена защита от таких изменений
Эксперимент показывает, что использовании в качестве фактического параметра вызова макроса Public переменной модуля класса создается копия фактического аргумента.

Модуль класса Class1
Код
Option Explicit
Public X
Public Sub ShowVarPtr()
  Debug.Print VarPtr(X)
End Sub
Стандартный модуль
Код
Option Explicit
Public Sub Test()
    Dim p As New Class1
    p.ShowVarPtr
    Debug.Print VarPtr(p.X)
End Sub
Владимир
 
Цитата
sokol92 написал:
создается копия фактического аргумента.
Добрый день, Владимир.
Большое спасибо за расставляющее точки над Ё исследование.
 
Цитата
Андрей VG написал:
А они, в данном случае что-то решают?
Согласен, в данном случае нет, просто было предположение. Все равно ошибка  - для "обыкновенных" переменных:
Код
Option Explicit

Sub change(ByRef V As Long)
  V = 100
End Sub


Sub test()
  Dim V1 As Long
  Dim V2 As Long
  change V1
  change (V2)
  Debug.Print V1
  Debug.Print V2
End Sub


Цитата
sokol92 написал:
использовании в качестве фактического параметра вызова макроса Public переменной модуля класса создается копия фактического аргумента
Вероятно, что при реализации Property Get/Let происходит подобное - создается копия возращенного Property Get значения и передается в процедуру.
 
В строке 12 сообщения #12 фактический аргумент при вызове процедуры заключен в дополнительные скобки. В этом случае он будет передаваться по значению, т.е. будет создана временная переменная нужного типа. Объяснение (про скобки) здесь. Так что с "обыкновенными" переменными всё обыкновенно. :)  
Изменено: sokol92 - 04.08.2020 14:14:30
Владимир
Страницы: 1
Наверх