Mega Code Archive

 
Categories / Delphi / OOP
 

Adding new methods and properties without registering new components

Title: Adding new methods and properties without registering new components Question: Is there a way to add new methods and properties to a component without having its soruce code and having to install a descendant component? Answer: Adding new methods and properties --------------------------------- Sometimes we need to add new methods and properties to an existing component (or change the visibility of existing properties). One way of doing this is modifiying the component, but this implies having to recompile its package and we would have to redistribute our changes if we wanted our application to be compiled by others, and that would be a bother for the recipients. Sometimes we may not even have that choice because we may not have the source code. In these situations, better would be to subclass (derive) the component and add new properties and methods. For example: type TEditX = class(TEdit) public function GetForeColor: TColor; procedure SetForeColor(color: TColor); property ForeColor: TColor read GetForeColor write SetForeColor; end; These methods could for example be implemented this way: function TEditX.GetForeColor: TColor; begin Result := Font.Color; end; procedure TEditX.SetForeColor(color: TColor); begin Font.Color := Color; end; It's a silly example, of course, but it serves the purpose. Casting to the new class ------------------------ We don't need to intall this new component and register it in the components palette or replace existing controls in our applications (which would be an unpayable penalty for such small changes and/or additions). Instead, any time we want to access the new properties and methods, we can just cast the object (for example Edit1) to our new class. For example: TEditX(Edit1).ForeColor := clRed; or TEditX(Edit1).SetForeColor(clRed); Warning: This casting to a descendant class can only be done if the new class adds new properties and static methods, but without adding new fields and new virtual or dynamic methods, although in theory you can override existing virtual methods. Also, the visibility of existing properties can be changed, as in the InplaceEditor example explained in the article "Accessing hidden properties".