最新消息:

Delphi 系统[22]关键字和保留字 read、write、default、nodefault、readonly、writeonly、stored、message – 定义属性的参数

编程 eben 188浏览 0评论

1、定义:

  • read :用于标识属性读取时所使用的成员或方法。
  • write :用于标识属性写入时所使用的成员或方法。
  • default :指示属性的默认值,或指示一个属性为类的默认属性。 只有有序类型的属性才允许默认值的存在, 否则必须在构造函数中初始化属性值。
  • nodefault :指示一个属性不允许有默认值,这通常用在继承中。
  • readonly :指示一个属性为只读。 当readonly 设为 True 时, 不允许用户修改属性, 只能通过其他对象来操作
  • writeonly :指示一个属性为只写。当writeonly 设为 true 时,不允许用户读取属性,只能通过其他对象来操作
  • stored :指示一个属性的值是否能被保留,若指定了True,则允许对属性值进行赋值撤销的操作。
  • message :用于声明消息方法。带有 message 的方法必须指出接收的消息类型,并通过引用将消息传入方法中,以便进行处理。用户可以自定义消息,自定义消息也能够被 message 接收,并引发事件。

2、示例:

{ 属性的读取 read }
type
  TMyObject = class(TObject)
  private
    FValue: Integer;
  published
    property Value: Integer read FValue; { 表明 Value 属性从FValue 成员上读出值 }
  end;
  
----------------------------------------------------------------------------------------
{ 属性的写入write }
type
  TMyObject = class(TObject)
  private
    FValue: Integer;
  published
    property Value: Integer write FValue;  { 表明 Value 属性的值写入到 FValue 成员上 }
  end;
  
---------------------------------------------------------------------------------------
{ 默认值和默认属性 default}
type
  TMyObject = class(TObject)
  private
    FAuto: Boolean;
    FCount: Integer;
    FNameList: TStrings;
  public
    constructor Create;
    { 属性默认值 default True、default 0 }
    property Auto: Boolean read FAuto write FAuto default True;
    property Count: Integer read FCount write FCount default 0;
    { 默认属性 default }
    property Names[Index: Integer]: TStrings read FNameList write FNameList default;
  end;
  
constructor TMyObject.Create;
begin
  inherited;
  FNameList := TStrings.Create;   { 分配对象资源 }
  FAuto := True;  { 设置属性默认值 }
end;
  
----------------------------------------------------------------------------------------
{ 去掉默认值 nodefault}
type
  TMyObjA = class
  private
    FValue: Integer;
  published
    property Value: Integer read FValue write FValue default 0;
  end;
  
  TMyObjB = class(TMyObjA)
  published
    property Value: Integer read FValue write FValue nodefault;
  end;
  
{ 由上例可知, TMyObjA 中的 Value 有默认值 0,TMyObjB 继承了 TMyObjA,所以也继承 了其默认值, 在此用 NoDefault 去掉默认值。 }
  
----------------------------------------------------------------------------------------
{ 只读属性 }
property ReadOnly;
  
----------------------------------------------------------------------------------------
{ 只写属性 }
property WriteOnly;
  
----------------------------------------------------------------------------------------
{ 保留属性值 stored}
type
  TComponent = class
  private
    FName: TComponentName;
  published
    property Name: TComponentName read FName write SetName stored False;
  end;
  
----------------------------------------------------------------------------------------
{ 声明消息方法 message}
unit Form1Unit;
  
interface
  
uses
  Windows, Messages, SysUtils, Variants,Classes, Graphics, Controls, Forms, StdCtrls;
  
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure Refresh(var Msg: TMessage); message WM_SIZE;
  public
    { Public declarations }
  end;
  
var
  Form1: TForm1;
  
implementation
{R *.dfm}
 
{ 此方法捕捉窗口尺寸被改变的消息 }
procedure TForm1.Refresh(var Msg: TMessage);
begin
  { 先将窗口的尺寸显示在标题栏中 }
  Caption := IntToStr(Width) + ' - ' +  IntToStr(Height);
  { 再调用默认消息处理函数,重绘窗口 }
  inherited;
end;
 
{ 随机调整窗口的大小 }
procedure TForm1.Button1Click(Sender: TObject);
var
  Size: Integer;
begin
  { 先将按钮自身移到窗口左上角,以免窗口缩小后被遮挡 }
  (Sender as TButton).Left := 0;
  (Sender as TButton).Top := 0;
 
  { 获取一个随机数,可正可负 }
  Randomize;
  Size := Random(100) - 50;
  { 设置窗口的新大小 }
  Width := Width + Size;
  Height := Height + Size;
  { 当窗口大小改变后,就会触发 WM_SIZE 消息,从而调用我们定义的TForm1.Refresh }
end;
 
end.

 

转载请注明:落伍老站长 » Delphi 系统[22]关键字和保留字 read、write、default、nodefault、readonly、writeonly、stored、message – 定义属性的参数

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址