Property Set/Let/Get и user-defined type

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Property Set/Let/Get и user-defined type

Сообщение anian » 03.08.2009 (Пн) 8:13

Приветствую уважаемых товарищей. Вопрос такого плана:

В модуле:
Код: Выделить всё
Public Type TFormOptions
    Movable As Boolean
    ClickThroug As Boolean
End Type

Public tfoOptions as TFormOptions

В frmMain:
Код: Выделить всё
Friend Property Get FormOptions() As TFormOptions
    FormOptions = tfoForm
End Property

' Сюда выполнение даже не заходит. Так же пробовал Property Let.
Friend Property Set FormOptions(fo As TFormOptions)
    Set tfoForm = fo
End Property


В Form2:
Код: Выделить всё
Private Sub cmdMovable_Click()
    ' Работает
    MsgBox CStr(frmMain.FormOptions.Movable)

    ' Не работает. Почему-то идет в Property Get, ну и ничего не меняет, соответственно.
    frmMain.FormOptions.Movable = True
End Sub


Я где-то лопухаюсь или невозможно в принципе?
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

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

Re: Property Set/Let/Get и user-defined type

Сообщение Хакер » 03.08.2009 (Пн) 9:08

Лопухнулся. Set для ссылок, для всего остального: Let.

И да, то, что ты хочешь сделать, сделать с помощью UDT невозможно в принципе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Re: Property Set/Let/Get и user-defined type

Сообщение anian » 03.08.2009 (Пн) 9:21

Я пробовал и Let, и Set - как в описании проперти, так и в её теле для присвоения - так что не суть...

Самый малокровный вариант - класс с соответствующими полями как аналог типа?
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Property Set/Let/Get и user-defined type

Сообщение Денис » 03.08.2009 (Пн) 9:31

anian писал(а):Я пробовал и Let, и Set - как в описании проперти, так и в её теле для присвоения - так что не суть...

Самый малокровный вариант - класс с соответствующими полями как аналог типа?

Да. Можно попробовать класс. Раз уж Вы любите много точек.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Re: Property Set/Let/Get и user-defined type

Сообщение anian » 03.08.2009 (Пн) 9:35

2 Денис: Есть другие варианты? Сопоставимые по сложности реализации с написанием класса?
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

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

Re: Property Set/Let/Get и user-defined type

Сообщение Хакер » 03.08.2009 (Пн) 9:38

anian писал(а):Я пробовал и Let, и Set - как в описании проперти, так и в её теле для присвоения - так что не суть...

Твой код эквивалентен следующему:
Код: Выделить всё
Dim tmp as TFormOptions
tmp = frmMain.FormOptions
tmp.Movable =  True

Почему такой код не делает то, чего тебе хочется, ты понимаешь?

anian писал(а):Самый малокровный вариант - класс с соответствующими полями как аналог типа?

Можешь сделать интерфейс IFormOptions, и сделать так, чтобы класс (в данном случае — форма) его реализовывала. У самой же формы сделать Get-only свойство, возвращающее Me. Такой вариант кажется мне лучше, потому что не нужен левый класс, не нужно два объекта, не нужно в форме хранить ссылку на вспомогательный объект, а во вспомогательном — на форму.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Re: Property Set/Let/Get и user-defined type

Сообщение anian » 03.08.2009 (Пн) 9:58

Хакер писал(а):Почему такой код не делает то, чего тебе хочется, ты понимаешь?

Не понимаю. Приведенный эквивалентный код работает прекрасно, как и Property Get.

По сути: таких (разного наполнения) UDT у меня уже 3, и будет еще парочка, минимум - а пихать все в одну кучу не кошерно, потому как еще и области видимости у них должны быть разные. По поводу лишних объектов и ссылок - я же могу объявить экземпляр класса как публичный для всего проекта, и читать-писать его отовсюду...Бог с ними, с пропертями формы - переживу уж как-нибудь. Одно плохо - и интерфейсов, и классов придется создавать по количеству UDT...
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

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

Re: Property Set/Let/Get и user-defined type

Сообщение Хакер » 03.08.2009 (Пн) 10:19

anian писал(а):Не понимаю. Приведенный эквивалентный код работает прекрасно, как и Property Get.

Он работает, но изменений изменения происходят в переменной tmp.


По поводу лишних объектов и ссылок - я же могу объявить экземпляр класса как публичный для всего проекта, и читать-писать его отовсюду...

И какой смысл в этом? Какой смысл в одном публичном экземпляре, приходящемся на несколько экземпляров форм? При изменении свойств публичного экземпляра, к какому из экземляров формы будут относиться изменения.

и интерфейсов, и классов придется создавать по количеству UDT...

Ты не прочувствовал разницу между созданием класса-саталита и реализацией формой ещё одного интерфейса?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Property Set/Let/Get и user-defined type

Сообщение Vi » 03.08.2009 (Пн) 10:28

anian писал(а):В Form2:
Код: Выделить всё
Private Sub cmdMovable_Click()
    ' Работает
    MsgBox CStr(frmMain.FormOptions.Movable)

    ' Не работает. Почему-то идет в Property Get, ну и ничего не меняет, соответственно.
    frmMain.FormOptions.Movable = True
End Sub

Я где-то лопухаюсь или невозможно в принципе?

Нужно использовать Property Let и присваивать через переменную типа TFormOptions, раз свойство такого типа. Напрямую поля структуры недоступны.
Код: Выделить всё
Dim tmp as TFormOptions
tmp = frmMain.FormOptions
tmp.Movable =  True
frmMain.FormOptions = tmp
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Re: Property Set/Let/Get и user-defined type

Сообщение anian » 03.08.2009 (Пн) 10:42

Хакер писал(а):Он работает, но изменений изменения происходят в переменной tmp.

Получение проперти работает? Работает. Изменение проперти не работает? Не работает - потому что это не возможно в принципе, как вы и сказали.
Хакер писал(а):И какой смысл в этом? Какой смысл в одном публичном экземпляре, приходящемся на несколько экземпляров форм? При изменении свойств публичного экземпляра, к какому из экземпляров формы будут относиться изменения.

Не-не-не, форма только одна. И меняются её параметры из другой формы, которая тоже одна.
Хакер писал(а):Ты не прочувствовал разницу между созданием класса-сателлита и реализацией формой ещё одного интерфейса?

Видимо, я толком не объяснил: форме нужен только один UDT, остальные либо для других форм, либо вообще используются в модулях. Но даже если форме нужно 3 UDT - надо создавать 3 интерфейса.
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!

anian
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 02.10.2002 (Ср) 12:05
Откуда: /dev/null

Re: Property Set/Let/Get и user-defined type

Сообщение anian » 03.08.2009 (Пн) 10:50

Vi писал(а):Нужно использовать Property Let и присваивать через переменную типа TFormOptions, раз свойство такого типа. Напрямую поля структуры недоступны.

Да, работает. Пожалуй, лучший вариант :) Вот только почему я сам не допёр..."абыдно, да?!"

Пожалуй, закроем тему.
Трез-вы-ми мы не сда-дим-сииии!!! Ураааааа!!!


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

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

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

    TopList