Creo que deberías estructurar un poco más el código, porque me parece que hay cosas que están bastante "enredadas".
Por ejmplo, mirando el procedimiento que asignas a los botones creados hay esto:
Código Delphi
[-]
...
Begin
begin
for i := (Personal.ComponentCount - 1) downto 0 do begin
if (Personal.Components[i] is TSpeedButton) then begin
btn := TSpeedButton(Personal.Components[i]);
btn.Free;
end;
end;
end;
MessageDlg('Clic en el boton: ' + TSpeedButton(Sender).Name, mtInformation, [mbOK], 0);
Nada más entrar, destruyes todos los botones que has creado (for), y justo en la línea siguiente acceder a
TSpeedButton(Sender), que es uno de los botones pulsados. ¿?¿?¿?¿
Es lógico que te de un AV.