Creating components at runtime - Delphi

前端 未结 9 1893
孤街浪徒
孤街浪徒 2020-12-02 15:04

How can I create a component at runtime and then work with it (changing properties, etc.)?

9条回答
  •  执念已碎
    2020-12-02 15:23

    I would just like to add that when dynamically adding controls... it as a good idea to add them to an object list (TObjectList) as suggested in <1> by @Despatcher.

    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;
    

    You need to add the Unit 'Contnrs' to your Uses list. I.e System.Contnrs.pas the base Containers Unit And you can have many object lists. I suggest using a TObjectList for each type of control that you use e.g.

    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
    

    this allows you to easily manipulate/manage each control as you will know what type of control it is e.g.

    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;
    

    This allows you to then use the methods and properties of that control Don't forget to create the TObjectLists, perhaps in the form create event...

    checkBoxCntrlsList := TObjectList.Create;
    comboboxCntrlsList := TObjectList.Create;
    

提交回复
热议问题