Red de conocimiento informático - Material del sitio web - Implementando menús dinámicos en PowerBuilder

Implementando menús dinámicos en PowerBuilder

He leído en algunos libros que implementar menús dinámicos en lenguaje C requiere llamar a muchas funciones API, pero aquí quiero adoptar un enfoque diferente, utilizando las propiedades y algoritmos recursivos proporcionados por PowerBuilder. el proceso de creación de un menú dinámico. Cabe señalar que el menú dinámico mencionado aquí se refiere al menú definido en la fuente de datos externa, que no contiene ningún elemento de menú. El programa debe generar elementos de menú para cada elemento de menú definido

Definición de la estructura de datos del menú

Para implementar un menú dinámico, primero debe diseñar una estructura de datos de menú razonable cuyos datos La fuente puede ser cualquier DBMS, o incluso un archivo de texto TXT (siempre que se pueda establecer una jerarquía razonable)

El menú es como un control de árbol con una estructura de forma jerárquica; El menú es como un control de árbol con una estructura de secuencia jerárquica. Por lo tanto, al definir la estructura de datos, debe elegir un modelo que pueda representar gráficamente la relación entre padre, hijo y hermano. vista de árbol, con dos La forma de la jerarquía de dígitos define la estructura de datos, es decir, el nivel determina el número de capas, el número determina la relación entre hermanos y la relación jerárquica de dos dígitos determina la relación entre padre e hijo. Por ejemplo, en el siguiente ejemplo, la estructura de datos correspondiente del menú es la siguiente. Por ejemplo, la estructura de datos correspondiente al menú que se muestra en la figura es la siguiente

Esta estructura de menú es muy adecuada para usar algoritmos recursivos al construir estructuras de menú, por lo que podemos seguir el algoritmo de recorrido de árbol Cree un objeto de menú con estructura de árbol

A continuación, defina la estructura de datos del menú. La estructura de datos del menú debe contener los siguientes elementos básicos: nombre del menú tipo de menú número de menú texto del elemento del menú identificación del elemento del menú ejecución. código del elemento del menú estilo de visualización del menú Como se muestra en la siguiente tabla

II Creación de menú dinámico

Diagrama de flujo

Descripción del diagrama de flujo

Como Como se muestra en la figura anterior, toda la creación del menú El proceso se divide en dos partes: inicializar el menú y configurar las propiedades del menú. El menú de inicialización es un algoritmo recursivo que lee los datos del menú de la fuente de datos.

Los datos leen un elemento de menú cada vez, crean un objeto de elemento de menú y utilizan el método de creación en powerbuilder para crear el menú paso a paso. Primero, defina un objeto de instancia de menú. El menú aquí se refiere al menú principal en lugar del menú emergente. Menú emergente Dado que el menú emergente es diferente del menú principal, la diferencia entre los menús se presentará más adelante. El principio básico de la creación de menús es muy simple. un objeto de menú primero oculte los elementos del menú, luego muestre el objeto de menú como se muestra a continuación. Luego muestre el objeto de menú de la siguiente manera. /Elemento de menú pasado como función recursiva menu am_obj //Elemento de menú pasado como función recursiva m_menu_item? m_menu_item? lam_root?// Objeto de menú m_menu_item es un //objeto de menú predefinido, sin elementos de menú //Crear objeto de menú lam_root item[ai_item_serial_no ] = crear m_menu_item?//Enganchar el objeto de menú recién creado al objeto de menú existente am_obj? Enganchar al objeto de menú existente am_obj = lam_root item[ai_item_serial_no] // Las dos oraciones siguientes se utilizan para mostrar el menú creado lam_root Hide() ?//Ocultar el objeto de menú lam_root Show()?//Mostrar el objeto de menú

Coloque la declaración anterior en el proceso recursivo para construir toda la estructura del menú

Al crear el menú , necesita obtener el ID del elemento del menú, que es un identificador único que se utiliza para capturar la operación de respuesta del menú. El método para obtener el ID del elemento del menú se ha probado repetidamente en diferentes sistemas y se ha encontrado un patrón. El ID de elemento del menú principal aumenta desde el principio y el ID de elemento del submenú aumenta desde el principio. Sobre esta base, se utiliza un algoritmo recursivo para generar identificadores de elementos para cada nivel de elementos del menú y almacenarlos en la base de datos.

Establecer estilo de menú Al crear un menú, se configuran tres estilos de visualización de menú. Estilo de texto Estilo de imagen Visualización mixta de texto e imágenes Para mejorar la eficiencia, al configurar cada estilo de menú, no se configurarán todos los menús principales, elementos de menú invisibles y elementos de menú con visualización de imagen indefinida, porque el estilo de texto es el estilo predeterminado. No se necesitan cambios. Esta parte del programador utiliza principalmente tres funciones API

Getsubmenu se utiliza para obtener el identificador del elemento de menú especificado. SetMenuItemBitmaps se utiliza para establecer el estilo de visualización del texto o el estilo de la imagen. La diferencia entre los dos casos es que el mapa de bits en el elemento del menú se elimina si los dos últimos dígitos de la función lo son, y el mapa de bits se agrega en el elemento del menú si los dos últimos dígitos son un identificador de imagen que se utiliza para configurar. el estilo de visualización de la imagen

Después de repetidas pruebas, descubrimos que si el nombre de la imagen para mostrar especificada es ***bmp, es ilegal. Después de repetidas pruebas, se descubrió que si el nombre de la imagen para mostrar especificada es un nombre ilegal como ***bmp, el efecto será un divisor

Durante todo el proceso de creación del menú, es necesario centrarse en el diseño de algoritmos de programa, métodos de acceso a datos y control de errores

) Los algoritmos de programa se refieren principalmente a algoritmos recursivos. En términos generales, existen dos tipos de algoritmos recursivos, a saber, FOR loop y DO... método de bucle while. Ambos son algoritmos de bucle, pero tienen diferentes eficiencias. Recomendamos que los usuarios elijan un método según sus propias habilidades, pero no escriban un bucle infinito. El bucle For es más simple e intuitivo y el bucle controla el número de iteraciones. (El método de bucle DO... while determina principalmente las hojas o ramas (es decir, los nodos principales) dentro del bucle, y llama a las hojas y ramas respectivamente, y al mismo tiempo se llama a sí mismo internamente para implementar llamadas recursivas).

Los datos del menú (como itemid) se envían a la base de datos en forma de una actualización del almacén de datos. Antes de esto, todos los datos que deben obtenerse del almacén de datos se obtienen mediante filtrado, es decir, utilizando setfilter() y filter. () funciones. Vale la pena señalar que de acuerdo con las reglas de programación de pares, después de filtrar y usar los datos en el almacén de datos, se deben escribir otro par de condiciones de filtro. Luego escriba un par de condiciones de filtro para el filtro de cadena vacía, como se muestra a continuación setfilter (condición) filtro () ...... proceso ...... setfilter () filtro ()

me gusta this Los datos también se pueden restaurar al estado inicial a tiempo para la próxima vez. Nadie puede garantizar que los datos de la estructura del menú en la base de datos no estén libres de errores, aunque no se trata de construir módulos. correcto o no, especialmente si aparece la estructura de datos jerárquica progresiva secundaria del menú. Los errores pueden causar que todo el proceso de compilación falle. Más gravemente, el programa puede cerrarse de manera anormal. Por lo tanto, al diseñar el manejo de errores del programa, debe considerar si hacerlo. finalice el proceso u omita el error y continúe el proceso. El autor recomienda que al diseñar el programa se debe considerar un cierto grado de redundancia y un cierto grado de redundancia. Sugiero que el diseño del programa tenga un cierto grado de redundancia y capacidades de corrección de errores, es decir

Cabe señalar que después de repetidas pruebas, encontramos que si los atributos del menú son de tipo de carácter, no se les puede asignar un valor nulo; de lo contrario, debe ser una cadena vacía; si es un tipo entero, debe ser el número entero predeterminado; de lo contrario, el programa informará un error;

Como puedes ver, las pruebas repetidas son muy importantes, no sólo para encontrar errores gramaticales y asegurar que el algoritmo es correcto, sino también para encontrar muchos errores que nos resultan difíciles de inferir.

III Procesamiento especial de menús emergentes

Dado que la definición de objeto y la llamada de los menús emergentes son diferentes de las de los menús principales, se requiere algún procesamiento especial. Manejo especial de menús emergentes Manejo especial de menús emergentes Dado que los menús emergentes se definen y llaman de manera diferente a los menús principales, este es un manejo especial de menús emergentes. Primero, defina un objeto de instancia de menú, que debe tener un elemento del menú raíz y luego conecte todos los elementos del menú emergente al elemento del menú raíz.

4 Manejo de eventos de respuesta del menú

Dado que los eventos de respuesta del menú se definen en la estructura de datos, después de crear el menú y el usuario hace clic en el menú, todo lo que el usuario debe hacer es obtenga el identificador del menú para saber qué menú se activó, luego busque la definición de evento correspondiente en la base de datos y comience a ejecutar la operación. El identificador del menú es itemid. Defina un evento personalizado ue_mouse_clicked EVENT_ID pbm_menuselect en la ventana donde se encuentra el menú. Hay dos parámetros disponibles en este evento: itemid y flag itemid es el identificador del objeto de menú activado. bandera correspondiente al número de mensaje de la ventana. El menú se activa cuando esta bandera no es igual al identificador. Por lo tanto, podemos definir una variable de instancia para contener el ID del elemento y luego llamar al evento del menú.

También hay una pregunta clave: ¿cuándo se activa el evento ue_mouse_clicked? Escriba el siguiente código en el evento en el que se hizo clic del objeto de instancia de menú definido por el usuario if then message StringParm = this is_ItemID // Pasar itemid como mensaje a iw_win postEvent( ue_menuitemclicked ) // ¿Activar el evento de ventana para procesar el final del mensaje if iw_win? define la variable de instancia de la ventana is_ItemID es una variable de instancia de tipo cadena, que se usa para guardar el ID del elemento del menú postEvent se usa para colocar el procesamiento de respuesta al final del evento del menú para evitar interferir con las operaciones previamente definidas lishixinzhi/Article/program /SQL /201311/16396