Pergunta

Estou realmente lutando com alguma coisa aqui. Eu tenho um módulo de classe, vamos chamá-lo FormMan que tem um monte de métodos relacionados com o grande número de userforms eu tenho no meu projeto. Um método particular é para ser chamado de um monte de lugares diferentes e é muito simples - ele simplesmente acrescenta um número definido pelo usuário de controles a um formulário e se estende a altura formas para acomodar esses novos controles

.

O utilizador passa o número de controlos e o userForm.

oF.AddControlsToForm iNumberOfControls,frmTest

módulo de classe Em 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

Na janela Locals, oForm não tem uma propriedade de altura, de modo justo. Mas oForm tem sido definida como frmTest. Posso dizer oForm.BackColor = vbred, e eu posso definir ctl = oform.TextBox1 por exemplo

Este pretende ser um procedimento genérico que pode adicionar um monte de controles de qualquer forma. Eu tentei carregamento e mostrando o formulário antes de atribuí-la a oForm.

Por que altura e mostram propriedades e métodos de userforms mas não de objetos declarados como userforms? O que estou fazendo de errado?

Realmente aprecio qualquer ajuda.

Foi útil?

Solução

O problema aqui é que os objetos UserForm e frmTest não são do mesmo tipo. Na verdade, frmTest é um subtipo de UserForm que se estende-lo adicionando a propriedade de altura, entre outros membros.

Você provavelmente vai ter que recorrer a declarar seu parâmetro de função como objeto.

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

Isso deve funcionar como você deseja, embora, infelizmente, você vai ser sacrificar a segurança tipo. A maioria dos conceitos OO tendem a desmoronar no contexto do VBA.

Outras dicas

O primeiro e mais importante a lembrar sobre VBA é que é quasi-OO, não full-OO. Eu correr em um monte de problemas malucos em torno desta questão e por isso eu agora tendem a evitar confiar inteiramente na consistência do VBA.

Dito isto, tentar fazer isso:

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

Não é tão agradavelmente bizarro?!?! Eu não tenho um exemplo de código pronto e esperando, por isso não posso garantia de sucesso, mas este se sente como a abordagem correta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top