gpt4 book ai didi

delphi - 替换delphi中的组件类

转载 作者:行者123 更新时间:2023-12-03 14:36:49 29 4
gpt4 key购买 nike

我知道我在某个地方看到过一个 hack 的例子,它定义了现有 VCL 组件的自定义版本,例如 TButtonTEdit,具有相同的类名并执行一些操作,以便 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com