Domanda

Sono davvero alle prese con qualcosa qui. Ho un modulo di classe, chiamiamolo FormMan che ha un sacco di metodi relativi al gran numero di form che ho nel mio progetto. Un metodo particolare è quello di essere chiamato da un sacco di posti diversi ed è abbastanza semplice -. Aggiunge semplicemente un numero definito dall'utente di controlli a un form e si estende l'altezza forme di accogliere questi nuovi controlli

L'utente passa il numero di controlli e l'userform.

oF.AddControlsToForm iNumberOfControls,frmTest

Nel modulo di 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

Nella finestra Locals, oForm non ha una proprietà altezza, in modo abbastanza equo. Ma oForm è stato definito come frmTest. Posso dire oForm.BackColor = vbred, e posso impostare ctl = oform.TextBox1 ad esempio

Questa è destinata ad essere una procedura generica che può aggiungere un po 'di controlli per qualsiasi forma. Ho provato il carico e che mostra la forma prima di assegnarlo a oForm.

Perché sono di altezza e mostrare proprietà ei metodi di form, ma non di oggetti dichiarati come userforms? Che cosa sto facendo di sbagliato?

Davvero apprezzare alcun aiuto.

È stato utile?

Soluzione

Il problema è che gli oggetti UserForm e frmTest non sono dello stesso tipo. Infatti, frmTest è un sottotipo di Form utente che si estende aggiungendo la proprietà Height, tra gli altri membri.

Probabilmente dovrete ricorrere a dichiarare il vostro parametro della funzione come oggetto.

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

Questo dovrebbe funzionare come si desidera, anche se purtroppo sarete sacrificare la sicurezza tipo. La maggior parte dei concetti OO tendono a sfaldarsi nel contesto della VBA.

Altri suggerimenti

La cosa prima di tutto c'é da sapere su VBA è che è quasi-OO, non full-OO. Ho incontrato un sacco di problemi strambi a questo problema e così ora mi tendo a evitare di fare affidamento esclusivamente sulla coerenza di VBA.

Detto questo, prova questo:

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

Non è così piacevolmente strano?!?! Non ho un esempio di codice pronto e in attesa, quindi non posso garantire il successo, ma questo si sente come il giusto approccio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top