Demasiadas variables, tantas que es imposible seguir el código. No usas parámetros para nada, sino que usas variables globales que despues tienes que adivinar si se ha modificado en algún sitio o no.
Código Delphi
[-]
if ZQNueva.RecordCount > 0 then
begin
DestruirBotones;
contador := 0;
while not ZQNueva.Eof do
begin
inc(contador);
CreaBoton(contador,
ZQnueva.Fields[0].AsString,
ZQNueva.Fields[1].AsString
);
ZQNueva.Next;
end;
end
else
begin
nivel := nivel-1;
showMessage ('Categoria vacia');
end;
No necesitas arr_codigos, ni arr_descripciones, amén que solo tiene 99 posiciones; si la consulta da 200 resultados, adios arrays.
Código Delphi
[-]
scontador:= IntToStr (contador);
nombre:= 'Boton';
Name := nombre+scontador;
Código Delphi
[-]
Name := 'Boton'+ inttostr(contador)
Es lo mismo ¿si o si?

Pues no, son 2 variables menos
Variables globales.... ninguna.
El código lo puedes guardar en el Label.Tag.
Saludos