Su propio controlador de eventos de Delphi. Eventos de Windows y controladores de eventos de Delphi. Mostrar y ocultar métodos

La apariencia del formulario creado le indica cómo funciona la aplicación. Obviamente, el usuario debe ingresar los datos iniciales en los campos de edición y hacer clic en el botón Calcular. Hacer clic en la imagen de un botón de comando es un ejemplo de lo que se llama en Windows evento.

Evento ( Evento) es lo que sucede mientras el programa se está ejecutando. En Delphi, cada evento recibe un nombre. Por ejemplo, un clic del mouse es un evento. Al hacer clic, evento de doble clic EnDblClick.

en la mesa La pregunta 9 enumera algunos eventos de Windows.

Tabla B9. Eventos.

Evento Acontecimiento
Al hacer clic Al hacer clic con el mouse
EnDblClick En doble clic botón del ratón
En el mouse hacia abajo Cuando se presiona el botón del mouse
En el mouse arriba Cuando sueltas el botón del ratón
OnMouseMove Al mover el mouse
OnKeyPress Cuando presionas una tecla del teclado
OnKeyDown Cuando presionas una tecla del teclado. Eventos OnKeyDown Y OnKeyPress- estos son eventos alternos y repetidos que ocurren hasta que se suelta la tecla retenida (momento en el cual ocurre el evento OnKeyUp)
OnKeyUp Cuando sueltas una tecla del teclado presionada
Al crear Al crear un objeto (formulario, control). El procedimiento para manejar este evento generalmente se usa para inicializar variables, realizar acciones preparatorias
En pintura Cuando aparece una ventana en pantalla al inicio del programa, después de la aparición de una parte de la ventana que, por ejemplo, estaba tapada por otra ventana, y en otros casos
Al entrar Cuando un control recibe el foco
Al salir Cuando un control pierde el foco

La reacción ante un evento debe ser algún tipo de acción. En Delphi, la respuesta a un evento se implementa como procedimiento del evento. Por lo tanto, para que un programa realice algún trabajo en respuesta a las acciones del usuario, el programador debe escribir un procedimiento para manejar el evento correspondiente. Tenga en cuenta que el componente maneja una parte importante del procesamiento de eventos. Por lo tanto, el programador debe desarrollar un procedimiento de manejo de eventos sólo si la respuesta al evento es diferente del estándar o no está definida. Por ejemplo, si según las condiciones del problema existen restricciones en los caracteres ingresados ​​en el campo Editar, no, entonces el procedimiento de manejo de eventos OnKeyPress no es necesario escribir, porque durante la operación del programa se utilizará el procedimiento estándar (oculto para el programador) para procesar este evento.

Consideremos la metodología para crear procedimientos de procesamiento de eventos usando el ejemplo de un procedimiento de procesamiento de eventos. Al hacer clic para botón de comando Calcular.

Para comenzar a crear un procedimiento de procesamiento de eventos, primero debe en la ventana Inspector de objetos seleccione el componente para el cual se crea el procedimiento de manejo de eventos. Luego, en la misma ventana debes seleccionar la pestaña. Eventos(Eventos).

Eventos en programación, como eventos. mundo real- Son aquellas operaciones que se producen en un momento determinado. Establecer hora- Este no es un momento específico desde el punto de vista del reloj, son simplemente respuestas a algunas otras acciones y cambios. Los eventos son inherentes a la programación orientada a objetos y son una de las características importantes de los sistemas operativos. sistemas windows. El trabajo de programas con una interfaz visual (gráfica) es impensable sin eventos. Delfos proporciona acceso completo para trabajar con eventos y facilita un poco la programación de controladores de eventos. El objetivo de la lección es familiarizarse con los eventos más utilizados, así como con las técnicas para escribir controladores para ellos.

¿Dónde puedo encontrar eventos?

En una de las primeras lecciones se mencionó que cada objeto tiene propiedades y eventos y todo esto es accesible a través de Inspector de objetos. Una lista de todos los eventos que admite el objeto se encuentra en la pestaña Eventos Inspector de objetos. El formato de los datos es similar a la pestaña de propiedades: el nombre del evento se indica a la izquierda y el controlador asignado al evento se indica a la derecha. Tenga en cuenta que todos los eventos suelen recibir nombres que comienzan con la palabra " En" (Inglés - " en"). Esto es buena educación y una tradición bastante bien establecida. Estos nombres le permiten distinguir rápidamente los eventos de las propiedades. Por analogía con las propiedades, los eventos reciben nombres bastante lógicos. Al ver un evento desconocido, en el 95% de los casos puede Adivine solo por el nombre cuándo ocurre el evento. Si el evento no está del todo claro o desea saber más sobre él, puede utilizar el sistema de ayuda integrado. Delfos. Para hacer esto, coloque el cursor en la línea con el evento de interés y simplemente haga clic F1- El sistema de ayuda se abrirá en una página con información sobre el evento seleccionado (si, por supuesto, se describe en la ayuda). Para todos componentes estándar Hay mucha información en el sistema de ayuda. Si se utiliza algún componente de terceros, la descripción debe encontrarse en la documentación que viene con el componente. Algunos componentes (principalmente grandes paquetes de gran número componente) integrar de forma independiente su documentación en sistema de ayuda Delfos durante la instalación.

Creación automática de controladores de eventos.

Controlador de eventos es un conjunto de comandos que se ejecutan cuando se genera un evento. Puede crear controladores de dos maneras: directamente en el entorno Delfos- automática y programáticamente, es decir. durante la ejecución del programa. Crear un controlador es muy simple: simplemente haga doble clic en el campo al lado del nombre del evento en el Inspector de objetos y se abrirá el editor de código con una plantilla de controlador. Todo lo que queda es escribir el código requerido entre comenzar Y fin(el cursor ya estará en ese lugar) y el controlador está listo. Como puedes ver, todo es bastante sencillo y rápido. Sin embargo, en lecciones anteriores viste que se creaba un controlador simplemente haciendo doble clic en un objeto del formulario... Sí, efectivamente, en este caso también se crea un controlador. Pero este método no es diferente del que acabamos de describir, solo que se establece un evento predeterminado para cada objeto, para el cual se crea un controlador cuando se hace doble clic. Normalmente estos son los eventos más utilizados. Por ejemplo, para un botón, esto será, por supuesto, hacer clic en él. Para componentes no estándar, si no se especifica el evento predeterminado, se toma el primero disponible, y si solo hay un evento, entonces la elección es aún más obvia.
Una vez creado el controlador, en la pestaña Eventos El nombre del controlador aparecerá junto al nombre del evento. Este nombre también se puede ingresar manualmente o seleccionar de una lista que contiene los nombres de todos los controladores. Los nombres de los controladores tampoco se dan por casualidad: se toma el nombre del objeto y se le agrega el nombre del evento. Por ejemplo, si hay un botón Botón1 y su evento Al hacer clic, entonces se nombrará el controlador Botón1Clic. Nuevamente, por el nombre del controlador se puede adivinar el evento al que se refiere.

¡Un evento sólo puede tener un controlador! Sin embargo, si necesita especificar varios controladores, puede hacer esto: el único controlador especificado simplemente ejecuta mediante programación los otros controladores. Esta técnica se utiliza a menudo.
Sin embargo, no existe una prohibición inversa: uno el manejador puede estar obligado a varios eventos objeto e incluso a diferentes objetos. Para hacer esto, en la línea del evento de interés para el objeto, seleccione el nombre del controlador de la lista.

Controlador desde el punto de vista del código

Ahora veamos en qué se encuentra el controlador. código de programa. Y es un procedimiento, es decir. un conjunto de comandos es un miniprograma.
El controlador contiene una sección de implementación: está ubicada entre comenzar Y fin(en la figura está resaltado con un marco de color). En este bloque, como ya sabes, deberás escribir el código que se ejecutará.
lo mas línea superior handler es su título (resaltado en color). Elementos del encabezado:
- Palabra clave procedimiento(procedimiento);
- Nombre del objeto al que pertenece este procedimiento(v. en este caso pertenece a la forma - por lo tanto TForm1);
- Nombre del controlador (color);
- Parámetros pasados ​​(color).

Entre el nombre de los objetos ( TForm1) y nombre del controlador ( Botón1Clic) hay un punto: este es un símbolo que indica que Botón1Clic pertenece TForm1. Cuando se trabaja con cualquier estructura, un punto indica que el elemento pertenece a esta estructura. Ahora bien, esto no juega un papel importante, sólo una pequeña digresión. Por ejemplo, en el lenguaje C++, dicho separador es la combinación de "signo menos y mayor que": ->

La sección de descripciones también está presente aquí, simplemente está vacía. Como era de esperar, se encuentra entre el encabezado del controlador y la sección de implementación, es decir. entre la primera y la segunda línea. Si es necesario declarar variables o constantes, esta sección se describe de la forma habitual: agregando una palabra clave var o constante y una descripción de variables o constantes.


Ejemplo de procesamiento de eventos No. 1

procedimiento
comenzar
ShowMessage("Botón1 presionado")
fin ;

procedimiento TForm1.Button2Click (Remitente: TObject);
comenzar
ShowMessage("Botón2 presionado")
fin ;

procedimiento TForm1.Button3Click(Remitente: TObject);
comenzar
ShowMessage("Botón3 presionado")
fin ;

Por supuesto que funcionará... Pero los verdaderos programadores no hacen eso... Juzguen ustedes mismos: ¿y si hubiera 100 botones? ¿Y luego qué? ¿100 manipuladores? ¡Por supuesto que no!

Puede crear un controlador para todos los botones a la vez. Se dijo anteriormente que esto se puede hacer si selecciona un controlador de eventos de la lista en el Inspector de objetos... Pero si hay 100 botones, este método tampoco es adecuado: llevará mucho tiempo. Hay una cosa más: si selecciona varios objetos en el formulario a la vez, en el Inspector de objetos, entre las propiedades y eventos, solo permanecerán aquellos que tienen todos los objetos seleccionados. Esto es lo que debes aprovechar.

Entonces, seleccione los 3 botones en el formulario (delineando el área con el mouse o manteniendo presionada la tecla Mayús), luego vaya a la pestaña Eventos en el IO y crear un controlador de eventos Al hacer clic. Qué sucede: se abre el editor de código, pero solo se crea un controlador, aunque está asignado a los tres botones.

La salida del mensaje también se implementa en una línea, en la que se sustituye el nombre del botón que se presionó.

procedimiento TForm1.Button1Click(Remitente: TObject);
comenzar
ShowMessage("Presionado " +(Remitente como TBotón).Nombre)
fin ;

¿Cómo funciona exactamente y qué hace el operador? como Es bastante difícil de explicar ahora. Todo tiene su tiempo. El ejemplo se creó para mostrar que siempre se puede evitar la duplicación de alguna manera.

Parámetros pasados ​​a los controladores.

Los eventos tienen parámetros. Muchos eventos tienen un parámetro, pero algunos tienen más, según el tipo de evento. A partir de los parámetros pasados, puede encontrar datos adicionales y las condiciones bajo las cuales ocurrió el evento. Por ejemplo, si sabemos que el usuario movió el cursor del mouse, esto no significa nada y información útil prácticamente no lleva. Pero si sabemos que el cursor se movió a un punto de la pantalla con algunas coordenadas conocidas (x;y)- esto ya es algo.
Un parámetro que ocurre en casi todos los eventos. Remitente. Apunta al objeto que desencadenó el evento. Es conveniente usarlo en el caso de varios objetos que tienen instalado un controlador para el mismo evento (como en nuestro ejemplo No. 1).

Eventos

Ahora que sabemos mucho sobre eventos, finalmente podemos considerar los estándar y los más utilizados.

OnClick: clic del mouse en un objeto. Para un botón, el evento también se activa si presiona Enter o Space mientras el foco de entrada está en el botón.

OnDblClick: doble clic.

OnContextPopup - cuando se llama menú contextual objeto, es decir cuando se hace clic clic derecho ratones. Entre los parámetros hay Pos.Ratón- coordenadas del cursor en el momento de hacer clic. coordinar por incógnita disponible como Pos.Ratón.X, y por Y- Cómo MousePos.Y.

OnEnter: el momento en que el objeto recibe el foco de entrada (el foco de entrada generalmente se representa marco punteado en el sitio; en el campo de entrada, este es el cursor; un enfoque en toda la aplicación, es decir Sólo puedes trabajar con un objeto a la vez).

OnExit: el momento en que el objeto pierde el foco de entrada.

OnMouseDown: cuando se presiona el botón del mouse (no necesariamente el izquierdo). Parámetro Botón- botón presionado ( mbIzquierda - botón izquierdo, mbDerecha- bien, mbMedio- promedio). Cambio- un conjunto que indica qué teclas de función se mantuvieron presionadas al hacer clic. De esta manera puede realizar un seguimiento, por ejemplo, de los clics mientras mantiene presionado Ctrl + Alt, etc. incógnita, Y- coordenadas del cursor mientras se presiona (en relación con la izquierda) esquina superior el componente en sí, ¡no la forma!).

OnMouseUp es un evento similar a En el mouse hacia abajo. Ocurre cuando se suelta el botón del mouse. Un ejemplo de una combinación de estos dos eventos es editor gráfico: Cuando se presiona el botón del mouse, se dibuja, pero cuando se suelta, no.

OnMouseMove es otro evento del mouse que ocurre cuando el cursor se mueve sobre un objeto. incógnita, Y- coordenadas de la nueva posición, Cambio- muchos presionados teclas de función.

OnKeyDown: cuando se presiona cualquier tecla del teclado mientras el foco de entrada está en el objeto. Llave- código de la tecla pulsada, Cambio- el mismo conjunto de teclas de función (este parámetro se encuentra en muchos eventos).

OnKeyUp: cuando se suelta la tecla (antípoda OnKeyDown).

OnKeyPress: cuando presiona una tecla que imprime un carácter (letra, número, signo). Llave- ya no es el código clave, sino el símbolo en sí (tipo de datos: Carbonizarse- un personaje).

OnResize: cuando cambia el tamaño del objeto.

OnPaint: al dibujar un objeto en la pantalla (por ejemplo, un formulario).

El formulario en sí también tiene muchos eventos. Notemos algunos de ellos:

OnCreate: al crear el formulario. Normalmente, este controlador de eventos contiene acciones que deberían ocurrir cuando se inicia el programa. Pero al inicio, esto sólo se ejecutará si el formulario es el principal de la aplicación y siempre que el formulario se cree automáticamente. Si en la solicitud solo hay un formulario, es el principal.

OnClose: al cerrar el formulario.

OnCloseQuery: al intentar cerrar el formulario. Este evento se puede utilizar si necesita bloquear el cierre de un formulario. El controlador contiene un parámetro. Puede cerrar(Inglés - " se puede cerrar"): valor booleano, tipo de datos - Booleano. Si luego de ejecutar el manejador el valor de la variable Puede cerrar resulta FALSO, entonces el formulario no se cerrará. El valor de esta variable se establece mediante programación. Un ejemplo del uso de este evento es editor de texto. Si el usuario ingresó texto pero no lo guardó en un archivo, al salir del programa se le debe preguntar si se deben guardar los cambios.

Ejemplo de procesamiento de eventos No. 2

Finalidad: prohibir el cierre "directo" del formulario, pero preguntar si el usuario realmente quiere cerrar el programa. Usando el evento de formulario Al cerrar consulta. En el controlador mostraremos un cuadro de diálogo y si el usuario responde " No", bloquearemos el cierre. Para mostrar el cuadro de diálogo usaremos la función MensajeDlg. Aprenderá más sobre él y sus parámetros en una de las siguientes lecciones. Nuestro manejador:

procedimiento TForm1.FormCloseQuery(Remitente: TObject; var CanClose: booleano);
comenzar
si MensajeDlg( "¿De verdad quieres salir?",mtAdvertencia,,0) = señorNo entonces
PuedeCerrar:= Falso
fin ;

La condición que se verifica es si el botón " está presionado No". Si se pulsa se bloqueará el cierre asignando una variable Puede cerrar valores FALSO. Como resultado al cerrar veremos lo siguiente:


Eventos (continuación)

OnDestroy: cuando se destruye el formulario (después de cerrarlo, el formulario se destruye y se libera la memoria ocupada por él).

OnShow: cuando el formulario se muestra en la pantalla.

OnHide: al ocultar el formulario de la pantalla.

OnActivate: el momento en que el formulario se activa, es decir cuando recibe el foco de entrada (por ejemplo, cuando el usuario hace clic en el formulario).

OnDeactivate: respectivamente, cuando el formulario pierde el foco.

OnChange: cuando algo cambia (por ejemplo, un campo de entrada TEditar este evento se activa cuando cambia el texto en este campo).

OnDragDrop, OnDragOver, OnEndDock, OnEndDrag, OnStartDock, OnStartDrag: todos estos eventos están relacionados con la tecnología Arrastrar y soltar(es decir, cuando un objeto es "agarrado" por el mouse y movido a otra ubicación), y también con Muelle-tecnología. La esencia de esta tecnología (Dock) es la incrustación de unos objetos en otros. Por ejemplo, si tomamos Inspector de objetos detrás del encabezado y moverse hacia la parte inferior Vista de árbol de objetos y luego suelta, las ventanas se fusionarán, y si lo mueves al centro Vista de árbol de objetos, entonces habrá 3 marcadores ( Vista de árbol de objetos se convertirá en el tercer marcador).

Como puede ver, hay muchísimos eventos y simplemente no tiene sentido describirlos todos: sus nombres revelan el significado de los eventos mismos. Basta saber qué eventos existen generalmente.

Conclusión

Analizamos el trabajo con eventos, uno de los principios de la programación orientada a objetos. Así, el desarrollo programa visual para Windows todo se reduce a escribir controladores de eventos que describan la interacción de los objetos entre sí.

Revisar

Eventos en Delfos

Comprender los eventos

Manejo de mensajes de Windows en Delphi

  1. Revisar
  2. Uno de los objetivos clave de un entorno de programación visual es ocultar al usuario la complejidad de la programación de Windows.

    Pero al mismo tiempo me gustaría garantizar que dicho entorno no se simplifique demasiado, hasta el punto de que los programadores pierdan el acceso al propio sistema operativo. La programación basada en eventos es una característica integral de Windows. Alguno entornos de software Para Las aplicaciones (RAD) intentan ocultar esta característica al usuario por completo, como si fuera tan compleja que la mayoría no puede entenderla. La verdad es que la programación de eventos en sí no es tan difícil.

    Sin embargo, existen algunas características de la implementación de este concepto en Windows que pueden causar dificultades en algunas situaciones.

    Delphi proporciona acceso completo a la subestructura de eventos proporcionada por Windows. Por otro lado, Delphi facilita la programación de controladores para este tipo de eventos. EN esta lección varios ejemplos de eso cómo manejar eventos en Delphi, se da una explicación más detallada operación del sistema

  3. orientado a eventos.
  4. Eventos en Delfos

    Los objetos de la biblioteca de componentes visuales (VCL) de Delphi, así como los objetos del mundo real, tienen su propio conjunto de propiedades y su propio comportamiento: un conjunto de respuestas a los eventos que les suceden.

    La lista de eventos de un objeto determinado al que reacciona se puede ver, por ejemplo, en el Inspector de objetos en la página de eventos. (De hecho, esta página proporciona una lista de propiedades que son de tipo TMouseMoveEvent y son procedimientos de manejo de eventos. Existe una convención para nombrar estas propiedades. Por ejemplo, OnDblClick corresponde al doble clic del mouse y OnKeyUp corresponde al evento cuando se presionó la tecla se soltó.) Entre el conjunto de eventos para varios objetos de VCL hay tanto eventos transferidos desde Windows (MouseMove, KeyDown) como eventos generados directamente en el programa (DataChange para TDataSource). El comportamiento de un objeto está determinado por qué controladores tiene y para qué eventos. Crear una aplicación en Delphi consiste en configurar las propiedades de los objetos utilizados y crear controladores de eventos. Los eventos más simples a los que a veces es necesario responder son, por ejemplo, eventos asociados con el mouse (casi todos los objetos visibles los tienen) o evento de clic

    comenzar

    para el botón T.

    Digamos que desea interceptar un clic izquierdo del mouse en un formulario. Para hacer esto, cree

    nuevo proyecto

    comenzar

    , en el Inspector de objetos, seleccione la página del evento y haga doble clic en el lado derecho para la propiedad OnClick. Recibirá una plantilla para el controlador de este evento:

    para el botón T.

    Cada vez que se hace clic con el botón izquierdo del mouse sobre el formulario, aparecerá un cuadro de diálogo (ver Fig. 1).

    procedimiento TForm1.FormKeyDown(Remitente: TObject;

    var Clave: Palabra;

    Cambio: TShiftState);

    comenzar

    MessageDlg(Chr(Clave), mtInformation, 0);

    para el botón T.

    Ahora que tiene un conocimiento básico de la programación de eventos en Delphi, es hora de regresar y observar la teoría detrás del código que escribió. Una vez que tenga una idea de cómo funciona el sistema, puede volver al entorno Delphi y ver cómo aprovechar al máximo las funciones disponibles.

  5. Comprender los eventos

La programación de eventos no es sólo en Windows, y este rasgo se puede implementar no solo en el sistema operativo. Por ejemplo, cualquier programa DOS Puede basarse en un bucle simple que se ejecuta durante toda la vida del programa en la memoria. A continuación encontrará un ejemplo hipotético de cómo podría verse este código:

comenzar

InicializarMemoria;

repetir

CheckForMouseEvent(Eventos);

CheckForKeyPress(Eventos)

ManejarEventos(Eventos);

hasta que termine: = Verdadero;

Disponer de memoria;

fin.

Este es un ejemplo típico de un programa basado en eventos. Comienza y termina con la inicialización y liberación de memoria. El programa contiene un bucle simple.repetir...hasta que, que verifica la ocurrencia de eventos de mouse y teclado y luego permite al programador responder a estos eventos.

La variable Eventos puede ser un registro con una estructura simple:

TEvent = registro

X, Y: Entero;

Botón del ratón: TButton;

Clave: Palabra;

para el botón T.

El tipo TButton anterior se puede declarar así:

TBotón = (lBotón, rBotón);

Estas estructuras le permiten realizar un seguimiento de dónde está el mouse, cuál es el estado de sus botones y el valor de la tecla presionada en el teclado. Por supuesto, este es un ejemplo de una estructura muy simple, pero los principios establecidos aquí reflejan lo que sucede dentro de Windows o dentro de otros sistemas controlados por eventos como Turbo Vision. Si el programa anterior fuera un editor de texto, entonces el controlador HandleEvent para dicho programa podría verse así:

procedimiento HandleEvent(Eventos: TEvent);

comenzar

caso Eventos.Clave de

'A'..'z': Escribir(Eventos.Clave);

EnterKey: Escribir (CarriageReturn);

EscapeKey: Hecho:= Verdadero;

para el botón T.

para el botón T.

Según el código anterior, el programa imprimirá la letra 'a' cuando se presione esta tecla e irá a nueva linea, si se presiona la tecla 'Enter'. Al presionar 'Esc' finalizará el programa.

Este tipo de código puede resultar muy conveniente, especialmente si está escribiendo un programa que requiere animación. Por ejemplo, si necesita mover varias imágenes por la pantalla, es posible que deba moverlas algunos puntos y luego verificar si el usuario presionó los botones. Si ocurrió tal evento, entonces se puede procesar; de lo contrario, continúe.

Espero que el ejemplo anterior proporcione una idea de cómo funciona un sistema basado en eventos. Lo único que queda fuera es por qué el sistema Windows está diseñado como está.

Una de las principales razones por las que Microsoft diseñó Windows de esta manera es el hecho de que muchas tareas se ejecutan en el entorno al mismo tiempo. En los sistemas multitarea, el sistema operativo necesita saber si el usuario ha hecho clic en una ventana en particular. Si esta ventana fue parcialmente bloqueada por otra, entonces el sistema operativo lo sabe y mueve la ventana al primer plano. Está claro que resulta inconveniente obligar a la propia ventana a realizar estas acciones. Es mejor que el sistema operativo procese todas las pulsaciones de teclas y botones del mouse y luego los pase a otros programas como eventos.

En resumen, un programador de Windows casi nunca debería probar el hardware directamente. El sistema realiza esta tarea y transmite información al programa en forma de mensajes.

Cuando el usuario hace clic con el mouse, el sistema operativo procesa el evento y lo pasa a la ventana que debe manejar el evento. El mensaje creado, en este caso, se envía a un determinado procedimiento de ventana DefWindowProc (procedimiento de ventana predeterminado). DefWindowProc es un análogo del procedimiento HandleEvent del ejemplo anterior.

Cada ventana de Windows tiene su propio DefWindowProc. Para comprender completamente esta afirmación, imagine que cada botón, cada ListBox, cada campo de entrada, etc. En realidad son ventanas y tienen su propio procedimiento DefWindowProc. Es muy flexible y sistema poderoso, pero puede obligar al programador a escribir código muy complejo. Delphi permite estar protegido de dicha estructura de programa.

Casi todo lo que sucede en Windows toma la forma de mensajes, y si desea usarlos en Delphi (más aún cuando escribe sus propios componentes), entonces necesita comprender cómo funcionan estos mensajes.

Si miras DefWindowProc en la referencia API de Windows, entonces podrás ver la siguiente definición:

función DefWindowProc(Wnd: HWnd; Msg, wParam: Word;

lParam: LongInt);

Cada mensaje enviado a una ventana consta de cuatro partes: la primera parte es el identificador de la ventana que recibe el mensaje, Msg informa lo que sucedió y la tercera y cuarta partes (wParam y lParam) contienen información adicional sobre el evento. Juntas, estas cuatro partes son análogas a la estructura TEvent que se muestra arriba.

La segunda parte del mensaje tiene 16 bits y dice qué evento ocurrió. Por ejemplo, si se presiona el botón izquierdo del mouse, la variable Msg contiene el valor WM_LBUTTONDOWN. hay docenas varios tipos mensajes y se llaman como WM_GETTEXT, WM_HSCROLL, WM_GETTEXTLENGTH, etc. Puede ver una lista de todos los mensajes en la referencia de la API de Windows (ayuda en línea).

Las dos últimas variables, de 16 y 32 bits de longitud, se denominan wParam y lParam. Proporcionan al programador información adicional importante sobre cada evento. Por ejemplo, cuando se presiona un botón del mouse, lParam contiene las coordenadas del puntero del mouse.

Uno de los trucos es cómo resaltar. información necesaria a partir de estas variables. En la mayoría de los casos, Delphi le libera de la necesidad de realizar esta tarea. Por ejemplo, en el controlador de eventos OnMouseDown de un formulario, simplemente usa las coordenadas X e Y. Como programador, no tiene que hacer ningún esfuerzo para obtener el mensaje y sus parámetros asociados. Todo lo relacionado con eventos se presenta de forma sencilla y directa:

procedimiento TForm1.FormMouseDown(Remitente: TObject;

Botón: TMouseButton;

Cambio: TShiftState;

X, Y: Entero);

Entonces, para resumir, debería quedar claro lo siguiente:

  • Windows es un sistema controlado por eventos;
  • Los eventos en Windows toman la forma de mensajes;
  • En lo más profundo de VCL Delphi, los mensajes de Windows se procesan y convierten a una forma más sencilla para el programador;
  • El procesamiento de eventos en Delphi se reduce a escribir sus propios controladores para cada objeto;
  • Los eventos en un programa Delphi se llaman no sólo mensajes de windows, sino también por procesos internos.
      1. Manejo de mensajes de Windows en Delphi

Por supuesto, es imposible crear una biblioteca de objetos que satisfaga plenamente las necesidades de los programadores. Siempre será necesario agregar o cambiar las propiedades y el comportamiento de los objetos. En este caso, al igual que cuando crea sus propios componentes en Delphi, a menudo necesita procesar mensajes de Windows. Dado que Object Pascal es un desarrollo y una continuación de Borland Pascal 7.0, esto se hace de forma similar a BP.

La sintaxis general para declarar un controlador de mensajes de Windows es:

procedimiento Handler_Name(var Msg: MessageType);

mensaje WM_XXXXX;

Handler_Name indica el nombre del método; Msg: nombre del parámetro que se pasa; MessageType: cualquier tipo de registro adecuado para de este mensaje; la directiva de mensaje indica que este método es un controlador de mensajes; WM_XXXXX es una constante o expresión que especifica el número del mensaje de Windows que se está procesando.

Veamos el procesamiento de mensajes usando un ejemplo. Por ejemplo, cuando hace clic derecho en un formulario del programa, aparece un menú emergente (si estaba asociado con este formulario). Es posible que el programador desee vincular algún otro evento al botón derecho. Esto se puede hacer así:

tipo

TForm1 = clase(TForm)

Menú emergente1: TPopupMenu;

Elemento de menú1: TMenuItem;

Elemento de menú2: TMenuItem;

Elemento de menú 3: TMenuItem;

privado

(Declaraciones privadas)

procedimiento WMRButtonDown(var Msg: TWMMouse); mensaje

WM_RBUTTONDOWN;

público

(Declaraciones públicas)

para el botón T.

El código agregado manualmente a la declaración del objeto TForm1 está subrayado. A continuación, en la secciónimplementación necesitas escribir un controlador:

comenzar

  • , 0);
  • para el botón T.

    En este caso, al hacer clic con el botón derecho del ratón, aparecerá un cuadro de diálogo.

    En realidad, la clase TForm ya tiene un controlador heredado de un ancestro lejano. de este evento, que tiene exactamente el mismo nombre y abre el mismo menú emergente. Si en el nuevo controlador de mensajes necesita realizar acciones que se realizaron en el anterior, entonces se utiliza la palabra clave para esto.heredado . Si modificamos ligeramente nuestro controlador, aparecerá un menú emergente después del diálogo:

    procedimiento TForm1.WMRButtonDown(var Msg: TWMMouse);

    comenzar

    MessageDlg("Derecha botón del ratón haga clic.", mtInformación,

  • , 0);
  • heredado;

    para el botón T.

    Sin embargo, todavía hay una manera de manejar todos los mensajes que recibe la aplicación. Para hacer esto, use la propiedad OnMessage del objeto Aplicación, que se crea automáticamente cuando se inicia el programa. Si se define un controlador de eventos OnMessage, recibe control cuando ocurre cualquier evento, y se envía un mensaje al programa. El siguiente código hará que aparezca un cuadro de diálogo cuando haga doble clic en cualquier objeto de la aplicación.

    procedimiento TForm1.FormCreate(Remitente: TObject);

    comenzar

    Aplicación.OnMessage:=AOM;

    para el botón T.

    procedimiento TForm1.AOM(var Msg: TMsg; var Handled: Boolean);

    comenzar

    Manejado:=Falso;

    si Msg.Message = WM_LBUTTONDBLCLK entonces comienza

    MessageDlg("Doble clic.", mtInformation, , 0);

    Manejado:=Verdadero;

    para el botón T.

    para el botón T.

    Por supuesto, no puede realizar operaciones que lleven mucho tiempo en el controlador, ya que esto ralentizará toda la aplicación.

    Objetivos:

    • Educativo: dar el concepto de un evento en el sistema operativo Windows y un controlador de eventos en Entorno de Delfos. Estudie los principales eventos y capacidades de los componentes: Editar, Botón, Etiqueta.

    Equipo:

    • Computadoras personales con la aplicación Boland Delphi. para microsoft ventanas;
    • computadora del profesor;
    • proyector multimedia;

    Capacitación y folletos:

    • manual de formación;
    • taller de electrónica;
    • tarjetas con tareas para trabajo independiente;

    Plan de lección:

    1. Repetición del tema de la lección anterior en forma de encuesta.
    2. Aprender material nuevo.
    3. Trabajo independiente.
    4. Resumen de la lección.
    5. Tarea.

    Progreso de la lección

    1. Repetición del tema de la lección anterior en forma de encuesta. Tema de la lección anterior: "Componente. Propiedades de los componentes".

    • ¿Qué es un componente?
    • ¿Cómo seleccionar y colocar componentes en el formulario?
    • cual propiedades generales componentes ¿sabes?
    • ¿Cómo se pueden cambiar las propiedades de un componente (por ejemplo, cambiar el tamaño o el color de un componente)?

    2. Estudiar material nuevo.

    Acompañado de una presentación (Anexo 1).

    La idea principal de la programación orientada a objetos no está asociada con la ejecución de alguna secuencia de instrucciones preescrita, sino con la respuesta a ciertos eventos. Si no ocurre ninguno de los eventos para los que la aplicación está diseñada para responder, no hace nada. Presionaron una tecla; la aplicación respondió: su controlador de eventos mostró algo en la pantalla de la computadora, imprimió algo, es decir, llamó algún procedimiento.

    Controlador de eventos

    cualquier objeto vida real Nos vemos obligados a reaccionar ante ciertos eventos en el mundo circundante: suena el teléfono, una persona contesta, comienza a llover, abrimos un paraguas.

    También se asocian varios eventos con la computadora: encenderla, presionar una tecla en el teclado, hacer clic en un botón del mouse, etc. El entorno Delphi brinda a sus clientes la capacidad de responder a ellos: bajo la dirección del programador, Establece una conexión entre los procedimientos de componentes especiales, llamados controladores de eventos, y el mecanismo correspondiente del sistema operativo.

    Un evento es la reacción de un componente ante un determinado impacto.

    Windows es el primero en enterarse de cualquier evento y, si se establece comunicación con el controlador de dicho evento, le transfiere el control.

    EN caso general se ve así:

    El programador no puede influir en la generación del evento por medios ordinarios. Sólo es competente para procesar el evento, es decir, escribir un procedimiento que será ejecutado cuando ocurra.

    Delphi almacena los nombres de todos sus controladores de eventos para cada componente y los muestra en la ventana del Inspector de objetos en la pestaña Eventos.

    Para crear un controlador de eventos, debe realizar los siguientes pasos:

    • seleccione el componente para el cual desea procesar el evento.
    • Abra la pestaña "Eventos" y haga doble clic en la columna derecha del evento seleccionado.

    Como resultado de estas acciones, Delphi generará automáticamente un procedimiento

    procesamiento de eventos. El nombre de este procedimiento consta del nombre del componente y el nombre del evento. El usuario puede cambiarlo directamente en la ventana del Inspector de objetos.

    Para eliminar un evento, solo necesita borrar el contenido del procedimiento (el código entre las palabras Inicio y Fin), y la próxima vez que compile, Delphi eliminará el código del procedimiento innecesario.

    Evento al hacer clic

    La forma más sencilla de informar a una aplicación sobre un evento es hacer clic en un componente. Cuando se hace clic en un botón en un programa en ejecución, se produce el evento OnClick. Este evento aún no ha sido procesado por el programa, por lo que presionar el botón no tendrá ninguna consecuencia. Para hacer que un programa responda al clic de un botón, necesita escribir una parte del programa en Object Pascal llamado controlador de eventos.

    Este fragmento debe ser una secuencia. cadenas de texto, en el que el programador especifica qué debe hacer exactamente el programa en respuesta a presionar un botón. El fragmento está formateado como un procedimiento en Pascal.

    Para obligar a Delphi a crear una plantilla para el procedimiento del controlador de eventos OnClick, debe hacer doble clic en el componente insertado. En respuesta, Delphi activa una ventana de código en la que se puede ver el siguiente fragmento:

    La palabra procedimiento notifica al compilador que se ha iniciado un procedimiento. Le sigue el nombre del método TForm1.Button1Click. Este nombre es compuesto: consta del nombre de clase TForm1 y el nombre real del método Button1Click.

    Si bien solo hay una plantilla de controlador, el cuerpo del método está vacío. Los comandos que se escribirán dentro del controlador se ejecutarán cuando se haga clic en el componente.

    Hagamos que el botón cierre el programa. Para hacer esto en linea vacia Entre las palabras inicio y fin debes escribir el siguiente comando:

    Se llamará al método Close para el objeto Form1 (ventana del programa).

    Se pueden encontrar ejemplos de programas con un controlador de eventos OnClick en:

    procedimiento TForm1.Button1Click (Remitente: TObject);

    Label1.Caption:="Calle Bazarova, edificio 35, apto. 35";

    Label2.Caption:="Programmers Avenue, edificio 3/1, apto. 275";

    procedimiento TForm1.Button3Click(Remitente: TObject);

    Label3.Caption:="Carril Kovalevskaya, casa 27, apartamento 181";

    procedimiento TForm1.Button4Click(Remitente: TObject);

    Label4.Caption:="Bering St., edificio 22, apto. 209";

    Fragmentos de código en lenguaje Object Pascal de la aplicación "Jumping Button" (Apéndice 6):

    procedimiento TForm1.Button1Click (Remitente: TObject);

    Botón1.Visible:=Falso;

    Botón2.Visible:=Verdadero;

    procedimiento TForm1.Button2Click (Remitente: TObject);

    Botón2.Visible:=Falso;

    Botón3.Visible:=Verdadero;

    procedimiento TForm1.Button7Click(Remitente: TObject);

    Botón7.Visible:=Falso;

    Botón8.Visible:=Verdadero;

    procedimiento TForm1.Button8Click(Remitente: TObject);

    Botón8.Visible:=Falso;

    Botón1.Visible:=Verdadero;

    Otros eventos

    Nombre del evento cuando ocurre
    OnKeyPress Ocurre cuando el usuario presiona una tecla.
    EnDBClick Ocurre cuando hace doble clic en un componente
    OnMouseMove Ocurre cuando el cursor del mouse se mueve sobre un componente.
    En el mouse hacia abajo Ocurre cuando se presiona un botón del mouse
    En el mouse arriba Ocurre cuando se suelta el botón del mouse.
    Al entrar Ocurre cuando un componente recibe el foco de entrada
    Al salir Ocurre cuando un componente pierde el foco de entrada
    Al crear Ocurre cuando se crea el formulario.

    Sólo existe en forma

    3. Trabajo independiente.

    Se pide a los estudiantes que creen una aplicación que maneje el evento OnClick de un componente Botón.

    4. Resumen de la lección.

    • Ahora resumamos nuestra lección, hoy aprendimos que:
    • Un controlador de eventos es un procedimiento que se ejecuta cuando ocurre un evento determinado;
    • Para seleccionar un evento, use la pestaña "Eventos" del "Inspector de objetos";

    Aprendí a crear un controlador para el evento OnClick más popular. Resultados trabajo independiente

    Se puede ver a los estudiantes:

    5. Tarea.

    Completa tareas del "Taller electrónico"

    1. Referencias.
    2. V.V.Kuznetsov, I.V. Abdrashitova "Fundamentos de la programación orientada a objetos en DELPHI", "Escuela Universitaria, Tomsk, 2008.
    3. "Delphi para profesores en ejemplos y problemas" parte I, "Educación e Informática", Moscú, 2006.
    4. G.V. Galiseev "Programación en el entorno Delphi 7", "Dialéctica", Moscú · San Petersburgo · Kiev, 2003.

    http://umnic.rikt.ru/everest/distant. Mayoría definición general eventos

    Si el desarrollador ha implementado un código de controlador de eventos, se ejecuta cuando ocurre el evento. De lo contrario, normalmente no pasa nada.

    Hay dos tipos de eventos: interacción del usuario y cambio de estado. Los eventos de interacción del usuario casi siempre se generan según los mensajes de Windows, lo que indica que el usuario hizo algo para que el componente pueda responder. Los eventos de cambio de estado también se pueden reducir a mensajes de Windows.

    Es posible que los controladores de eventos no devuelvan ninguna información sobre el evento, que luego se denomina evento de notificación, o pueden devolver información adicional. información específica asociado con el evento. En este caso, se llama evento específico.

    Los eventos de notificación simplemente informan que ha ocurrido algún evento, sin proporcionar información sobre dónde o cuándo. Las notificaciones suelen utilizar el tipo TNotifyEvent, que tiene un solo parámetro: el remitente del evento. Los eventos específicos difieren de los eventos de notificación y se utilizan en los casos en los que se desea saber no sólo qué evento ocurrió y qué componente lo causó, sino también obtener información adicional relacionada con él. EN casos similares Se necesitan controladores que incluyan parámetros para información adicional. En tales casos, se necesitan controladores de eventos específicos.

    Anuncio de eventos

    Sintácticamente, los eventos se declaran casi exactamente como propiedades:

    Propiedad :
    [Índice Leer ]
    [Escribir }
    [almacenado expresión booleana>} [Predeterminado nulo|Sin valor predeterminado];

    Notas:
    Aunque los comandos de lectura y escritura pueden utilizar métodos, en la práctica no se utilizan. Normalmente se utiliza el acceso directo al campo.
    Equipo Índice Se utiliza junto con los métodos de escritura o lectura. Dado que los métodos prácticamente no se utilizan, tampoco lo es el comando Índice.
    Equipo Por defecto de hecho, sólo permite un valor predeterminado: Nil, que ya está configurado por el compilador. Por lo tanto, utilizar los comandos Default y, en consecuencia, NoDefault no es apropiado.
    Todos los eventos en Delfos suelen llevar el nombre " En": Al crear, al hacer clic, etc.
    En este caso, el evento y el campo correspondiente son de tipo TNotifyEvent.

    Entonces, en general, para declarar un evento es necesario hacer lo siguiente:
    definir o seleccionar el tipo de datos del evento (tipo de puntero de método) (tipo de procedimiento);
    declarar un campo del tipo apropiado para almacenar el valor del evento;
    declarar (correspondiente al método de envío de eventos) un método que llamará al controlador de eventos cuando ocurra el evento. Presentar la implementación de este método y determinar el mecanismo para llamarlo;
    anunciar el evento en sí.

    a) Declaración del tipo de evento
    Un evento es un mecanismo por el cual algún suceso se asocia con algún código. El código tiene el formato de un método cuyo tipo se declara antes de la declaración de clase, que incluye la declaración de evento. Este método no debe pertenecer a la clase, sino a una instancia de la clase, ya que incluso para objetos de la misma clase código ejecutable suele variar. Crear código para un método que responde a un evento es un privilegio del programador, pero Delphi se asegura de que el método esté asociado con un evento para llamar a ese método.

    La conexión entre un evento y el método que se ejecuta en respuesta a ese evento se logra en Delphi mediante un puntero de método. Más precisamente, es un puntero a un método en una instancia de una clase. Los punteros a métodos funcionan como cualquier otro tipo de procedimiento, pero también admiten un puntero a objetos ocultos. Como cualquier puntero, en realidad es una dirección, en este caso la dirección de un método, y requiere cuatro bytes para caber en la memoria. Debido a que estos métodos están diseñados para manejar eventos, se denominan controladores de eventos y la administración de objetos se denomina controlada por eventos.

    Por lo tanto, para declarar un evento, primero debe declarar o seleccionar tipo estándar controlador de eventos. Los punteros a métodos se diferencian del tipo de procedimiento habitual en que utilizan una sintaxis especial:

    Tipo =Procedimiento(Remitente: Objeto[; }) de objeto;

    Adicional palabras clave de objeto indicar al compilador que este es un puntero a un método de un objeto, y no procedimiento independiente. Por lo tanto, para procesar eventos en Delphi, es posible declarar punteros a un método que proporcione una transferencia implícita de un puntero a la instancia (la variable Self) que causó un evento particular.

    En la mayoría de los casos, los punteros a métodos se declaran como procedimientos. Aunque el compilador Delphi le permite declarar punteros de función a un método, debe tener cuidado al usarlos para controladores de eventos. Es posible que el programador no cree un código de controlador para el evento y, dado que una función vacía devuelve un resultado indefinido, no se permite un controlador de eventos vacío.

    También puede utilizar los parámetros Var para anular el procesamiento predeterminado.

    Ejemplos de punteros típicos a métodos.
    Lista de eventos en Delfos:

    TNotyfyEvent=Procedimiento(Remitente: TObject) Del Objeto;
    Al hacer clic; OnDblClick; Al crear; OnDestroy;
    TMouseMoveEvent=Procedimiento(Remitente: TObject; Shift: TShiftState; X,Y: Entero) Del Objeto; =>Mover con el mouse

    B) Determinación del mecanismo de iniciación del evento
    En realidad, este mecanismo debe responder a algunas situaciones, incidentes, en respuesta a los cuales se deben iniciar eventos.

    Para iniciar un evento, puede llamar directamente al método correspondiente o utilizar el mecanismo de mensajes para ello. Para asignar valores parámetros adicionales es necesario insertar el código apropiado que determinará sus valores y los pasará al controlador de eventos del usuario.

    c) Declaración e implementación de un método que llama a un controlador de eventos Después de determinar el mecanismo para generar un evento personalizado, debe decidir qué reacciones (visibles e invisibles) debe tener el objeto y cómo se llamará el controlador de eventos.

    Normalmente, para implementar el código para reaccionar un objeto ante un evento y llamar a un controlador de eventos, se declara y crea una implementación del método virtual protegido correspondiente (correspondiente).

    Sí, a la tarea. método dinámico Click, además de cambiar la apariencia externa del botón (el botón "se hunde"), también verifica la presencia de un controlador de eventos y, si lo hay, le transfiere el control.

    La sintaxis para declarar dicho método es la siguiente:

    Procedimiento [()]; Dinámica;

    Después de declarar el método, es necesario en la sección. Implementación módulo para presentar su implementación. La implementación debe permitir que el componente responda a las acciones desencadenadas por su método de informe de eventos.

    La sintaxis estándar para implementar un método de notificación de eventos es la siguiente:

    Procedimiento .[()];
    Comenzar
    Si está asignado()
    Entonces ( Ser[,]);
    Fin;



    
    Arriba