Red de conocimiento informático - Computadora portátil - Tutorial básico de DELPHI: desarrollo de componentes personalizados de Delphi (2) [4]

Tutorial básico de DELPHI: desarrollo de componentes personalizados de Delphi (2) [4]

 ⑵ Defina el tipo de proceso de procesamiento

Una vez que decida generar un evento, debe definir cómo se maneja el evento. Esto es para decidir el tipo de proceso de procesamiento del evento. En la mayoría de los casos, defina el proceso de procesamiento de eventos. Los tipos son tipos de notificación simples (TNotifyEvent) y tipos de eventos definidos

Los eventos de notificación solo le informan que ocurrió un evento específico sin describir cuándo y dónde se utilizan los eventos de notificación. solo un tipo TObject. El parámetro es Remitente. Sin embargo, todos los controladores de eventos de notificación saben qué tipo de evento ocurre y en qué componente ocurre. Por ejemplo, el evento Click es un tipo de notificación. Al escribir el controlador de eventos Click, sabes qué. tipo de evento ocurre y en qué componente ocurre. El evento de notificación en el que se hace clic es un proceso unidireccional y no proporciona un mecanismo de retroalimentación

En algunos casos, no es suficiente saber solo qué evento ocurrió y en qué componente ocurrió. Si ocurre un evento clave, el proceso de procesamiento de eventos a menudo necesita saber el usuario ¿Qué tecla fue presionada? En este caso, el controlador de eventos necesita parámetros que contengan la información necesaria sobre el evento. respuesta a un mensaje, entonces los parámetros pasados ​​al evento deberían provenir preferiblemente directamente de los parámetros del mensaje

p>

Debido a que todos los controladores de eventos son procedimientos, la única forma de devolver información de el controlador de eventos se realiza a través del parámetro var. Los componentes personalizados pueden usar esta información para decidir si manejar el evento y cómo hacerlo después de que se ejecute el controlador de eventos del usuario.

Por ejemplo, todos los eventos de pulsación de teclas (OnKeyDown, OnKeyUp y OnKeyPressed). ) pasa el valor de la clave a través del parámetro var llamado clave Para que la aplicación vea las diferentes claves incluidas en el evento, el controlador de eventos puede cambiar el valor de la variable clave

 ⑶ Declarar eventos

.

Una vez que haya decidido el tipo de proceso de manejo de eventos, debe prepararse para declarar los punteros de método y los atributos del evento. Para que a los usuarios les resulte más fácil comprender la función del evento, se debe proporcionar el evento. un significado significativo. El nombre también debe ser coherente con el nombre de propiedades similares en el componente.

Los nombres de todos los eventos estándar en Delphi comienzan con On. Esto es solo por conveniencia. El inspector de objetos analiza el tipo de propiedad. Determina si el atributo es un evento. Todos los atributos del puntero del método se consideran eventos y aparecen en la página del evento.

⑷ Llamar a eventos

Generalmente. Hablando, es mejor centrar las llamadas en eventos. Se dice que al crear un método virtual en el componente para llamar al proceso de manejo de eventos del usuario y proporcionar cualquier procesamiento predeterminado se deben considerar los siguientes dos puntos al llamar al evento.

● Se deben permitir eventos vacíos

● El usuario puede anular el manejo predeterminado

No está permitido que el controlador de eventos vacío genere errores. Esto significa que la función normal. del componente personalizado no puede depender de la respuesta del controlador de eventos del usuario. De hecho, el controlador de eventos vacío debería generar el mismo resultado que sin controlador de eventos

Los componentes no deberían requerir que los usuarios los usen en especial. Dado que un controlador de eventos vacío debería comportarse igual que ningún controlador de eventos, el código que llama al controlador de eventos del usuario debería verse así:

si está asignado (OnClick) y luego OnClick (Self)

<. p>{Realizar procesamiento predeterminado}

No debería haber dicho código

si está asignado (OnClick) entonces

OnClick (Self)

else

… {Realizar procesamiento predeterminado}

Para algunos tipos Para eventos, los usuarios pueden querer anular el manejo predeterminado o incluso eliminar

Para ayudar a los usuarios a implementar esta funcionalidad, debe pasar el parámetro var al controlador de eventos y verificar un valor cuando el controlador de eventos regrese. Un controlador de eventos vacío tiene el mismo efecto que un controlador sin eventos porque un controlador de eventos vacío no lo tiene. Cambie el valor de cualquier parámetro var para que el procesamiento predeterminado siempre ocurra después de llamar al controlador de eventos vacío

Por ejemplo, al procesar el evento Key Press, el usuario puede suprimirlo estableciendo el valor de la clave del parámetro var. al carácter nulo (#) El código de procesamiento predeterminado del componente es el siguiente

si está asignado (OnkeyPress) y luego OnkeyPress (autoclave)

if key lt;gt # entonces; {Realizar procesamiento predeterminado};

El código real será ligeramente diferente a este porque solo maneja mensajes de ventana, pero la lógica de procesamiento es la misma. De forma predeterminada, el componente primero llama a cualquier controlador de eventos asignado por el usuario y luego lo ejecuta. procesamiento estándar si los controladores de eventos del usuario configuran la clave en vacía y el componente omitirá el procesamiento predeterminado

Procesamiento de mensajes

Un aspecto muy crítico en la programación tradicional de Windows es el procesamiento de los mensajes enviados por Windows a la aplicación Delphi ha ayudado. Ha procesado los mensajes más comunes, pero en el proceso de creación de componentes, es posible que Delphi no tenga un método de procesamiento y tenga que procesar los mensajes usted mismo, o puede que haya creado mensajes nuevos. y necesita procesarlos

Aprenda a dominar los requisitos de procesamiento de mensajes de Delphi. Domine los siguientes tres aspectos

● Comprender el sistema de procesamiento de mensajes

● Modificar (cambiar) el método de procesamiento de mensajes

● Crear un nuevo método de procesamiento de mensajes

Comprender el sistema de procesamiento de mensajes

Todos los objetos de Delphi tienen mecanismos internos para procesar mensajes, como llamar a mensajes Métodos de procesamiento o procedimientos de procesamiento de mensajes La idea básica del procesamiento de mensajes es que el objeto recibe ciertos mensajes y los envía. Esto se logra llamando al método correspondiente al mensaje recibido. al mensaje, luego se llama al procesamiento predeterminado. El siguiente diagrama muestra el sistema de entrega de mensajes.

La biblioteca de componentes de Delphi define todos los mensajes de Windows (generalmente, no es necesario cambiar este sistema de entrega de mensajes (incluido el usuario). -mensajes definidos) convertidos directamente en llamadas a métodos de objetos, siempre que se establezca el método de procesamiento de mensajes

 ⑴¿Qué hay en los mensajes de Windows?

Los mensajes de Windows son registros de datos que contienen varios campos útiles. El más importante de los registros es un valor de tamaño entero. Este valor identifica el mensaje. Windows define una gran cantidad de unidades de biblioteca de mensajes. mensajes de identificación de todos los mensajes Otra información útil incluye los dos parámetros de campo y el campo de resultado. Los dos parámetros son bits y bits respectivamente. El código de Windows siempre se refiere a ellos como wParam y lParam. Recuerde que Microsoft ha nombrado cada parámetro para que sea más fácil comprender la información que acompaña a estos mensajes. Por ejemplo, los parámetros del mensaje WM_KEYDOWN se denominan vkey y keydata, lo que proporciona información más descriptiva que wParam y lParam

Delphi define tipos de registros específicos para diferentes tipos de mensajes. Por ejemplo, los mensajes del mouse pasan las coordenadas xey del evento del mouse en el parámetro largo. Uno está en la palabra alta y el otro en la palabra baja. Al utilizar la grabación de mensajes con el mouse, no necesita preocuparse por qué palabra es Qué coordenadas se reemplazan por lParamLo y lParamHi por los nombres Xpos e Ypos al hacer referencia a estos parámetros

 ⑵ Método de envío

Cuando la aplicación crea una ventana, se registra una ventana en el proceso del Kernel de Windows

El procedimiento de ventana es una función que procesa mensajes de ventana. Tradicionalmente, el procedimiento de ventana incluye una expresión de caso. Cada entrada en la expresión es cada mensaje que la ventana necesita procesar. Cada vez que crea una ventana, debe crear un procedimiento de ventana.

Delphi simplifica el envío de mensajes en los siguientes tres aspectos

● Cada componente hereda un sistema de envío de mensajes completo

● El sistema de envío tiene procesamiento predeterminado y los usuarios solo necesitan para definir los mensajes a los que quieren responder. El método de procesamiento

● Puede modificar parte del procesamiento de mensajes y confiar en métodos heredados para completar la mayor parte del procesamiento.

La mayor ventaja. La característica de este tipo de sistema de entrega de mensajes es que los usuarios pueden enviar de forma segura cualquier mensaje en cualquier momento. Si el componente no define un método de manejo para el mensaje, el método de manejo predeterminado resolverá el problema y generalmente lo ignorará. Delphi registra un método llamado MainWndProc para cada tipo de componente en la aplicación como El procedimiento de ventana MainWndProc contiene un bloque de manejo de excepciones, que completa la transferencia de registros de mensajes desde Windows a un método virtual llamado WndProc y maneja excepciones llamando al método HandleException del objeto de aplicación

MainWndProc es un método estático que no contiene ninguna especificación de mensaje. La personalización del método de procesamiento se produce en WndProc porque cada tipo de widget puede anular este método para adaptarse a necesidades específicas. Los métodos de WndProc realizan comprobaciones para cada condición que afecta sus necesidades. procesamiento para detectar mensajes no deseados, como cuando El componente ignora los eventos del teclado cuando se arrastra, por lo que WndProc de inControl solo transmite eventos de teclado cuando no hay arrastre. Finalmente, WndProc llama al método Dispatch. Este método es un método estático heredado de TObject para determinar qué. método para manejar el mensaje.

Dispatch Utilice el campo Msg del registro de mensaje para determinar cómo enviar un mensaje específico. Si el componente ha definido un método de procesamiento para el mensaje, Dispatch llama al método. Dispatch llama al método de procesamiento predeterminado.

Cambiar el método de procesamiento de mensajes

Antes de cambiar el método de manejo de mensajes de un widget personalizado, primero averigüe qué es lo que realmente desea hacer con Delphi. Los mensajes de Windows se convierten en eventos que tanto los escritores como los usuarios de widgets pueden manejar. En general, debe cambiar el comportamiento de procesamiento de eventos en lugar de cambiar el comportamiento de procesamiento de mensajes.

Para cambiar el comportamiento de procesamiento de mensajes, debe hacerlo. anular el método de procesamiento de mensajes y también proporcionar un mensaje de captura para evitar que el componente procese el mensaje

 ⑴ Anular el método de procesamiento

Para cambiar la forma en que un componente maneja un mensaje específico , debe anular el método de procesamiento de ese mensaje. Si el componente no maneja el mensaje, debe declarar un nuevo método de procesamiento de mensajes.

Para anular el método de procesamiento de mensajes, debe utilizarlo. el mismo método de procesamiento de mensajes en el componente. Para declarar un nuevo método usando un índice de mensaje, no use la directiva de anulación. Debe usar la directiva Mensaje y el índice de mensaje correspondiente

. para anular un método que maneja el mensaje WM_PAINT, debe volver a declarar el método WMPaint

tipo

TMyComponent=class(…)

procedimiento WMPaint (var Mensaje: MPaint) message WM_PAINT;

end;

⑵ Usar parámetros del mensaje

Dentro del método de procesamiento del mensaje, el componente personalizado accede a todos los parámetros del registro del mensaje porque El mensaje es siempre un parámetro var. El proceso de procesamiento de eventos puede cambiar el valor del parámetro si es necesario. El campo Resultado es un parámetro que se cambia con frecuencia. El valor de retorno del mensaje al que se hace referencia en la documentación.

Devuelto por SendMessage

Debido a que el tipo de parámetros de mensaje del método de procesamiento de mensajes cambia con el mensaje que se procesa, debe consultar el nombre y el significado de los parámetros en el documento de mensaje de Windows si desea usarlo. por alguna razón, el parámetro de mensaje de estilo antiguo (wParam lParam) se puede usar con el tipo general TMessage para determinar el mensaje

 ⑶ Capturar el mensaje

En algunos casos, es posible que desee el. componente personalizado para ignorar un determinado mensaje. Esto significa que se impide que el componente envíe el mensaje a su método controlador. Para capturar el mensaje de esta manera, el método virtual WndProc se puede anular.

El WndProc. El método bloquea el mensaje antes de pasarlo al método Dispatch, que a su vez determina qué método capturar el mensaje. Procesar mensajes anulando el componente WndProc le brinda la oportunidad de filtrar mensajes antes de enviarlos.

WndProc generalmente es. anulado de esta manera:

procedure TMyControl WndProc(var Message: TMessage)

 begin

 {Determinar si continuar procesando}

heredado WndProc (Mensaje)

end;

El siguiente código es TControl La parte WndProc de TControl define el rango completo de mensajes del mouse que se filtrarán cuando el usuario arrastre y suelte el control.

 procedimiento TControl WndProc(var Mensaje: TMessage)

 begin

if (Message Msg gt; = WM_MOVSEFIRST) y

(Message Msg lt; = WM_MOUSELAST) entonces

si arrastra entonces

DragMouseMsg (MMOUSE (Mensaje)) {Proceso de arrastre}

else

…? {Procesar otro normalmente}

…? {De lo contrario, procesar normalmente}

Fin

Volver al directorio DELPHI tutorial básico

?Recomendación del editor

?Videotutorial de capacitación en programación Java

?Videotutorial de capacitación práctica del marco avanzado J EE

Desarrollo y práctica de tecnología de audio/video Visual C

p>

Tecnología de índice Oracle

Guía de optimización y desarrollo de bases de datos ORACLE G

La optimización del rendimiento del programa Java hace que su programa Java sea más rápido y estable

C integrado patrón de diseño de programación

Guía práctica de desarrollo de juegos para Android lishixinzhi/Article/program/Delphi/ 201311/25120