Проперты класса

Программирование на Visual Basic for Applications
Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Проперты класса

Сообщение Calvin » 18.03.2003 (Вт) 16:08

Уважаемые помогите разобраться пож-та:
Я тут нашел примерчик по созданию класса в виде своего диалогового окна по открытию файлов с заданным "мною" расширением. Здесь создана переменная типа структуры, которая содержит проперты своих компонентов.
Также здесь создан метод вызова диалогового окна, который принимает параметры — строка фильтра, строка расширений, начальный каталог, строка заголовка окна.
(Возвращает полное имя файла.)
(это не весь код.....)

Код: Выделить всё
Public Function OpenFile(szFilter As String, _
Optional szDefExt As String, _
Optional szInitDir As String, _
Optional szCaption As String) As String

With ownFileDlg ' переменная типа структуры
.hInstance = 0
.hwndOwner = GetActiveWindow()
.strFile = String(255, 0)
.intMaxFile = 255
.strFilter = szFilter
.intMaxCustFilter = Len(szFilter)
.strFileTitle = String(255, 0)
.intMaxFileTitle = 255
.strDefExt = szDefExt
.strInitialDir = szInitDir
.strTitle = szCaption
.lngFlags = OFN_FILEMUSTEXIST Or OFN_EXTENTIONDIFFERENT
.lngStructSize = Len(ownFileDlg)
End With

If GetOpenFileName(ownFileDlg) Then
OpenFile = ownFileDlg.strFile
End If


так вот меня интересует "строка фильтра" - szFilter В дальнейшем коде

Код: Выделить всё
TextBox1.Value = dlgFiler.OpenFile("XLS- файлы" & _
vbNullChar & "*.XLS", , , "Выбирете экселевский файл")


я не пойму смысл константы vbNullChar. Если она указана, то фильтр по расширениям срабатывает, а если не указана

Код: Выделить всё
TextBox1.Value = dlgFiler.OpenFile("XLS- файлы" & _
vbNullChar & "*.XLS", , , "Выбирете экселевский файл


то файлы не фильтруются по расширению. Народ, что это за константа и почему так происходит?[/b][/quote]

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 18.03.2003 (Вт) 16:11

Извиняюсь :oops: последний код должен быть таким
Код: Выделить всё
TextBox1.Value = dlgFiler.OpenFile("XLS- файлы" & "*.XLS", , , "Выбирете экселевский файл")

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 18.03.2003 (Вт) 16:15

ну вот что в хелпе написано: Basic constant for a single Null character (ASCII value 0); equivalent to Chr$(0)
Значит эта константа = NULL, ну а потом наверно происходит фильтрация по этому символу(текста проги не написал поэтому приходиться только гадать)

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 18.03.2003 (Вт) 17:01

Все дело в том, что все API функции работают с так называемыми null-terminated strings, то есть chr(0) это признак конца строки. Если его нет, то функция не в состоянии понять где строка оканчивается.

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 18.03.2003 (Вт) 17:14

тогда скорей всего проперть strFilter имеет свой синтаксис, ну типа
"выбери ХХХ файлы" + [конец строки] + "расширение ..."
Мне просто интересно, строка кончается, а за ней еще значение (странный синтаксис :roll: )

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 18.03.2003 (Вт) 17:37

Синтаксис такой:



"Select files of type *.exe | *.exe"



Если мне, конечно склероз не изменяет :D

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 18.03.2003 (Вт) 20:17

Подскажите пож-та, чем отличается Property Get от Property Set (ну и Property Let) и возможно ли их объявлять с помощью Public и Private (если да, то как это влияет на работу с этими пропертями)???
(заранее благодарен) :wink:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 18.03.2003 (Вт) 20:28

Property Let это обработчик, который присваивает проперти значение.

Property Set это для пропертей, содержащих ссылки на объекты - присваивает значение проперти.

Property Get это обработчик, который возвращает значение проперти.



Допустим у объекта Obj есть проперть Name типа String и проперть Value типа Object, тогда:



Obj.Name = "MyName"- вызывается Let

Set Obj.Value = NewValue - вызывается Set

MyVar = Obj.Name - вызывается Get



А Public и Private влияют как на обычные методы так что ничего особенного тут нет. :)

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 21.03.2003 (Пт) 11:54

По-моему на эту тему мои вопросы не исчерпаны и снова прошу о помощи, помогите разобраться пож-та:
С процедурами объявления пропертей (property get,...let,...set)(теоретически) вроде бы все понятно, но когда я решил присвоить значенте проперти (с помощью ...let), то у меня возникли проблемы.
В модуле класса я сделал так:
Код: Выделить всё
Public Property Let Name22(ByVal vProp As String)
myVar = vProp
End Property

а потом уже в самой проге:
Код: Выделить всё
Private Sub comand_click()
Dim ddd as myClass
Set ddd = new myClass
ddd.name22="экземпляр 1"
end sub

возникает ошибка Object variable or With block variable not set (Error 91), которая уже возникала, когда я не установил ddd как "новый" экземпляр класса непосредствено в самой процедуре "Private Sub comand_click", хотя в процедуре инициализации формы я это сделал (странно????). Второй вопрос - зачем в процедуре "property Let" нужна внутренняя (myVar), которой присваивается значение свойства? (если конечно она вообще нужна).
Ну и третий вопрос - при создании методов класса используются процедуры и функции. В чем отличается их использование для создания методов? ............ спасибо :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.03.2003 (Пт) 12:14

  1. Сразу пиши Dim MyVar as New MyClass
  2. Переменная в процедуре конечно нужна, она, собственно, и хранит значение проперти. Это для внешнего юзера заводится Let, Get и Set.
  3. При создании методов их можно оформить как функции, чтобы по значению этой функции узнать, как завершился метод. Так API работает, например.
Последний раз редактировалось GSerg 21.03.2003 (Пт) 12:20, всего редактировалось 2 раз(а).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 21.03.2003 (Пт) 12:17

На первый:

Может, у тебя класс как то риво написан? Можешь кго код прислать или запостить чтоли?



На второй: mVar - это внутренняя переменная в которой хранится значение проперти объекта. Собственно, Property Let и нужна для того чтобы в эту mVar значение записать ;)



На третий вопрос - нет, никак не отличается ;)

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 21.03.2003 (Пт) 12:45

Благодарю всех за ответы
Тот код, который я написал, собственно весь, может кто-нить протестит?
2 GSerg: мне кажется, что и с помощью процедур можно передавать аргументы (не только через функции).....

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 21.03.2003 (Пт) 13:06

2 GSerg что Dim As New, что Dim а потом Set New все едино ;)

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 21.03.2003 (Пт) 13:08

Calvin писал(а):Тот код, который я написал, собственно весь...

Вот тут собака и порылась. Если это весь код, то возникает вопрос: где объявление переменной myVar?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 21.03.2003 (Пт) 13:43

Я то имел в виду код КЛАССА! А не того модуля где он вызывается. :!:

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 21.03.2003 (Пт) 14:50

2 Skiperski: работает, спасибо за подсказку, я в модуль добавил
Код: Выделить всё
Dim myVar as new myClass

И все же довольно странно - я думал, что с помощью оператора new объявляется экземпляр класса, а не переменная какого-нибудь свойства. По идее, если мы обращаемся к свойству
Код: Выделить всё
ddd.name22="экземпляр 1"

то по идее myVar не нужно объявлять, но........(почему?)

ЗЫ Dim myVar as new myClass - мы тут экономим на "коде", можно и без Set :wink:


Вернуться в VBA

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

Сейчас этот форум просматривают: Google-бот и гости: 3

    TopList