Вопрос

Я действительно борюсь с чем-то здесь.У меня есть модуль класса, назовем его 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

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

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

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

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

Это было полезно?

Решение

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

Вероятно, вам придется объявить параметр функции как Object.

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

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

Другие советы

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

При этом попробуйте следующее:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top