关于RTTI的问题请教。
起因是这样的:
我想将某个控件的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.