Question

Je suis vraiment aux prises avec quelque chose. J'ai un module de classe, nous allons l'appeler FormMan qui a un tas de méthodes relatives au grand nombre de userforms j'ai dans mon projet. Une méthode particulière doit être appelé à partir d'un grand nombre de différents endroits et est assez simple -. Il ajoute simplement un nombre défini par l'utilisateur des contrôles à une forme et étend la hauteur des formes pour accueillir ces nouveaux contrôles

L'utilisateur transmet le nombre de contrôles et le formulaire utilisateur.

oF.AddControlsToForm iNumberOfControls,frmTest

Dans le module de classe 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

Dans la fenêtre Locals, oForm n'a pas de propriété de hauteur, donc assez juste. Mais oForm a été défini comme frmTest. Je peux dire oForm.BackColor = vbred, et je peux mettre ctl = oform.TextBox1 par exemple

Ceci est censé être une procédure générique qui peut ajouter un tas de contrôles à quelque forme. J'ai essayé le chargement et montrant la forme avant de l'assigner à oForm.

Pourquoi les propriétés de hauteur et montrent et les méthodes de userforms mais pas d'objets déclarés comme userforms? Qu'est-ce que je fais mal?

vraiment apprécier toute aide.

Était-ce utile?

La solution

Le problème est ici que les objets UserForm et frmTest ne sont pas du même type. En fait, frmTest est un sous-type de UserForm qu'il étend en ajoutant la propriété de hauteur, entre autres membres.

Vous aurez probablement à recourir à déclarer votre paramètre de fonction objet.

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

Cela devrait fonctionner comme vous le souhaitez, bien que vous malheureusement compromettre la sécurité de type. La plupart des concepts OO ont tendance à se désagréger dans le contexte de VBA.

Autres conseils

La première chose et avant tout de se rappeler à propos de VBA est qu'il est quasi-OO, pas en plein OO. J'ai rencontré beaucoup de problèmes loufoques autour de cette question et je tends maintenant à éviter de se fier entièrement sur la cohérence de VBA.

Cela étant dit, essayez ceci:

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

est-il pas si agréablement bizarre?!?! Je n'ai pas un exemple de code prêt et en attente, je ne peux pas garantir le succès, mais cela se sent comme la bonne approche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top