Saltar al contenido

Crear componentes en tiempo de ejecución – Delphi

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.

  1. Cree un componente (o más componentes) visualmente y establezca sus propiedades.
  2. Seleccione uno o más componentes y ejecute GExperts, Components to Code.
  3. Pegue el código generado en su aplicación.
  4. 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;
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *