Solución:
Depende de si es un componente visual o no visual. El principio es el mismo, pero hay algunas consideraciones adicionales para cada tipo de componente.
Para componentes no visuales
var
C: TMyComponent;
begin
C := TMyComponent.Create(nil);
try
C.MyProperty := MyValue;
//...
finally
C.Free;
end;
end;
Para componentes visuales:
En esencia, los componentes visuales se crean de la misma manera que los componentes no visuales. Pero debe establecer algunas propiedades adicionales para hacerlas visibles.
var
C: TMyVisualComponent;
begin
C := TMyVisualComponent.Create(Self);
C.Left := 100;
C.Top := 100;
C.Width := 400;
C.Height := 300;
C.Visible := True;
C.Parent := Self; //Any container: form, panel, ...
C.MyProperty := MyValue,
//...
end;
Algunas explicaciones del código anterior:
- Al establecer el propietario del componente (el parámetro del constructor), el componente se destruye cuando se destruye el formulario propietario.
- Establecer el
Parent
La propiedad hace que el componente sea visible. Si lo olvida, su componente no se mostrará. (Es fácil perderse ese :))
Si quieres muchos componentes puedes hacer lo mismo que arriba pero en un bucle:
var
B: TButton;
i: Integer;
begin
for i := 0 to 9 do
begin
B := TButton.Create(Self);
B.Caption := Format('Button %d', [i]);
B.Parent := Self;
B.Height := 23;
B.Width := 100;
B.Left := 10;
B.Top := 10 + i * 25;
end;
end;
Esto agregará 10 botones en el borde izquierdo del formulario. Si desea modificar los botones más tarde, puede almacenarlos en una lista. (TComponentList es el más adecuado, pero también eche un vistazo a las propuestas de los comentarios a esta respuesta)
Cómo asignar controladores de eventos:
Debe crear un método de controlador de eventos y asignarlo a la propiedad del evento.
procedure TForm1.MyButtonClick(Sender: TObject);
var
Button: TButton;
begin
Button := Sender as TButton;
ShowMessage(Button.Caption + ' clicked');
end;
B := TButton.Create;
//...
B.OnClick := MyButtonClick;
Para simplificar el proceso de creación de componentes en tiempo de ejecución, puede utilizar GExperts.
- Cree un componente (o más componentes) visualmente y establezca sus propiedades.
- Seleccione uno o más componentes y ejecute GExperts, Components to Code.
- Pegue el código generado en su aplicación.
- Elimine los componentes del diseñador de formularios visuales.
Ejemplo (código de creación de TButton generado de esta manera):
var
btnTest: TButton;
btnTest := TButton.Create(Self);
with btnTest do
begin
Name := 'btnTest';
Parent := Self;
Left := 272;
Top := 120;
Width := 161;
Height := 41;
Caption := 'Component creation test';
Default := True;
ParentFont := False;
TabOrder := 0;
end;
Solo me gustaría agregar eso al agregar controles dinámicamente … es una buena idea agregarlos a una lista de objetos (TObjectList) como lo sugiere @Despatcher en <1>.
procedure Tform1.AnyButtonClick(Sender: TObject);
begin
If Sender is TButton then
begin
Case Tbutton(Sender).Tag of
.
.
.
// Or You can use the index in the list or some other property
// you have to decide what to do
// Or similar :)
end;
end;
procedure TForm1.BtnAddComponent(Sender: TObJect)
var
AButton: TButton;
begin
AButton := TButton.Create(self);
Abutton. Parent := [Self], [Panel1] [AnOther Visual Control];
AButton.OnClick := AnyButtonClick;
// Set Height and width and caption ect.
.
.
.
AButton.Tag := MyList.Add(AButton);
end;
Necesita agregar la Unidad ‘Contnrs’ a su lista de Usos.
Es decir, System.Contnrs.pas la unidad de contenedores base Y puede tener muchas listas de objetos. Sugiero usar un TObjectList para cada tipo de control que use, por ejemplo
Interface
Uses Contnrs;
Type
TMyForm = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
Var
MyForm: TMyForm;
checkBoxCntrlsList: TObjectList; //a list for the checkBoxes I will createin a TPanel
comboboxCntrlsList: TObjectList; //a list of comboBoxes that I will create in some Form Container
esto le permite manipular / administrar fácilmente cada control, ya que sabrá qué tipo de control es, por ejemplo
Var comboBox: TComboBox;
I: Integer;
begin
For I = 0 to comboboxCntrlsList.Count -1 do // or however you like to identify the control you are accessing such as using the tag property as @Despatcher said
Begin
comboBox := comboboxCntrlsList.Items[I] as TComboBox;
...... your code here
End;
end;
Esto le permite usar los métodos y propiedades de ese control.No olvide crear TObjectLists, tal vez en el formulario create event …
checkBoxCntrlsList := TObjectList.Create;
comboboxCntrlsList := TObjectList.Create;