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. 
