Ahora que ya sabemos quien va a ser el padre de nuestro componente, tenemos que decidir qué propiedades y eventos vamos a proporcionar a nuestros usuarios del componente.
A priori parecen interesantes o necesarias las siguientes:
- CarpetaRaiz: se trata de una cadena que contendrá la carpeta a partir de la que se creará el árbol de directorios. Puede ser la carpeta raíz de una unidad de disco (p.e. “C:\”) para mostrar los directorios de todo la unidad, o bien una carpeta cualquiera, para mostrar las subcarpetas de esta. Un caso especial se dará cuando esta propiedad contenga el valor “Mi PC”, con en el que mostraremos cada una de las unidades disponibles en nuestro sistema, pudiendo expandir estas unidades para mostrar sus carpetas.
- CarpetaActual: es un valor de tipo cadena que contiene la ruta de la carpeta seleccionada en el árbol. Si, por ejemplo, tenemos seleccionada la carpeta de primer nivel "Datos", y el nodo raíz es “C:\Temporal”, esta propiedad contendrá el valor “C:\Temporal\Datos”. También se puede modificar su valor, seleccionándose en ese caso el nodo correspondiente en el árbol (si el valor establecido es correcto).
- MostrarPadre: es un valor booleano (true o false) que nos permite configurar la aparición o no del nodo padre. Es decir: si en la propiedad “CarpetaRaiz” hemos introducido el valor “C:\Delphi”, en el árbol aparecerá un nodo raíz llamado “Delphi”, y colgando de él, todas las demás subcarpetas. Si establecemos esta propiedad a falso, el nodo raíz desaparecerá, mostrándose todas las subcarpetas en un primer nivel, sin colgar de ningún nodo padre.
Bueno, creo que con esto puede ser suficiente para tener un componente bastante versátil.
Un primer esqueleto del componente podría ser el que vemos en el siguiente listado:
TCustomArbolDirectorios = class(TCustomTreeView)
private
FMostrarPadre: boolean;
FCarpetaRaiz: string;
procedure SetMostrarPadre(value: boolean);
procedure SetCarpetaRaiz(value: string);
function GetCarpetaActual: string;
protected
property MostrarPadre: boolean read FMostrarPadre write SetMostrarPadre;
property CarpetaRaiz: string read FCarpetaRaiz write SetCarpetaRaiz;
property CarpetaActual: string read GetCarpetaActual;
public
constructor Create(AOwner: TComponent); override;
end;
Si lo estudiamos detenidamente, veremos que hemos heredado nuestra clase de TCustomTreeView (por las razones que ya hemos explicado), definiendo las propiedades que acabamos de mencionar, así como los correspondientes métodos de lectura (Get) y escritura (Set). Es estos métodos de escritura, haremos las validaciones correspondientes, como por ejemplo, verificar que la carpeta exista.
Y por último, ¿alguien se ha fijado en el nombre que le he dado a la clase del nuevo componente? ¿TCustomArbolDirectorios? ¿No dijimos que iba a llamarse TArbolDirectorios? Pues sí, pero he aplicado el mismo patrón de diseño que utiliza Borland para la VCL. En nuestra clase "Custom", definiremos toda la lógica de nuestro componente, sin publicar ninguna propiedad ni evento, y más tarde definiremos la clase definitiva (TArbolDirectorios) que simplemente publicará las propiedades que consideremos oportunas, tanto de TCustomTreeView como de TCustomArbolDirectorios. Podéis ver el esqueleto de TArbolDirectorios en el siguiente listado:
TArbolDirectorios = class(TCustomArbolDirectorios)
published
propiedades heredadas de TCustomTreeView
property AutoExpand;
property BorderStyle;
property HotTrack;
property Images;
property ReadOnly;
property RightClickSelect;
eventos heredados de TCustomTreeView
property OnChange;
property OnChanging;
property OnCollapsed;
property OnCollapsing;
property OnDeletion;
property OnEditing;
property OnEdited;
property OnExpanding;
property OnExpanded;
property OnGetImageIndex;
property OnGetSelectedIndex;
propiedades heredadas de TCustomArbolDirectorios
property MostrarPadre;
property CarpetaRaiz;
property CarpetaActual;
end;