Para crear un boton en tiempo de ejecucion necesitas:
*Definir la variable del boton
*Crear una instancia del Boton
Boton := TButton.Create(self);
Boton := TButton.Create(From1);
Boton := TButton.Create(nil);
*Cambiar sus propiedades
Width := 128;
Height := 24;
Parrent := Form1; //Quien es el Padre del boton, es decir, donde se va a dibujar
Caption := 'Boton'
onClick := Evento;
Visible := True;
*Y finalmente liberarlo de la memoria
Los eventos en Delphi, es decir los tipo TNotifyEvent estan definidos asi>
type
TNotifyEvent = procedure(Sender: TObject);
TIntegerFunction = function: Integer;
TProcedure = procedure;
TStrProc = procedure(const S: string);
TMathFunc = function(X: Double): Double;
Asi, todos los eventos son procedimientos que tienen como parametro a "Sender" que es el que crea el evento. O sea, si hiciste click en un boton, en el evento onClick de ese boton, el Sender va a ser el boton.
Lo que pasa, es que sender es de tipo TObject, la clase padre de todas las clases. Todas las clases en Delphi estan heredadas en ella. La Classe TButton, deriva de TCustomButton y esa en algun momento de TComponent y en muchas otra vueltas, finalemnte se llega a TObject.
Como las instancias de clases (seria el objeto creado) en Delpi son punteros y no contienen al objeto en si, mediante type casing podes acceder a las propiedades del parametro Sender como si fuera un TButton (o cualquier otra cosa, siempre que lo fuera)
Todos los TButton son TObject.
Algunos TObject pueden ser TButtons, por eso, en tu propio evento deber'ias verificar si el Sender definitivamente es un TButton con>
if Sender is TButton then
begin
end;
Si resulta que el Sender es un TButton entonces podes acceder a las propiedades del boton con>
Existe la palabra reservada 'AS', que cumple la funcion type casing, pero es muuuuuuy lenta, y te conviene usar 'is' y luego type casing;
//esto te consume mucho tiempo
//y no se asegura que sea un boton el sender
//por eos puede haber un error en tiempo de ejecucion
whith Sender as TButton do
begin
Caption := 'Boton';
Visible := True;
end;
El Evetno seria algo asi>
Asignamos a nuestro boton, nuestro propio evento onClick
myButton.onClick := myClick;
El evento ser'ia algo asi,
procedure myClick(Sender:TObject);
begin
//en realidad en este caso es 100% seguro de que el Sender es TButton
//porque nosotros mismos asignamos el evento a un boton
if Sender is TButton then
begin
...
end;
end;
Supongo que con eso queda explicado.