Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to auto include files when Delphi VCL design time package is put onto the form

I built a wrapper around the TWebBrowser in Delphi. The wrapper aims at implementing multiple web browsers (edge chromium, chrome etc) into a single wrapper that auto detects which browser to use.

After I completed the class I turned said class into a VCL component and loaded it into a design time package. My component includes only two files, the wrapper itself and a utilities class. When I drag my component from the tools palette onto a VCL form the wrapper and the utilities class are not added automatically to the project. This means I have to manually include both the wrapper and the utility into the project.

I was hoping there was a way to automatically include these two files into the project when the wrapper is added to the form. I think I have seen this before with other third party components I have used but my memory may be failing me.

If this is a thing that can be done, my assumption is that it would be in the register section of the VCL component.

procedure Register;
begin
   RegisterComponents('My Wrappers', [TWebBrowserWrapper]);
end;

As that is the code that I believe is run when in design time.

like image 948
Matt Avatar asked Mar 03 '23 03:03

Matt


1 Answers

Have your design-time package implement a class that inherits from TSelectionEditor and overrides its virtual RequiresUnits() method, and then register that class for your component using RegisterSelectionEditor(). This way, whenever you place your component onto a Form/Frame/DataModule Designer at design-time, any additional units you report from RequiresUnits() will be added automatically to that unit's uses clause when the unit is saved.

For example:

uses
  ..., DesignIntf;

type
  TWebBrowserWrapperSelectionEditor = class(TSelectionEditor)
  public
    procedure RequiresUnits(Proc: TGetStrProc); override;
  end;

procedure TWebBrowserWrapperSelectionEditor.RequiresUnits(Proc: TGetStrProc);
begin
  inherited RequiresUnits(Proc);
  // call Proc() for each additional unit you want added...
  Proc('MyWrapperUnit');
  Proc('MyUtilityUnit');
end;

procedure Register;
begin
  RegisterComponents('My Wrappers', [TWebBrowserWrapper]);
  RegisterSelectionEditor(TWebBrowserWrapper, TWebBrowserWrapperSelectionEditor);
end;
like image 181
Remy Lebeau Avatar answered Mar 04 '23 16:03

Remy Lebeau