I have created a routine to make the corners of Delphi visual controls to be rounded.
Now what I want to do is ensure that every visual object like TMemo, TEdit and TPanel comes rounded without having to call the function for everyone of them at the form creation.
How do I make an extension of the create method for each of these classes from my code (form unit), so they keep the name of the class and the normal behavior on other units?
procedure RoundCornersOf(Control: TWinControl) ;
var
R: TRect;
Rgn: HRGN;
begin
with Control do
begin
R := ClientRect;
rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, 20, 20) ;
Perform(EM_GETRECT, 0, lParam(@r)) ;
InflateRect(r, - 4, - 4) ;
Perform(EM_SETRECTNP, 0, lParam(@r)) ;
SetWindowRgn(Handle, rgn, True) ;
Invalidate;
end;
end;
There exist constructs or hacks to modify classes at runtime, see for example Replacing a component class in delphi and Changing component class at run-time on demand. However, as fas as I understand, you have to declare separate types of all occurring control types.
An alternative is to transverse over all controls after the form’s creation, using the
ControlsandControlCountproperties:But beware of control recreation, which happens more then you would think. For instance, changing the
BorderStyleproperty of an Edit results in recreating the Edit which undoes your modification. Redo the modification in those cases, providing you could track them all.