我知道我在某个地方看到过一个 hack 的例子,它定义了现有 VCL 组件的自定义版本,例如 TButton
或 TEdit
,具有相同的类名并执行一些操作,以便 DFM Streamer 实例化您的版本而不是原始版本。不幸的是,我所处的情况是我需要能够做到这一点,但我找不到这篇文章。有谁知道在哪里可以找到有关如何实现此目标的信息?
最佳答案
在您的表单中,您可以重写 ReadState
方法,如下所示:
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;
可能还有很多其他方法可以做到这一点,但这就是我的做法!
编辑:检查TReader.GetFieldClass(Instance: TObject; const ClassName: string)
表明梅森记忆起的黑客行为。第一行设置ClassType := Instance.ClassType
。因此,我怀疑通过将 pas 文件中的声明从 Button1: TButton
更改为 Button1: MyUnit.TButton
将导致创建按钮。或者也许黑客的做法是将 MyUnit
添加到最后的 use 子句中,以便您的 TButton 版本在范围内。然而,这些听起来都不实用。
关于delphi - 替换delphi中的组件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4685863/