Delphi自定义组件,can';拖动时t在设计器中的位置(顶部/左侧属性的自定义设置器)

Delphi自定义组件,can';拖动时t在设计器中的位置(顶部/左侧属性的自定义设置器),delphi,vcl,Delphi,Vcl,我已经编写了一个组件,它以X,Y为中心绘制图片。在运行时,该组件通过SetXY(X,Y:integer)过程移动 procedure MyComponent.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); begin inherited; if csDesigning in ComponentState then begin FX := ALeft + FBmp.Width div 2; FY := ATop + FBm

我已经编写了一个组件,它以X,Y为中心绘制图片。在运行时,该组件通过
SetXY(X,Y:integer)
过程移动

procedure MyComponent.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;
  if csDesigning in ComponentState then begin
    FX := ALeft + FBmp.Width div 2;
    FY := ATop + FBmp.Height div 2;
  end;
end;
为了实现这一点,我计算绘制例程中的
值,并相应地设置它们。一切都很好

但是,当我尝试在设计时进行初始定位时,我无法通过将零部件拖动到所需位置来定位零部件

当我通过对象检查器设置
Left
Top
属性时,它会起作用

过程MyCustomComponent.SetTop(常量值:整数);
开始
如果Top=(值),则
出口
继承的Top:=值;
如果csDesigning处于组件状态,则
FY:=值+FBmp.宽度分区2;
使无效
结束;
过程MyCustomComponent.SetLeft(常量值:整数);
开始
如果左=(值),则
出口
继承左:=值;
如果csDesigning处于组件状态,则
FX:=值+FBmp.宽度分区2;
使无效
结束;

我怀疑,当在表单上设计时拖放组件时,它实际上并没有设置
Left
Top
公共属性,而是调用一些其他函数来设置我从中继承组件的基础控件的私有字段成员(
TGraphicControl
).

正如fpiette和Remy都指出的那样,覆盖
挫折成功了。在设计时通过拖放组件来定位组件时,它不会单独设置公共
Left
Top
属性。而是调用
SetBounds
过程

procedure MyComponent.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;
  if csDesigning in ComponentState then begin
    FX := ALeft + FBmp.Width div 2;
    FY := ATop + FBmp.Height div 2;
  end;
end;
编辑: 测试之后,我发现要在运行时将组件正确放置在表单上,还必须在组件状态下检查
csLoading

因此,更完整的解决方案如下:

procedure MyComponent.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;
  if (csDesigning in ComponentState) or (csLoading in ComponentState ) then begin
    FX := ALeft + FBmp.Width div 2;
    FY := ATop + FBmp.Height div 2;
  end;
end;

Setting Top属性将调用
SetBounds
。左侧、宽度和高度相同。因此,您可能应该只重写
SetBounds
方法。是的,重写
SetBounds()
是对位置/大小更改做出反应的正确方法。此外,在喷漆操作期间,不要重新定位/调整部件尺寸