VBA UserForm Object - PullRequest
       14

VBA UserForm Object

1 голос
/ 13 февраля 2009

Я действительно борюсь с чем-то здесь. У меня есть модуль класса, назовем его FormMan, в котором есть множество методов, относящихся к большому количеству пользовательских форм, которые есть в моем проекте. Один конкретный метод должен вызываться из множества разных мест, и он довольно прост - он просто добавляет определенное количество элементов управления в форму и увеличивает высоту формы для размещения этих новых элементов управления.

Пользователь передает количество элементов управления и форму пользователя.

oF.AddControlsToForm iNumberOfControls,frmTest

В модуле класса FormMan:

Public Sub Addcontrols(iNum as integer, oForm as userform)

//stuff happens here, oForm is used extensively

oForm.Height = i  //object does not support this property or method
frmTest.Height = i //works

oForm.Show //object does not...
frmTest.show  //works

end sub

В окне Locals у oForm нет свойства height, поэтому достаточно справедливо. Но oForm был определен как frmTest. Я могу сказать oForm.BackColor = vbred, и я могу установить ctl = oform.TextBox1 например

Это должна быть общая процедура, которая может добавить группу элементов управления в любую форму. Я пытался загрузить и показать форму, прежде чем назначить ее для oForm.

Почему высотно-показательные свойства и методы пользовательских форм, но не объектов, объявлены как пользовательские формы? Что я делаю не так?

Очень ценю любую помощь.

Ответы [ 2 ]

4 голосов
/ 13 февраля 2009

Проблема в том, что объекты UserForm и frmTest не относятся к одному и тому же типу. Фактически, frmTest является подтипом UserForm, который расширяет его, добавляя свойство Height среди других членов.

Возможно, вам придется прибегнуть к объявлению параметра вашей функции как объекта.

Public Sub Addcontrols(iNum as integer, oForm as Object)

Это должно работать так, как вы хотите, хотя, к сожалению, вы будете жертвовать безопасностью типов. Большинство концепций ОО, как правило, распадаются в контексте VBA.

1 голос
/ 13 февраля 2009

Главное, что следует помнить о VBA, это то, что это квази-OO, а не full-OO. Я столкнулся с множеством дурацких проблем, связанных с этой проблемой, и теперь я стараюсь полностью не полагаться на последовательность VBA.

Как говорится, попробуйте это:

Dim fname = oForm.Name (or whatever the property is for this subobject)
With VBA.UserForms.Add(fname)
   .Height = x
   .Show
End With

Разве это не так странно?!?! У меня нет готового и ожидающего примера кода, поэтому я не могу гарантировать успех, но это похоже на правильный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...