I know I've seen an example somewhere of a hack to define a custom version of an existing VCL component, like TButton or TEdit, with the same class name and do something to make it so that the DFM streamer will instantiate your version instead of the original. Unfortunately, I'm in a situation where I need to be able to do that and I can't find the write-up. Does anyone know where to find information on how to accomplish this?
In your form you can override the ReadState
method like so:
type
TMyForm = class(TForm)
protected
procedure ReadState(Reader: TReader); override;
end;
procedure TMyForm.ReadState(Reader: TReader);
begin
Reader.OnFindComponentClass := FindComponentClass;
inherited;
end;
procedure TMyForm.FindComponentClass(Reader: TReader; const ClassName: string;
var ComponentClass: TComponentClass);
begin
if ComponentClass=TButton then begin
ComponentClass := TMySuperDuperButton;
end else if ComponentClass=TEdit then begin
ComponentClass := TMyTotallyAwesomeEdit;
end;
end;
There are likely numerous other ways to do this, but this is how I do it!
EDIT: Inspecting TReader.GetFieldClass(Instance: TObject; const ClassName: string)
suggests the hack that Mason recalls. The first line sets ClassType := Instance.ClassType
. So I suspect that by changing the declaration in the pas file from Button1: TButton
to Button1: MyUnit.TButton
will result in your button being created. Or perhaps the hack was to add MyUnit
to the uses clause right at the end so that your version of TButton is the one that is in scope. However, none of this sounds very practical.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With