gpt4 book ai didi

delphi - 在对象检查器上显示 TFrame 后代的附加属性

转载 作者:行者123 更新时间:2023-12-03 14:40:33 26 4
gpt4 key购买 nike

Delphi 对象检查器按设计不显示 TFrame 后代的附加属性。人们倾向于建议使用一种已知的技巧,该技巧通常用于在对象检查器上显示 TForm 后代的属性。技巧是:通过设计时包将 TForm 后代的自定义模块注册到 Delphi IDE,例如:

RegisterCustomModule(TMyFrame, TCustomModule);

对象检查器可以通过这种方式显示 TFrame 后代实例的附加属性,但它在嵌入表单时会丢失其框架行为。不可重新设计,不可能为其子组件实现事件,并且它接受子控件(它不能)。但它在自己的设计区域内表现正常。

看起来,这些行为是Delphi IDE专门为TFrame提供的。它们可能不是通用设施。

有没有其他方法可以在不丢失框架行为的情况下完成此任务?

我使用的是 Delphi 2007

<小时/>

@Tondrej,

阅读有关该问题的评论,提前致谢。

frameunit.dfm:

object MyFrame: TMyFrame
Left = 0
Top = 0
Width = 303
Height = 172
TabOrder = 0
object Edit1: TEdit
Left = 66
Top = 60
Width = 151
Height = 21
TabOrder = 0
Text = 'Edit1'
end
end
<小时/>
unit frameunit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TBaseFrame = Class(TFrame)
protected
Fstr: string;
procedure Setstr(const Value: string);virtual;
published
Property str:string read Fstr write Setstr;
End;

TMyFrame = class(TBaseFrame)
Edit1: TEdit;
private
// This won't be called in designtime. But i need this to be called in designtime
Procedure Setstr(const Value: string);override;
end;

implementation

{$R *.dfm}

{ TBaseFrame }

procedure TBaseFrame.Setstr(const Value: string);
begin
Fstr := Value;
end;

{ TMyFrame }

procedure TMyFrame.Setstr(const Value: string);
begin
inherited;
Edit1.Text := Fstr;
// Sadly this code won't work and Edit1 won't be updated in designtime.
end;

end.
<小时/>
unit RegisterUnit;

interface

procedure Register;

implementation

uses
Windows, DesignIntf, frameunit;

procedure Register;
var
delphivclide: THandle;
TFrameModule: TCustomModuleClass;
begin
delphivclide := GetModuleHandle('delphivclide100.bpl');
if delphivclide <> 0 then
begin
TFrameModule := GetProcAddress(delphivclide, '@Vclformcontainer@TFrameModule@');
if Assigned(TFrameModule) then
begin
RegisterCustomModule(frameunit.TBaseFrame, TFrameModule);
// Just registering that won't cause Tmyframe to loose its frame behaviours
// but additional properties won't work well.

//RegisterCustomModule(frameunit.TMyFrame, TFrameModule);
// That would cause Tmyframe to lose its frame behaviours
// But additional properties would work well.

end;
end;
end;


end.

最佳答案

您正在为您的框架注册哪个自定义模块类?您使用的是哪个版本的 Delphi?

根据我对 Delphi 2007 的实验,似乎有效的自定义模块类是 TFrameModule。此类包含在 delphivclide100.bpl 中。由于没有对应的delphivclide.dcp,你必须手动加载它:

unit FrameTestReg;

interface

procedure Register;

implementation

uses
Windows, DesignIntf,
FrameTest;

procedure Register;
var
delphivclide: THandle;
TFrameModule: TCustomModuleClass;
begin
delphivclide := GetModuleHandle('delphivclide100.bpl');
if delphivclide <> 0 then
begin
TFrameModule := GetProcAddress(delphivclide, '@Vclformcontainer@TFrameModule@');
if Assigned(TFrameModule) then
RegisterCustomModule(TTestFrame, TFrameModule);
end;
end;

end.

我的FrameTest单元非常简单,它没有FrameTest.dfm,只有新的TFrame后代的声明:

unit FrameTest;

interface

uses
Forms;

type
TTestFrame = class(TFrame)
private
FHello: string;
published
property Hello: string read FHello write FHello;
end;

implementation

end.

使用 TFrameModule 类,到目前为止一切似乎都工作正常。我可以创建 TTestFrame 的新后代以包含在项目中,并在对象检查器中编辑其已发布的属性,将这个新后代的实例放在 IDE 中的表单上,在对象检查器中编辑其新的已发布属性,为以下对象编写事件处理程序它们的子组件等。在 .dfm 资源中,我可以看到实例的预期“内联”指令。到目前为止我还没有遇到任何问题,所以也许这就是解决方案。

关于delphi - 在对象检查器上显示 TFrame 后代的附加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/289672/

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