setdefault方法在这里!
procedure TButton.SetDefault(Value: Boolean);
var
  Form: TCustomForm;
begin
  FDefault := Value;
  if HandleAllocated then
  begin
    Form := GetParentForm(Self);
    if Form <> nil then
      Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl));
  end;
end;

解决方案 »

  1.   

    “read FDefault write SetDefault default False”对属性default的定义。
    read和write都是属性default值的来源
    default false是指property Default的默认值为false。
      

  2.   

    cobi(我是小新,我只有5岁):
    能否说的清楚点,具体点!
    fdefault,setdefault具体什么作用?
      

  3.   

    是赋值write函数和读值read函数
    缺省值是false
      

  4.   

    property Default: Boolean read FDefault write SetDefault default False;default是布尔型的属性,缺省值为false,SetDefault过程是用来对这个属性设置的处理。
      

  5.   

    property Default: Boolean read FDefault write SetDefault
      setdefault过程的功能是对fdefault域赋值,default属性实际上并不包含任何的数据。default是fdefault域的辅助域,当想得到default中的值的时候,它就从fdefault中读取;当
    视图对default属性设置值的时候,default就调用setdefault对fdefault设置值。  这样做的好处包括:
      1。通过一个简单的变量就使得外部代码可以访问对象的数据,而不需要知道对象的实现细节;
      2。在派生类中可以覆盖象setdefault方法以实现多态性
      

  6.   

    Focus(老鱼):
    我的理解和你一样!
    但为什么要用函数来读写类的私有变量呢?比如我这个例子的写函数是:
    procedure TButton.SetDefault(Value: Boolean);
    var
      Form: TCustomForm;
    begin
      FDefault := Value;
      if HandleAllocated then
      begin
        Form := GetParentForm(Self);
        if Form <> nil then
          Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl));
      end;
    end; 这里的这段代码有什么用?
      if HandleAllocated then
      begin
        Form := GetParentForm(Self);
        if Form <> nil then
          Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl));
      end;
      

  7.   

    HandleAllocated :Reports whether a window handle exists for the control.
    Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl));焦点在form的转移
      

  8.   

    Focus(老鱼):
    是我写的话,我那还用问你有什么作用!!!
      

  9.   

    请注意:“default false是指property Default的默认值为false。”这句话是完全错误的!
    跟在property关键字之后的default指示字所指示的值,并不会成为constuructor运行期间该属性的默认值。default不具有任何运行时语义,它的作用在于使Delphi的内部机制清楚,当该属性的取值于default指示字所指示的值相等时,不必将该属性写入窗体存储文件(.dfm)之中。同理,当Delphi载入dfm存储时,会对没有写入记录的该属性赋default指示字所指示的值。
    如果想要使某一属性具有默认值,必须在constructor中明确指定。
      

  10.   

    Miracle():
    非常感谢!!!!!
      

  11.   

    另外,不直接通过私有值域(field)而是通过读写方法来访问属性值,虽然有一定程度的运行效率牺牲,但同时能够带来所谓“边缘操作”的附加好处。所谓边缘操作,大致是指在进行某一操作时,连带同时进行其他相关操作的行为。以设置TButton.Default属性为例,SetDefault方法首先将设置值存入fDefault属性,然后通过
      if HandleAllocated then
      begin
        Form := GetParentForm(Self);
        if Form <> nil then
          Form.Perform(CM_FOCUSCHANGED, 0, Longint(Form.ActiveControl));
      end;
    这段代码,向Botton所在的Form传递CM_FOCUSCHANGED消息,改变ActiveControl。这就达到了既设置属性,又可以进行必要的相关处理的目的,这要比直接存取属性值域方便得多。
      

  12.   

    Miracle()说得是,“default false是指property Default的默认值为false。”本身解释的并不正确。When you declare a property, you can specify a default value for it. Delphi uses the default value to determine whether to store the property in a form file. If you do not specify a default value for a property, Delphi always stores the property.
    To specify a default value for a property, append the default directive to the property抯 declaration (or redeclaration), followed by the default value. For example,
      property Cool Boolean read GetCool write SetCool default True;Note:Declaring a default value does not set the property to that value. The component抯 constructor method should initialize property values when appropriate. However, since objects always initialize their fields to 0, it is not strictly necessary for the constructor to set integer properties to 0, string properties to null, or Boolean properties to False.
      

  13.   

    又及,read和write读写器是对于property的补充声明,通过这两个指示字编译器可以了解该属性的读写方法,如果只有read或者只有write指示字,则说明该属性是只读(或者只写,比较少见)的。关于属性的声明,你还可以仔细看一下Object Pascal Help Documents。
      

  14.   

    cobi所贴的Help段落很对。值得注意的是最后一句,“However, since objects always initialize their fields to 0, it is not strictly necessary for the constructor to set integer properties to 0, string properties to null, or Boolean properties to False. ”,所以,我前面所讲的“如果想要使某一属性具有默认值,必须在constructor中明确指定”也不是完全正确,如果你想让属性具有的默认值是一个被置空的值,那么就可以不必明确处理,让编译器自己来办。然而,对非序数类型的属性进行明确的初始化是一个好习惯,希望不要依赖于编译器的“自动操作”。