El menú del proyecto de Microsoft Access, cuando termine con el Control de vista de árbol, se verá como la imagen que se muestra a continuación.
La imagen de arriba muestra la tercera opción del grupo de informes Informe personalizado está seleccionado y resaltado, con el formulario de parámetros de filtro de informe abierto, superpuesto a la pantalla de menú, para la entrada del usuario.
Antes de entrar en eso, en la Lección de la semana pasada, aprendimos cómo organizar los elementos relacionados en orden jerárquico, usando el control de vista de árbol de Microsoft, basado en el Muestra tabla de datos.
Hice un punto la semana pasada, que los elementos relacionados en los datos del control Tree View no necesariamente tienen que estar uno al lado del otro. Después de esto, tendrá más claro cómo actualizar Relative Claves de nodos secundarios, independientemente de su posición física de los registros en la tabla, pero en función de la relación con sus ID de nodos principales.
Esta ha sido la Tabla de Datos que hemos utilizado y terminado con el ejercicio de la semana pasada:
¿Puede agregar la siguiente lista de elementos al final de la tabla anterior y actualizar sus valores de campo ParentID para que la visualización de TreeView se vea como la imagen de muestra que se muestra a continuación:
Nuevos registros para Tabla campo relacionado con registro de elemento :
- Campo de texto.
- Campo numérico.
- Campo de fecha/hora.
- Campo de hipervínculo.
Formulario Controles relacionados:
- Cuadro de texto.
- Botones de comando.
- Cuadro combinado.
- Cuadro de lista.
Informe Controles relacionados:
- Cuadro de texto.
- Etiqueta.
- Cuadro gráfico.
Asigne valores ParentID a estos elementos para que la vista de árbol se vea como la siguiente imagen:
Ahora, procederemos con la creación de un menú de proyecto de MS-Access y aprenderemos lo que se necesita para crear uno. A continuación se muestra una imagen de menú simple:
Es un menú simple con solo tres grupos de opciones:formularios, vistas de informes y macros.
En Formularios Se dan dos opciones al grupo, la primera muestra el registro de la tabla del menú de controles de vista de árbol. La segunda opción muestra los mismos registros en modo de forma continua.
La primera opción en Vista de informe muestra un Informe sobre productos Categoría registros, de la tabla de categorías de NorthWind.accdb base de datos.
La segunda opción muestra el informe de lista de precios de productos.
El tercero opción abre un Parámetro Formulario para que el Usuario pueda establecer el Min mínimo y Max rango de valores mínimos de precios de lista, para filtrar datos para el informe de precios de lista de productos.
Bajo los procesos de macros Grupo, ambas opciones ejecutan Macro1 y Macro2 respectivamente y mostrar diferentes mensajes.
Necesitamos una tabla de menú con los registros de opciones anteriores con algunos campos adicionales, además de los campos de datos ID únicos, Descripción e ID de padre habituales de TreeView. La imagen de la tabla de menús se muestra a continuación:
Cree una tabla con la estructura anterior, agregue los registros anteriores y guárdela con el nombre Menú . La identificación el campo es Autonumérico, PID, y Tipo los campos son campos numéricos, otros son campos de texto.
Estamos familiarizados con los tres primeros campos de datos:el ID único , Descripción, y el ParentID Los campos. Aquí, he acortado el nombre del campo ParentID a PID .
Necesitamos cuatro campos más en la tabla de menú, un campo Tipo para el tipo de objeto Código, y tres campos Formulario , Informe, y Macro .
Tipo El campo contiene los códigos numéricos del tipo de objeto de acceso para identificar la opción en la que el usuario hizo clic.
- El campo Formulario es para Nombres de formulario, código de tipo de objeto 1,
- El campo de informe contiene nombres de informe, código de tipo de objeto 2,
- El campo macro es para nombres de macros, código de tipo de objeto 3.
En función de los números de código, podemos seleccionar los nombres de los objetos, de sus respectivos campos y llamar al DoCmd.Openform o Docmd.OpenReport o Docmd.RunMacro para ejecutar la acción en los clics del nodo secundario.
Ahora, necesitamos almacenar el código de tipo y el nombre del objeto en los nodos secundarios. Retomaremos ese tema cuando comencemos a Agregar los nodos al control Vista de árbol.
Necesitamos dos tablas de datos más para formularios e informes de muestra. Las Categorías Tabla y Productos Tablas, del NorthWind.accdb base de datos de muestra. Para ahorrarle tiempo, he adjuntado la base de datos de demostración con todos los objetos y programas al final de esta página para descargarla y probarla.
Cree dos formularios utilizando la tabla de menús con los nombres Entrada de datos y otro Formulario Vista de datos en continuo Modo formulario.
Cree dos informes, uno en la tabla de categorías con el nombre del informe:Categorías, otro informe sobre la Tabla de productos con el nombre Lista de productos . Añade una etiqueta larga control debajo del encabezado principal en el Informe de listado de productos y cambie el Valor de propiedad de nombre a Rango .
Cree un formulario pequeño con dos cuadros de texto independientes y cambie su nombre Valor de propiedad a Min &Máximo, como el diseño que se muestra a continuación:
Agregue dos botones de comando como se muestra arriba. Cambiar el título Valor de propiedad del primer botón para abrir informe t y el Nombre Valor de propiedad para cmdReport .
Cambie el título del segundo botón de comando a Cancelar y el Nombre Valor de propiedad para cmdCancel .
Muestre el módulo de código del formulario. Copie y pegue el siguiente código en el módulo de formulario y guarde el formulario:
Private Sub cmdOpen_Click() Dim mn, mx, fltr As String mn = Nz(Me![Min], 0) mx = Nz(Me![Max], 9999) If (mn + mx) > 0 Then fltr = "[List Price] > " & mn & " And " & "[List Price] <= " & mx DoCmd.OpenReport "Products Listing", acViewReport, , fltr, , fltr Else DoCmd.OpenReport "Products Listing", acViewReport End If End Sub Private Sub cmdCancel_Click() DoCmd.Close End Sub
Cuando el usuario establece un rango de valores ingresando el rango de precio de lista mínimo y máximo en sus respectivos cuadros de texto, se crea la cadena de criterios de filtro de informe. El filtro de informes El valor de la cadena se pasa a la Lista de productos Informe como parámetro del comando Abrir informe. El valor de Cadena de filtro también se pasa como OpenArgs (Argumento abierto) Parámetro.
El parámetro Filter filtra los datos del informe, en función de los criterios, especificados en los campos Min y Max, y el valor del argumento abierto se copia en el Rango. Título de la etiqueta cuando el informe está abierto.
Copie y pegue el siguiente código en la Lista de productos Módulo VBA del informe:
Private Sub Report_Open(Cancel As Integer) DoCmd.Close acForm, "Parameter" Me.Range.Caption = Nz(Me.OpenArgs, "") End Sub
-
Cree un nuevo formulario, con el nombre frmMenu, y agregue el Microsoft TreeView Control de la lista de controles Activex. Cambie el tamaño del control como se muestra en la Vista de diseño a continuación:
-
Cambie el nombre del control de vista de árbol a TreeView0 en la hoja de propiedades normal.
-
Agregue un botón de comando debajo del control Vista de árbol. Cambiar su Nombre Valor de propiedad para cmdExit y Título Valor de la propiedad para Salir .
-
Haga clic derecho en el control de vista de árbol y resalte el TreeCtrl_Object opción y seleccione Propiedades para mostrar la hoja de propiedades.
-
Cambie los siguientes valores de propiedad como se indica a continuación:
- Estilo =7 (tvwTreeLinesPlusMinusPictureText)
- Estilo de línea =1 (tvwRootLines)
- LabelEdit =1 (tvwManual)
La semana pasada hemos cambiado los dos primeros valores de propiedad. Cuando LabelEdit El valor predeterminado de la propiedad es 0 - tvwAutomático, Al hacer clic en el nodo dos veces (no hacer doble clic), el texto del nodo pasará al modo de edición y podrá cambiar el texto. Pero no actualizará directamente el campo de fuente de datos. Cambiándolo a 1 – tvwManual evitará que entre en modo de edición.
Podemos cambiar esto a través del código agregando las siguientes líneas en el procedimiento de evento Form_Load():
With Me.TreeView0.Object .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual End With
La semana pasada usamos el Form_Load() Procedimiento de evento para leer los valores del nodo de vista de árbol para crear los nodos secundarios y de nivel raíz. Necesitamos el mismo procedimiento aquí también con unas pocas líneas de código adicional.
Además de eso, necesitamos atrapar el Node_Click() Evento de Nodos para comprobar qué Opción ha seleccionado el Usuario.
Copie y pegue el siguiente código VBA en el módulo de formulario y guarde el formulario.
Option Compare Database Option Explicit Dim tv As MSComctlLib.TreeView Const KeyPrfx As String = "X" Private Sub Form_Load() Dim db As Database Dim rst As Recordset Dim nodKey As String Dim PKey As String Dim strText As String Dim strSQL As String Dim tmpNod As MSComctlLib.Node Dim Typ As Variant Set tv = Me.TreeView0.Object tv.Nodes.Clear
‘Change the TreeView Control Properties
With tv
.Style = tvwTreelinesPlusMinusPictureText
.LineStyle = tvwRootLines
.LabelEdit = tvwManual
.Font.Name = "Verdana"
End WithstrSQL = "SELECT ID, Desc, PID, Type,Macro,Form,Report FROM Menu;" Set db = CurrentDb Set rst = db.OpenRecordset(strSQL, dbOpenDynaset) Do While Not rst.EOF And Not rst.BOF If Nz(rst!PID, "") = "" Then nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc Set tmpNod = tv.Nodes.Add(, , nodKey, strText) 'Root-Level Node Description in Bold letters With tmpNod .Bold = True End With Else PKey = KeyPrfx & CStr(rst!PID) nodKey = KeyPrfx & CStr(rst!ID) strText = rst!Desc Set tmpNod = tv.Nodes.Add(PKey, tvwChild, nodKey, strText) 'Check for the presense of Type Code If Nz(rst!Type, 0) > 0 Then Typ = rst!Type Select Case Typ Case 1 'save type Code & Form Name in Node Tag Property tmpNod.Tag = Typ & rst!Form Case 2 'save type Code & Report Name in Node Tag Property tmpNod.Tag = Typ & rst!Report Case 3 'save type Code & Macro Name in Node Tag Property tmpNod.Tag = Typ & rst!Macro End Select End If End If rst.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub Private Sub cmdExit_Click() If MsgBox("Close Menu Form? ", vbYesNo, "cmdExit_Click()") = vbYes Then DoCmd.Close End If End Sub Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
‘Reset the earlier lighlight to normal
For Each nodOn In tv.Nodes
nodOn.BackColor = vbWhite
nodOn.ForeColor = vbBlack
Next‘changes BackColor to light Blue and ForeColor White
tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255)
tv.Nodes.Item(Node.Key).ForeColor = vbWhite‘—Highlight code ends-
varTag = Nz(Node.Tag, "") If Len(varTag) > 0 Then typeid = Val(varTag) objName = Mid(varTag, 2) End If Select Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Case 3 DoCmd.RunMacro objName End Select End Sub
En el Área de Declaración Global del Módulo, se declara el Objeto de Vista de Árbol. Una variable constante KeyPrfx se declara con el valor “X”.
El Form_Load() Procedimiento de evento del artículo de la semana pasada que hemos modificado con código adicional. He comentado sobre el nuevo segmento de Código para dar una indicación de lo que hace, pero explicaré lo que hace.
El procedimiento declara la base de datos, el conjunto de registros y cuatro variables de cadena. Las siguientes dos líneas declaran un objeto de nodo temporal:tmpNod y Escribir Se declaran variables variantes.
A continuación, el objeto TreeView tv se asigna con el TreeView0 Objeto en el Formulario. Los nodos existentes de TreeView0, si los hay, se borran con la declaración:tv.Nodes.Clear , en preparación para cargar todos los nodos nuevamente.
Hemos implementado el siguiente código para modificar las propiedades del control Tree View a través del código, en lugar de hacerlo a través de la hoja de propiedades.
With tv .Style = tvwTreelinesPlusMinusPictureText .LineStyle = tvwRootLines .LabelEdit = tvwManual .Font.Name = "Verdana" End With
La fuente de vista de árbol se cambia a Verdana. Además de eso, incorporaremos algunas funciones más, como expandir o contraer todos los grupos de menús con un solo clic, en lugar de expandir o contraer manualmente un grupo tras otro.
La nueva cadena SQL se modifica para agregar los nuevos campos de tipo de campo, formulario, informe y macro de la tabla de menú.
Se comprueba el primer registro de la tabla de menús para detectar la presencia de cualquier valor en el PID campo, si está vacío, entonces es un registro de nodo de nivel raíz. Se agrega al objeto de vista de árbol como el nodo de nivel raíz y su referencia se guarda en el tmpNod Objeto.
El Nodo tiene varias propiedades como Forecolor, Bold, y varios otros de los que hemos tomado el Bold Propiedad y asignado Verdadero para hacer el nivel raíz El aspecto del nodo es diferente al de sus nodos secundarios.
Si no es una entrada de Nodo Raíz, entonces tiene el valor PID, el programa toma Si no cláusula y el registro se agrega como un nodo secundario. Aquí, comprobamos el Tipo valor de campo. Si contiene uno de los tres valores 1, 2, o 3 luego debemos tomar el valor de Formulario, Informe o Nombre de macro junto con el Código de tipo y unirlos (como ”1Entrada de datos” , “Lista de 2 categorías” etc.) y guárdelo en la Etiqueta Propiedad de los nodos secundarios. Estamos familiarizados con la propiedad de etiqueta en los controles de acceso, como cuadros de texto, etiquetas, botones de comando y otros, pero rara vez la usamos.
El cmdExit_Click() Procedimiento cierra el Formulario de Menú si la respuesta del Usuario es afirmativa.
Cuando el usuario hace clic en un Child Node, el valor que hemos guardado en su Etiqueta La propiedad debe extraerse y verificarse para determinar qué hacer a continuación. Para esto, necesitamos un TreeView0_NodeClick() Procedimiento de evento.
Private Sub TreeView0_NodeClick(ByVal Node As Object) Dim varTag, typeid As Integer Dim objName As String, nodOn as MSComctlLib.Node If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
‘Reset the earlier lighlight to normal
For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn
‘changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends- varTag = Nz(Node.Tag, "") If Len(varTag) > 0 Then typeid = Val(varTag) objName = Mid(varTag, 2) End If Select Case typeid Case 1 DoCmd.OpenForm objName, acNormal Case 2 DoCmd.OpenReport objName, acViewPreview Case 3 DoCmd.RunMacro objName End Select End Sub
El procedimiento de evento Click() recibe la referencia del nodo en la que se hizo clic como Parámetro en el objeto Nodo . Al comienzo de este procedimiento, hemos declarado algunas variables.
Las siguientes líneas verifican si el nodo en el que se hizo clic está en un estado expandido o colapsado.
Normalmente, para expandir un Nodo, para mostrar sus Nodos secundarios ocultos, o hacemos clic en el + (símbolo más) en el lado izquierdo de un nodo o haga doble clic en el propio nodo. Si vuelve a hacer doble clic en el nodo o si hace clic en - (símbolo menos), se ocultarán los nodos secundarios.
Con el siguiente segmento de código podemos expandir o colapsar nodos secundarios con un solo clic:
If Node.Expanded = False Then Node.Expanded = True Else Node.Expanded = False End If
Las siguientes seis líneas ejecutables aseguran que el nodo que recibió el clic permanezca resaltado.
‘Reset the earlier Highlight to Normal
For Each nodOn In tv.Nodes nodOn.BackColor = vbWhite nodOn.ForeColor = vbBlack Next nodOn
‘Changes BackColor to light Blue and ForeColor White tv.Nodes.Item(Node.Key).BackColor = RGB(0, 143, 255) tv.Nodes.Item(Node.Key).ForeColor = vbWhite ‘—Highlight code ends-
A continuación, el valor de la propiedad de la etiqueta se lee en la varTag Variable. Si no está vacío, el valor se divide en dos partes. El valor numérico se extrae y se guarda en el Typid variable y la parte Nombre del objeto se guarda en la variable objName .
Según el valor de la variable Typid, Docmd se ejecuta para abrir el formulario, el informe o ejecuta la macro.
Agregaremos dos botones de comando más en la parte superior del menú. Uno para expandir todos los nodos con un clic y el segundo para colapsar todos los nodos.
- Agregue dos botones de comando más en el área superior del Control de vista de árbol como se muestra en el diseño a continuación.
- Cambiar el Nombre Valor de propiedad del botón de comando izquierdo para cmdExpand y el título para Expandir Todo .
- Del mismo modo, cambie el Nombre del botón de comando del lado derecho. Propiedad para cmdCollapse y el título para Contraer todo.
- Copie y pegue el siguiente código VBA debajo del código existente en el frmMenu Módulo de formulario y guarde el formulario.
Private Sub cmdExpand_Click() Dim Nodexp As MSComctlLib.Node For Each Nodexp In tv.Nodes If Nodexp.Expanded = False Then Nodexp.Expanded = True End If Next Nodexp End Sub Private Sub cmdCollapse_Click() Dim Nodexp As MSComctlLib.Node For Each Nodexp In tv.Nodes If Nodexp.Expanded = True Then Nodexp.Expanded = False End If Next Nodexp End Sub
Al principio de cmdExpand_Click() Evento, hemos declarado un objeto de nodo de vista de árbol NodExp. El Para . . . Siguiente loop toma un nodo a la vez y verifica si está en forma expandida o no. Si no, entonces es Expandido El valor de la propiedad se establece en Verdadero .
Del mismo modo, cmdCollapse_Click() El evento realiza una verificación similar y, si se encuentra en un estado expandido, el valor de la propiedad expandida se establece en False.
Todos los nodos del Control de vista de árbol completo se pueden expandir y hacer que todos sus nodos secundarios sean visibles a la vez o todos los nodos secundarios se mantengan ocultos excepto los nodos de nivel raíz.
Espero que hayas disfrutado creando el nuevo Menú para tu Proyecto. Si ejecuta la tarea de diseño paso a paso, su menú debería verse como la imagen de menú terminada que se muestra en la parte superior.
Durante el Año 2007, he diseñado un Menú en uno de mis Proyectos, para el Sistema de Contrato de Servicio de Vehículos, utilizando el Control de Tabulado con varias Páginas. Cada página tiene 10 o más opciones y para hacer que cada página aparezca a su vez en la misma área cuando el usuario hace clic en los botones de comando alineados a ambos lados del menú. Los botones de comando en el lado derecho también cambian, según la selección de el botón del lado izquierdo.
Haga clic para ampliar
Puede encontrar el artículo Diseño de menú con control de pestañas en este enlace:https://www.msaccesstips.com/2007/06/control-screen-menu-design.html
MÓDULO DE CLASES
- Módulo de clases MS-Access y VBA
- Matrices y objetos de clase VBA de MS-Access
- Clase base de MS-Access y objetos derivados
- VBA-Clase Base y Objeto Derivado-2
- Variantes de clase base y objeto derivado
- Módulo de clase y conjunto de registros de MS-Access
- Módulo de clase de acceso y clases contenedoras
- Funcionalidad de clase contenedora