A primeira pergunta que alguém pode fazer é "Por que eu preciso criar  componentes em tempo de execução?" Posso dar vários motivos e vou citar  apenas dois. Primeiro: suponhamos que você permita que o usuário do seu  sistema crie novos campos em um tabela. Para que ele possa usar esses  novos campos são necessários novos componentes no form, correto?  Segundo: eu quero criar um relatório genérico que possa imprimir dados  de qualquer tabela. Apenas em tempo de execução eu irei saber quais e  quantos componentes eu irei usar nesses casos. Então vamos à prática.  Para nosso exemplo irei criar um botão da classe 
TButton. Mas poderia ser qualquer componente que você precise criar.
Criando um TButton em tempo de execução 
A  primeira coisa a fazer é declarar uma variável para o botão, por  exemplo:
Botao: TButton;
Pode ser necessário incluir a unit 
StdCtrls. Em seguida escrevemos o código que cria o componente:
Botao  := TButton.Create(nil);
O construtor 
Create espera receber o dono do componente (
Owner)  como parâmetro. Nesse caso informamos que o Botão não tem dono. Você  pode ainda informar 
Self ou 
Application. Se for informado  um desses dois últimos, o objeto criado será destruído juntamente com o  seu dono. No nosso exemplo o objeto deve ser destruído explicitamente  usando o método 
Free.
Quando um objeto é criado, muitas propriedades recebem valores  padrão. Dessa forma precisamos definir pouca coisa mais.
Botao.Parent  := Form1;
Botao.Name  := 'Botao';
Botao.Caption  :='Ok';
A  propriedade 
Parent informa onde o componente será colocado. Ou seja 
Parent indica o componente que contém o botão. Se  tivermos um 
TPanel chamado 
Panel1 dentro do 
Form1 e  desejarmos inserir o botão nesse painel, só precisamos informar 
Botao.Parent  := Panel1. Podemos definir valores para as propriedades 
Left e 
Top do botão. Esses valores são sempre relativos ao 
Parent. Ambas serão inicializadas com 0, caso não atribuirmos valores para elas.
Se desejarmos definir um método para um evento do componente, é necessário criar o método primeiro. Por exemplo, supondo que queremos programar o evento 
OnClick do botão:
procedure TForm1.Clica(Sender: TObject);
begin
   ShowMessage('Componente dinâmico'); 
end;
Assim, podemos referenciar o método durante a criação do componente com o comando:
Botao.OnClick := @Clica;
Para liberar a memória quando não precisarmos mais do componente usamos o seguinte comando, que pode ser colocado no evento 
OnClose do form.
Botao.Free;
Um novo item de menu 
Para incluir um novo item de menu, vamos supor que já exista um 
TPopupMenu chamado 
PopupMenu1. Declaramos um novo 
TMenuItem:
ItemNovo: TMenuItem;
E o código para cirar o novo item:
ItemNovo := TMenuItem.Create(nil);
ItemNovo.Caption := 'Nova opção';
ItemNovo.Name := 'ItemNovo';
ItemNovo.OnClick := @Clica; 
PopupMenu1.Items.Add(ItemNovo);
Agora, resta exceutar o programa e experimentar nossos componentes dinâmicos.
Atualizado em 16/05/2010.
 
Comentários
Quem bem souber usar técnicas assim já iniciará usando boas práticas de OO, pois com esta aí podemos desacoplar interfaces.
Valeu prof. Carlos :)
Ficamos viciados na facilidade da programação visual e acabamos por engessar nossas aplicações e nossos usuários. Esquecemos que o poder que a OO nos dá de dinamizar os sistemas, facilitando em muito a vida dos usuários.
Valeu
Mande-me um e-mail.