起因是这样的:我想将某个控件的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.
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.
对不起,真的是在胡说了,TPersistent前面有M+,是最低级的RTTI使用类.Sorry.