como yo lo hice, es así:
en mi caso era un TTreview que cada hijo tenia en su propiedad 'data' un puntero a
un registro, para tu caso es lo mismo solo que usas un boton y la propiedad 'tag'
Y adicionalmente usaba una lista de punteros (TCDenMemoria) para leer desde un archivo de configuracion el registro que tenia asociado cada nodo del TTreeview.
Siento mucho no poder ponerte todo el código para copiar y pegar en delphi, pero aqui tienes lo básico.
NOTA: Espero que no estes peleada con los punteros....
Los tipos de datos que yo definí son estos:
Código:
type TCadena=String[255];
type TEnCD=record // el regisro asociado a cada boton
Titulo,
Categoria,
RutaEnCD,
Comentario :Tcadena;
end;
type TpEnCD=^TEnCD;
// TpEnCD es un tipo de datos que será un puntero al registro TEnCD
//TCDenMemoria es una lista de punteros
// implementada en Delphi 3
// para leer desde un archivo todos los registros de tipo TEnCD
type TCDenMemoria=record
siguiente: pointer;
datos: TenCD;
end;
type TpCDenMemoria=^TCDenMemoria;
para crear el registro asociado a un boton:
Código:
var pn:TpEnCD;
begin
try
begin
new(pn);
pn^.Titulo:=edit1.text;
pn^.RutaEnCD:=edit2.text
pn^.Comentario:=richedit1.text;
pn^.Categoria:='CD sin categorias'
para liberar de memoria:
Código:
var pTV:TpEncd;
begin
repeat
try
ptv:=Tpencd(boton.tag);
dispose(ptv); //posible EInvalidPointer exception.
//buscar siguiente boton //el nodo para mi son los hijos de un TTReview, para ti es el array de botones
except
// fallo al liberar el registro
end;
until boton=nil; // tu sabrás cuando se termina el array de botones ;-)
para ejecutar la aplicacion asociada a un boton:
Código:
var fich, ruta:string;
p:=tpencd(BotonSeleccionado.tag);
fich:=p^.Titulo;
ruta:=extractfilepath(p^.RutaEnCD);
shellexecute(handle,pchar('open'),pchar(fich),nil,pchar(ruta),SW_SHOW);
para guardar todos los registros a un solo archivo
Código:
var f:File of TenCD;
begin
assignfile(f,'c:\window.cfg');
rewrite(f);
pdatos:=TpEncd(boton.tag);
write(f,pdatos^);
// buscar siguiente boton y hacer lo mismo
CloseFile(f);
end
para leer del fichero la configuracion de todos los botones.
Código:
procedure Tfrmppal.CargaDatos();
{ pedir el fichero de cfg
abrirlo y crear lista en memoria
buscar los programas y añadirlos segun la estructura TpEnCD
}
var f:file of TenCD;
fdato:TenCD;
puntAct:TpCDenMemoria;
i:integer;
begin
try
//buscar el window.cfg
opendlg.Title:='Abrir fichero de Configuración';
opendlg.Filter:='Configuración|*.cfg';
opendlg.InitialDir:='c:\al cd';
opendlg.FileName:='window.cfg';
opendlg.DefaultExt:='.cfg';
if not opendlg.execute then
begin
exit
end;
assignfile(f,opendlg.FileName);
filemode:=fmOpenRead;
reset(f);
new(lista);
puntact:=tpcdenMemoria(lista);
read(f,fdato);
except
frmNotificar.Error(true,clblue,'El fichero de datos: window.cfg '+#10+ 'No está presente o está vacio.' );
dispose(lista);
exit;
end;
//averiguar si tiene categorias o no el CD;
reset(f);
while not eof(f) do
begin
read(f,fdato);
puntact^.datos:=fdato;
if not eof(f) then
begin
new(tpcdenmemoria(puntact^.siguiente)); // exception EOutOfMemory
puntact:=tpcdenmemoria(puntact^.siguiente);
puntact^.siguiente:=nil;
end;
end;
end;
Muuuuucha suerte!!!