在IDE中设计窗体时,可以自由放置和定位非可视组件(例如TMainMenus,TDatamodules)。该位置是持久的,所以在重新加载表单时,这些组件出现在正确的位置。如何访问非可视化Delphi组件的设计位置?
但是,TComponent没有顶部或左侧的属性!
那么,如何将我的代码访问非可视化组件的“设计的立场”?
在IDE中设计窗体时,可以自由放置和定位非可视组件(例如TMainMenus,TDatamodules)。该位置是持久的,所以在重新加载表单时,这些组件出现在正确的位置。如何访问非可视化Delphi组件的设计位置?
但是,TComponent没有顶部或左侧的属性!
那么,如何将我的代码访问非可视化组件的“设计的立场”?
这可以在运行时访问,但它是那种一个黑客攻击。 (主要是因为它是作为一种破解实现的)。
Left和Top属性设置为字大小值,并且它们中的两个被打包在一起,称为TComponent.FDesignInfo
。您可以使用DesignInfo
属性获取其值。看看TComponent.DefineProperties
来看看它是如何使用的。
这就是我需要的破解。谢谢。 – Roddy
谢谢!但我怎样才能设置这个值?我需要设置一些非可视组件的位置。 – user1580348
而且也:
目的:将图标放在视觉区域外,在设计时隐藏它。
注意:例如创建直接从TComponent派生的简单视觉组件时,我记得一个非常简单的标签(taht是全部对齐顶部,allways left = 0,top是自动计算的, bla bla bla)只将标题属性存储到.dfm文件中;并且任何本地化程序都只会看到该标题属性。
的解决方案是要覆盖ReadState
使用如下代码:
procedure TMyComponent.ReadState(Reader:TReader);
var
NewDesignInfo:LongRec;
begin
inherited ReadState(Reader);
NewDesignInfo.Hi:=Word(-100); // Hide design-time icon (top position = -100)
NewDesignInfo.Lo:=Word(-100); // Hide design-time icon (left position = -100)
DesignInfo:=Longint(NewDesignInfo); // Set the design-icon position out of visual area
end;
希望帮助别人!
@David,当然IDE只是“运行时代码”,当然?我并不期待它很容易,但它是可能的。 – Roddy
对于左侧现在的位置尝试'LongRec(YourComponent.DesignInfo).Lo'和顶部使用'LongRec(YourComponent.DesignInfo).Hi' – RRUZ
什么是你能够访问运行时代码的左边和顶部无属性的好处可视化组件? –