【发布时间】:2012-02-18 18:01:42
【问题描述】:
使用 Delphi 6 Prof.
我为分离创建了一个斜角组件。
因为我使用了 8 像素(宽 x 高)的垫片,所以我认为我创建了这个组件,当我把它放在一个 Form 上时,我只需要设置 Align - 就是这样。
type
TSSpacer = class(TBevel)
public
constructor Create(aOwner: TComponent); override;
published
//property Width default 8;
//property Height default 8;
property Shape default bsSpacer;
end;
constructor TSSpacer.Create(aOwner : TComponent);
begin
inherited Create(aOwner);
Shape := bsSpacer;
Width := 8;
Height := 8;
end;
但是当我使用这段代码(有或没有“默认值”)时,IDE 中的结果是 140 x 41 像素。
那么为什么它的尺寸不是 8 x 8?还有一点很有趣:默认的 TBevel 是 50 x 50。
是什么导致了这种大小调整?
【问题讨论】:
-
恕我直言,这是一种设计时限制(可能与网格尺寸有关,不知道)。如果你设置例如10x10 它是在设计时正确创建的。我会 hack 它 通过将值改回来但不知道如何例如在
SetBounds中确定组件处于设计时并且它的创建已经完成(Loaded过程仅用于运行时)。我尝试了快速(没有时间:) 调试,似乎属性填充器中的某些内容修改了这些值。无论如何 +1,有趣的问题! -
如果设置为 10x10,它可以工作,但如果设置为 8x8,它会失败?为什么会有不同,@Tlama?
-
@Rob,确切地说;在 D2007 和 D2009 中验证。我会怀疑设计时维度的一些内部限制。 1x10 有效,1x9 无效; 10x1 有效,9x1 无效。似乎两个尺寸都有一个小于 10 的限制,这真的很奇怪(这与网格大小无关,我设置了 8x8)。在运行时,您可以做任何您想做的事情,但是在设计时构造函数之后,有些东西会修改尺寸。很容易覆盖例如SetBounds 但我如何确定组件已完全创建(构造函数完成后 SetBounds 触发几次)。
-
至少在 D2007 中,用于设置组件初始大小的边界框被扩展为至少 10x10,以防止组件在设计器中无法命中。创建组件后,边界框将应用于组件。这允许用户通过拖动来指定组件的初始大小。
标签: delphi constructor components size design-time