Creating components at runtime - Delphi

前端 未结 9 1881
孤街浪徒
孤街浪徒 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:21

    This is example how to emulate button tag on Evernote

    unit Unit7;
    
    interface
    
    uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, CHButton, Vcl.ExtCtrls, RzPanel, CHPanel, RzCommon,RzBmpBtn, Vcl.StdCtrls;
    
    type
      // This is panel Button
      TButtonClose = class (TRzPanel)
       CloseButton : TRzBmpButton;
       procedure CloseButtonClick(Sender: TObject);
       procedure CloseButtonMouseEnter(Sender: TObject);
       procedure MouseDown(Sender: TObject; Button: TMouseButton;
                 Shift: TShiftState; X, Y: Integer);
       procedure MouseUp(Sender: TObject; Button: TMouseButton;
                 Shift: TShiftState; X, Y: Integer);
    public
       constructor Create(AOwner: TComponent); override;
       destructor Destroy; override;
    end;
    
    TForm7 = class(TForm)
       CHButton1: TCHButton;
       RzPanel1: TRzPanel;
       RzBmpButton1: TRzBmpButton;
       procedure CHButton1Click(Sender: TObject);
       procedure RzBmpButton1Click(Sender: TObject);
       procedure RzPanel1MouseDown(Sender: TObject; Button: TMouseButton;
         Shift: TShiftState; X, Y: Integer);
       procedure RzPanel1MouseUp(Sender: TObject; Button: TMouseButton;
         Shift: TShiftState; X, Y: Integer);
       procedure RzPanel1MouseEnter(Sender: TObject);
       procedure RzBmpButton1MouseEnter(Sender: TObject);
       procedure FormMouseEnter(Sender: TObject);
       procedure FormCreate(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
    
    var
      Form7: TForm7;
      MyCloseButton : TButtonClose;
    
    implementation
    
    {$R *.dfm}
    
    // constructor for on the fly component created
    constructor TButtonClose.Create(AOwner: TComponent);
    begin
       inherited Create(AOwner);
    
       // Set Events for the component
       Self.OnMouseEnter := Self.CloseButtonMouseEnter;
       Self.OnMouseDown := Self.MouseDown;
       Self.OnMouseUp := Self.MouseUp;
       Self.Height := 25;
    
       // Close button on top panel Button
       // Inherited from Raize Bitmap Button
       CloseButton := TRzBmpButton.Create(self);
       // Set On Click Event for Close Button
       CloseButton.OnClick := Self.CloseButtonClick;
       // Place Close Button on Panel Button
       CloseButton.Parent := self;
       CloseButton.Left := 10;
       CloseButton.Top := 5;
       CloseButton.Visible := False;
       // Setting the image for the button
       CloseButton.Bitmaps.Up.LoadFromFile(ExtractFilePath(Application.ExeName)+'\close.bmp');
    end;
    
    procedure TButtonClose.CloseButtonClick(Sender: TObject);
    begin
       // Free the parent (Panel Button)
       TControl(Sender).Parent.Free;
    end;
    
    procedure TButtonClose.CloseButtonMouseEnter(Sender: TObject);
    begin
       // Show the Close button
       CloseButton.Visible := True;
    end;
    
    procedure TButtonClose.MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       // Emulate Button down state, since it is panel
       TRzPanel(Sender).BorderOuter := fsLowered;
    end;
    
    procedure TButtonClose.MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
    begin
       // Emulate Button up state, since it is panel
       TRzPanel(Sender).BorderOuter := fsRaised;
    end;
    
    destructor TButtonClose.Destroy;
    begin
       inherited Destroy;
    end;
    
    procedure TForm7.FormCreate(Sender: TObject);
    begin
       // Create Panel Button on the fly
       MyCloseButton := TButtonClose.Create(self);
       MyCloseButton.Caption := 'My Button';
       MyCloseButton.Left := 10;
       MyCloseButton.Top := 10;
       // Don't forget to place component on the form
       MyCloseButton.Parent := self;
    end;
    
    procedure TForm7.FormMouseEnter(Sender: TObject);
    begin
       if Assigned(RzBmpButton1) then
          RzBmpButton1.Visible := False;
    
       // Hide when mouse leave the button
       // Check first if myCloseButton Assigned or not before set visible property
       if Assigned(MyCloseButton.CloseButton) then
          MyCloseButton.CloseButton.Visible := False;
    end;
    
    procedure TForm7.RzBmpButton1Click(Sender: TObject);
    begin
       TControl(Sender).Parent.Free;
    end;
    
    procedure TForm7.RzBmpButton1MouseEnter(Sender: TObject);
    begin
       RzBmpButton1.Visible := True;
    end;
    
    procedure TForm7.RzPanel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      TRzPanel(Sender).BorderOuter := fsLowered;
    end;
    
    procedure TForm7.RzPanel1MouseEnter(Sender: TObject);
    begin
       RzBmpButton1.Visible := True;
    end;
    
    procedure TForm7.RzPanel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       TRzPanel(Sender).BorderOuter := fsRaised;
    end;
    
    procedure TForm7.CHButton1Click(Sender: TObject);
    begin
       FreeAndNil(Sender);
    end;
    
    end.
    

提交回复
热议问题