2009-09-08 11 views
13

Estoy buscando un código que permita asignar fácilmente muchos manejadores de eventos a un solo evento de objeto ... Lo necesitaba mucho para la arquitectura de mi complemento, así que implementé algunos reemplazos para ese , sin embargo, no me gusta mi solución para eso, así que me gustaría saber cuál es tu idea/solución/sugerencia ... Mi solución es solo una lista con elementos como eventName: string; proc: TMyEventProc; donde TMyEventProc toma dos argumentos, remitente y eventData: puntero. dependiendo del nombre del evento, eventData apunta a diferentes registros/objetos.Delphi VCL para Win32 - múltiples controladores de eventos

Desafortunadamente esto requiere la declaración de muchos, muchos registros para pasar como argumento. El método también es muy lento y requiere implementar llamando a las "devoluciones de llamada" requeridas mientras se golpea el evento "real".

Respuesta

10

Implementé una solución para esto que funciona en casi cualquier versión de Delphi: se implementó originalmente en Delphi 7, aunque no lo he probado en versiones anteriores (pero si usa Delphi 7 usted mismo, entonces eso es todo lo que necesitas saber, ¿verdad?). :)

iirc esto fue al menos en parte la inspiración para la publicación de Allen Bauer. Puede ver mi implementación demostrada en algunos videos y descargar el código from my blog:

Las publicaciones que le interesan están etiquetadas "multicast". El enlace de descarga para el código final es available in this post.

En mi enfoque, deriva una clase de TMultiCastEvent. Toda su clase derivada tiene que hacer es implementar algún tipo de protección de seguridad simple para agregar, eliminar e invocar un evento con una firma específica.

Implementación para TNotifyEvent - procedure (Sender: TObject) - se proporciona con la implementación "para que funcione" (la mayoría de los eventos de multidifusión "útiles" son notificaciones simples) y también como un ejemplo de cómo derivar multicast clases de eventos para firmas de eventos específicos.

Una vez que tenga su clase de evento de multidifusión, puede usar "controladores de eventos" regulares de forma intercambiable con la versión de multidifusión, p. dado una clase de botón imaginario con un evento On_Click de varios lanzadores (he adoptado una convención de intercalar un guión bajo en el nombre del evento para identificarlo como multidifusión, frente a eventos "uni-cast" regulares):

Código que asigna un controlador para un evento de clic unicast:

Button.OnClick := MyClickHandler; 

se puede agregar directamente ese mismo manejador a una multidifusión cuando haya eventos:

MultiCastButton.On_Click.Add(MyClickHandler); 

Mi aplicación también incluye una serie de mejoras, tales como la capacidad de deshabilitar eventos y tener controladores automáticamente re movido de los controladores cuando se destruye el objeto de implementación (esto implica una pequeña cantidad de tareas domésticas que pueden ignorarse si es necesario pero que pueden ser útiles bajo ciertas circunstancias).

Todo lo cual se describe y demuestra en las publicaciones de mi blog.

Disfrútalo. :)

+2

+1; Por cierto: esta es la lista de sus publicaciones de eventos de varios anuncios: http://www.deltics.co.nz/blog/?tag=multicast-events –

+0

gracias por su esfuerzo, pero ¿por qué no publica una muestra para mostrar ¿cómo usarlo? – FLICKER

2

Allen Bauer tiene a blog post about multicast events que puede ser útil. Sin embargo, solo funciona para Delphi 2009 o posterior.

EDITAR: Si todavía está en D7, aún puede hacer que esto funcione si no necesita demasiadas firmas de eventos diferentes. Intente ver el código de Allen y vea si puede adaptarlo a una solución no genérica.

+0

desafortunadamente, estoy usando D7 Personal ... Soy un estudiante pobre;) No puedo pagar D2009 ... – migajek

+0

Te escucho. Realmente me gustaría ver una edición personal de D2009 también, pero al parecer, una de ellas cortaría demasiado las ventas de Delphi Professional y, a diferencia de Microsoft, Embarcadero no tiene grandes divisiones sin desarrolladores que traigan dinero para subsidiar eso. –

+3

La pregunta a largo plazo es "¿Puede Embarcadero permitirse NO tener una versión barata para 'estudiantes pobres y aficionados'? –

1

Si está implementando un sistema de complementos, creo que no puede salirse con la suya con los manejadores de eventos, ya sea multidifusión o no. Sugiero echar un vistazo a observer pattern. Puede sonar un poco demasiado detallado cerca de eventos de multidifusión, pero al menos más flexible cuando lo necesite.

+0

realmente conozco ese patrón, aunque no sabía su nombre;) de todos modos, lo que necesito es algún tipo de automatización al integrarme con VCL. Tengo muchos tipos de controles que eventos necesito capturar ... – migajek

Cuestiones relacionadas