起因是这样的:我想将某个控件的left,top,width,height集中在一起显示,考虑了下,可能添加几个属性更简单。。所以就有了下面的代码。定义了yPosition 包含四个属性y1Left,y2Top,y3Width,y4Height 在使用过程中,通过属性编辑器设置这几个属性是没问题的,但是在设计器中鼠标拖拉改变了窗体的大小和位置后,属性编辑器中却没有变化??delphi源码中找了相关的事件和消息,也没看出所以然,相关代码如下:
unit yForm;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type  TyPosition = class(TPersistent)
  private
    FControl: TControl;
    FyLeft:   Integer;
    FyTop:    Integer;
    FyWidth:  Integer;
    FyHeight: Integer;
    FOnChange: TNotifyEvent;
    procedure SetyPosition(Index: Integer; Value: Integer);
    function Gety1Left: Integer;     //试图用此方式,不行
  protected
    procedure Change; virtual;
    //procedure AssignTo(Dest: TPersistent); override;
    //property Control: TControl read FControl;
  public
    constructor Create(Control: TControl); virtual;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
  published
    property y1Left:   Integer index 0 read FyLeft    write SetyPosition default 0;
    property y2Top:    Integer index 1 read FyTop     write SetyPosition default 0;
    property y3Width:  Integer index 2 read FyWidth   write SetyPosition default 0;
    property y4Height: Integer index 3 read FyHeight  write SetyPosition default 0;
  end;  TyForm = class(TForm)
  private
    FyPosition: TyPosition;
     procedure SetyPosition(const Value: TyPosition);
  protected
    //
  public
    constructor Create(AOwner:TComponent);override;
  published
    property yPosition: TyPosition read FyPosition write SetyPosition ;
  end;procedure Register;implementation{$R *.dfm}constructor TyForm.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  FyPosition := TyPosition.Create(Self);
end;procedure TyForm.SetyPosition(const Value: TyPosition);
begin
  FyPosition.Assign(Value);
end;constructor TyPosition.Create(Control: TControl);
begin
  inherited Create;
  FControl := Control;
  FyLeft   := FControl.Left ;
  FyTop    := FControl.Top;
  FyWidth  := FControl.Width;
  FyHeight := FControl.Height;
end;function TyPosition.Gety1Left: Integer;
begin
  Result := FControl.Left;
end;procedure TyPosition.Change;
begin
  if Assigned(FOnChange) then FOnChange(Self);
end;procedure TyPosition.SetyPosition(Index: Integer;Value: Integer);
begin
  //这里代码省略掉了。
end;
procedure Register;
begin
  //
end;end.

解决方案 »

  1.   

    我记得TPersistent无法使用RTTI的,从TComponent开始继承吧
      

  2.   

    TPersistent是有RTTI的,楼主这样继承没有问题。关于楼主的问题,和RTTI一点关系都没有,原因是没有实现TForm的OnSize消息,当窗体的尺寸发生改变时,没有同步的设置TyPosition的属性,属性编辑器当然没有变化了
      

  3.   

    写错了,是OnResize,不是OnSize
      

  4.   

    需要重载setbounds方法。resize事件在窗体移动时貌似不会触发。
      

  5.   


    对不起,真的是在胡说了,TPersistent前面有M+,是最低级的RTTI使用类.Sorry.