Creación de componentes VCL (III) - Interceptando los eventos

5 - Interceptando los eventos

[editar]
Curso gratis creado por José Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999


Si queremos que el árbol se comporte de forma ágil, tenemos que ir creando lo distintos nodos bajo demanda, es decir: sólo crear las subcarpetas de aquellos nodos que se vayan expandiendo, y no todas a la vez. En caso contrario, si por ejemplo, intentamos que el componente muestre el árbol de “C:\”, tendría que recorrer por completo la estructura de directorios de la unidad, para ir creando todos y cada uno de las carpetas encontradas. Sin embargo, utilizando este método, sólo se recorrerán las carpetas que cuelguen directamente de “C:\”, que no serán demasiadas, y todas las que estén por dejado solo se crearán cuando se expanda la carpeta correspondiente. Para conseguir esto, tenemos que interceptar el momento en que se intenta expandir un nodo. Si no fueramos programadores de componentes, no bastaría con codificar el evento OnExpanding, que es precisamente el que se dispara justo antes de expandir un nodo. Bastaría con asignar el evento, e insertar en ese momento los nodos correspondiente.

Sin embargo, los eventos de las clases padre no están ahí para ser usados desde los componentes hijos, sino para que el programador que utilice el componente final pueda asignarlos. La razón de esto es sencilla: dijimos que cada evento era un puntero a una función, por lo que ese puntero solo puede contener una dirección. No debemos utilizar ese puntero en los componentes derivados, ya que, si lo hacemos, estaremos ocupando ese puntero, cuando debería estar disponible para que lo utilice el programador final.

Tenemos un problema ¿no? Si os sirve de consuelo, Microsoft ha tenido este inconveniente en cuenta, a la hora de diseñar el modelo de eventos de los lenguaje de la plataforma .NET. Para solucionarlo, han definido lo que llaman “delegates”, que no son más que listas de punteros para almacenar un conjunto de eventos (y no un solo puntero para almacenar un solo evento, como en la VCL). De este modo, podemos asignar distintos eventos un solo “delegate”, ejecutándose estos en el orden establecido. Pero, como dijo el autor de Momo: esto es otra historia, y debe ser contada en otra ocasión.

Un programador de componentes, no puede utilizar los eventos heredados del componente padre, ya que estos eventos solo están disponibles para quien utilice el componente final.

Nosotros, resignados programadores de componentes para Delphi, tenemos que buscar la manera de recibir el evento, sin utilizar ese puntero interno. Por suerte, Borland se dio cuenta de esto a la hora de diseñar la VCL, y nos ofrecen puntos de entrada para estos casos. Veamos: cada vez que se va a lanzar el evento de un componente, se hace a través de un método virtual (o dinámico, que básicamente es lo mismo). Este método, al ser virtual, podemos sobrescribirlo desde los descendientes, y si lo hacemos, se ejecutará nuestro código en vez de código del padre. Así, desde el método que hemos sobrescrito, podemos hacer cualquier proceso, y antes o después llamar al padre (con la instrucción inherited) para que ocurra lo que tenía que ocurrir, es decir: que se lance el correspondiente evento de usuario.

De este modo, el problema se reduce a averiguar qué método del padre tenemos que sobrescribir para que todo funcione. Para ello, tendremos que rebuscar en la ayuda de Delphi (en las páginas que documentan el componente TCustomTreeView) o incluso en el código fuente de la VCL (que está disponible en el directorio “Source” de nuestra instalación de Delphi).

Para nuestro caso, necesitamos recibir el evento OnExpanding, que en TCustomTreeView se lanza a través del método dinámico CanExpand. Así que nuestro objetivo es sobrescribir este método protegido, y lanzar en él algún método que nos inserte, bajo el nodo que estamos expandiendo, las subcarpetas encontradas. Esto lo haremos a través de un método que llamaremos, por ser originales, CargarSubcarpetas.
[editar]

Sé el primero en opinar


Cursos gratis relacionados con 'Creación de componentes VCL (III)'

En los últimos años, el desarrollo basado en componentes se ha convertido en una de... Más »

Autor y licencia de 'Creación de componentes VCL (III)'


Curso gratis de José Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.