Заранее описываешь процедуру соотв. типа. Далее, созданному компоненту присваиваешь эту процедуру. Ну а смещение делается через сохранение координат последнего созданного компонента. Пример:
Код:
type
TForm1 = class(TForm)
...
procedure RunTimeButtonClick(Sender : TObject);
end;
procedure TForm1.RunTimeButtonClick(Sender : TObject);
begin
ShowMessage('Run-time event handler.');
end;
procedure TForm1.Button1Click(Sender : TObject);
var
I : Integer;
X, Y : Integer;
RTButton : TButton;
begin
X := 0;
Y := 0;
For I := 0 To 9 Do
Begin
RTButton := TButton.Create(Self);
RTButton.Caption := 'Button ' + IntToStr(I);
RTButton.OnClick := RunTimeButtonClick;
RTButton.Top := Y;
RTButton.Left := X;
X := X + RTButton.Width;
Y := Y + RTButton.Height;
End;
end;