visual studio propiedades para metodos los inscripcion hacer google formularios formulario eventos controles como class vba events ms-access commandbutton

class - studio - propiedades de un formulario en visual basic



Crear una clase para manejar eventos de control de formulario de acceso (2)

En su evento OnLoad puede agregar esta línea

Dim ctItem Dim listener As clListener For Each ctItem In Me.Controls If ctItem.ControlType = acCommandButton Then ''Changed to test whether control is a Command Button Set listener = New clListener Set listener.ct = ctItem listener.ct.OnClick = "[Event Procedure]" ''<------- Assigned the event handler listenerCollection.Add listener End If Next

Aunque no estoy seguro de si esto es más, se necesita menos código que hacer doble clic en OnClick en el diseñador y pegar en una llamada a método. Es genial sin importar.

Editar: Podrías cambiar tu clase así

Public WithEvents ct As Access.CommandButton ''Changed object type to something recognised by Access Public Function AddControl(ctrl as Access.CommandButton) as Access.CommandButton set ct = ctrl ct.OnClick = "[Event Procedure]" Set AddControl = ct End Function Public Sub ct_Click() MsgBox ct.Name & " clicked!" End Sub

Luego, en su forma, puede agregar un ct como este

For Each ctItem In Me.Controls If ctItem.ControlType = acCommandButton Then ''Changed to test whether control is a Command Button Set listener = New clListener listener.AddControl ctItem listenerCollection.Add listener End If Next

Ahora el controlador de eventos se agrega en la clase.

Intento crear una clase que manejará múltiples eventos de control en Access. Esto es para guardar la repetición de tipear muchas líneas de código idéntico.

He seguido la respuesta que se encuentra en la página siguiente, pero con algunos ajustes para adaptarla a Access Rahter que Excel.

¿Cómo asignar un procedimiento común para múltiples botones?

Mi código de clase a continuación:

Option Compare Database Public WithEvents ct As Access.CommandButton ''Changed object type to something recognised by Access Public Sub ct_Click() MsgBox ct.Name & " clicked!" End Sub

Mi código de formulario a continuación:

Option Compare Database Private listenerCollection As New Collection Private Sub Form_Load() Dim ctItem Dim listener As clListener For Each ctItem In Me.Controls If ctItem.ControlType = acCommandButton Then ''Changed to test whether control is a Command Button Set listener = New clListener Set listener.ct = ctItem listenerCollection.Add listener End If Next End Sub

He notado con comentarios dónde hice cambios al código de Excel (de trabajo). Creo que el problema viene con la declaración de objeto en la clase. Nota: no se producen errores durante este procedimiento; simplemente no desencadena el evento.

¡Gracias por adelantado!

Editar:

Desde entonces, reduje el problema a que no haya ''[Procedimiento de evento]'' en el evento ''Al hacer clic''. Si lo agrego manualmente, la clase funciona como se esperaba. Obviamente, no quiero tener que agregar estos manualmente - derrota el objeto. ¿Alguna idea de cómo voy a hacer esto?


Un enfoque genérico para manejar la entrada de Access Form Controls con un módulo de clase:

Este código fue diseñado para manejar una aplicación escrita dentro de una ventana emergente. El formulario principal contiene un control de pestañas donde cada pestaña contiene su propio subformulario a una tabla secundaria vinculada o una tabla independiente. El uso o no uso de un control de tabulación no debe hacer ninguna diferencia en el procesamiento del módulo de clase.

El código se puede recortar para satisfacer las necesidades de su aplicación. Por ejemplo, uno podría eliminar los controles que uno no está utilizando desde el módulo de clase. Del mismo modo, la subrutina de colección de controles puede ser selectiva utilizando la instrucción TypeName (Ctl) para filtrar los controles que se agregan a la colección.

En un módulo de clase llamado clsMultipleControls ponga el siguiente código.

Option Compare Database Option Explicit Private m_PassedControl As Control Private WithEvents atch As Attachment Private WithEvents bfrm As BoundObjectFrame Private WithEvents chk As CheckBox Private WithEvents cbo As ComboBox Private WithEvents btn As CommandButton Private WithEvents cctl As CustomControl Private WithEvents img As Image Private WithEvents lbl As Label Private WithEvents lin As Line Private WithEvents Lst As ListBox Private WithEvents frm As ObjectFrame Private WithEvents optb As OptionButton Private WithEvents optg As OptionGroup Private WithEvents pg As Page Private WithEvents pgb As PageBreak Private WithEvents Rec As Rectangle Private WithEvents sfm As SubForm Private WithEvents tctl As TabControl Private WithEvents txt As TextBox Private WithEvents tgl As ToggleButton Property Set ctl(PassedControl As Control) Set m_PassedControl = PassedControl Select Case TypeName(PassedControl) Case "Attachment" Set atch = PassedControl Case "BoundObjectFrame" Set bfrm = PassedControl Case "CheckBox" Set chk = PassedControl Case "ComboBox" Set cbo = PassedControl Case "CommandButton" Set btn = PassedControl Case "CustomControl" Set cctl = PassedControl Case "Image" Set img = PassedControl Case "Label" Set lbl = PassedControl Case "Line" Set lin = PassedControl Case "ListBox" Set Lst = PassedControl Case "ObjectFrame" Set frm = PassedControl Case "OptionButton" Set optb = PassedControl Case "OptionGroup" Set optg = PassedControl Case "Page" Set pg = PassedControl Case "PageBreak" Set pgb = PassedControl Case "Rectangle" Set Rec = PassedControl Case "SubForm" Set sfm = PassedControl Case "TabControl" Set tctl = PassedControl Case "TextBox" Set txt = PassedControl Case "ToggleButton" Set tgl = PassedControl End Select End Property

En la parte superior del módulo de Formulario principal, coloque el siguiente código.

Public collControls As Collection Public cMultipleControls As clsMultipleControls

En el evento Load del formulario principal, coloque el siguiente código.

GetCollection Me

En la parte inferior del código del Formulario principal, coloque la siguiente subrutina pública recursiva:

Public Sub GetCollection(frm As Form) Dim ctl As Control On Error Resume Next Set collControls = collControls On Error GoTo 0 If collControls Is Nothing Then Set collControls = New Collection End If For Each ctl In frm.Controls If ctl.ControlType = acSubform Then GetCollection ctl.Form Else Set cMultipleControls = New clsMultipleControls Set cMultipleControls.ctl = ctl collControls.Add cMultipleControls End If Next ctl end sub

Recomiendo dar a cada control en el formulario y sus subformularios un nombre único para que pueda utilizar fácilmente la instrucción Select basada en el nombre de control para efectuar el control de procesamiento en cada evento de módulo de clase. Por ejemplo, cada evento de cambio de cuadro de texto se enviará al evento txt_change en el módulo de clase donde puede usar la propiedad m_PassedControl.name en una instrucción select para dirigir qué código se ejecutará en el control pasado.

El evento de selección es bastante útil si tiene múltiples controles que recibirán el mismo procesamiento de entrada de entrada.

Uso el evento Main Form Load en lugar del evento Activate porque un formulario emergente (y sus subformularios) no activan los eventos Activate o Deactivate.

También se puede pasar el m_PassedControl a una subrutina en un módulo regular si tiene que tener un procesamiento largo para acomodar.

Desafortunadamente, Access no activa automáticamente los eventos de VBA a menos que realmente configure el evento en el módulo de VBA. Por lo tanto, si desea utilizar un evento de cambio de cuadro de texto, debe asegurarse de que el evento de cambio de cuadro de texto esté realmente configurado en el módulo vba correspondiente. No necesita agregar ningún código al evento, pero el evento vacío debe estar allí o el evento y su módulo de clase equivalente no se activará. Si alguien sabe de un trabajo para esto, estaría encantado de escucharlo.

Encontré esta estructura de módulo de clase básica en un ejemplo de código de forma de usuario de Excel en http://yoursumbuddy.com/userform-event-class-multiple-control-types/ . Es una estructura flexible. He creado versiones que funcionan con formas de usuario de Excel, hojas de trabajo de Excel con controles ActiveX, y ahora para formularios de acceso.

Nota de seguimiento: El código anterior funciona bien con Access 2013 de 64 bits en Windows 10 de 64 bits. Pero falla en Access 2013 de 64 bits en Windows 7 de 64 bits cuando intenta cerrar el formulario principal. La solución es mover el siguiente código del formulario principal a un módulo de VBA.

Public collControls As Collection Public cMultipleControls As clsMultipleControls