最近小弟做了一个控件,在设计属性编辑器时遇到了问题。我想达到这样一个效果:点击属性页右边的...按钮弹出我自己设计的窗口,用来编辑这个属性。可是在弹出这个窗口前,我想得到这个属性的原值,这时是不是要重载GetValue函数,如果不重载,直接调用这个函数只能得到一个字符串,我很纳闷的是属性值千差万别,一个字符串就能表示吗?我想问的是在注册属性编辑器的单元中如何与定义控件的单元取得联系?是不是重载GetValue\SetValue这两个函数,如何重载,请各位高手不吝赐教。

解决方案 »

  1.   

    在你的父类中这样声明
    funtion GetValue: string;virtual;
    procedue SetValue(value: string);virtual;在你的继承子类中这样声明
    funtion GetValue: string;override;
    procedue SetValue(value: string);override;
      

  2.   

    我就是这样声明的。我问的是GetValue\SetValue如何写,或者是不用重载这两个函数,就能得到属性的原值。
      

  3.   

    在父类中定义中保护的变量aaa
    funtion GetValue: string;
    begin
       ...
      aaa := 你想要的值;
    end;子类中
    funtion GetValue: string;
    begin
      inherited;
      result := aaa;
    end;
      

  4.   

    谢谢huojiehai(海天子)的回复。
    我继承的父类是:TPropertyEditor,难道还要修改类 TPropertyEditor吗,会不会引起Delphi的混乱。
    我想要的值是这样的:比如说,我做的控件有Color属性,当我编辑这个属性点击旁边的...按钮时,如何得到原来的显示在Color属性框中的那个值,使弹出的窗口能够进行相应的操作。
      

  5.   

    XXXFloatValue : 得到浮点
    XXXMethodValue : 得到事件,这是指向事件的指针
    XXXOrdValue : 得到有序,这是指向有序的集合的序号
    XXXStrValue : 得到字符串
    XXXVarValue : 得到Varinat
    XXX表示读取(Get)或设置(Set)
      

  6.   

    请问cscentaur(太公陈),我的这个属性是个“类”类型怎么办?
      

  7.   

    你这个属性是个“类”,但显示在属性编辑器上的其实是个类的名字,而所谓的GetValue和SetValue其实是由Delphi的IDE来进行调用,只是用于属性编辑器上显示个东东给你看而已。所以这两个函数和过程只是String型的。
    如果这个类是你的Component的一部分,是个属性,那么,Delphi已经给提供了自己的TClassProperty,当然你从TClassProperty上继承出你自己的东东也可以。不过这个作为属性的类必须从TPersistent类上继承下来,不然Delphi就不能对其进行流化操作。还有就是你要在你的Component的Create时也Create这个类实例。
      

  8.   

    如果你这个类是一个类型,像AdoQuery中的Connection那样,那么你要自己来写属性编辑器,而且我想这不是一个从TClassProperty上继承下来的属性编辑器,而是一个从TComponentProperty上继承下来的。
    当然这要看具体情况,你能不能说的具体一点。
      

  9.   

    具体情况是这样的:首先我做了个窗体,上面有一个DBGrid,然后在我的组件里把这个窗体的变量作为私有成员,我想把那个DBGrid的Columns属性引用出来,作为我的组件的属性,下面是代码:
    unit InduceForm;
    type
      TInduForm = class(TForm)
        DBGrid1: TDBGrid;
        DataSourceQ: TADOQuery;
        DataSource1: TDataSource;
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
      end;unit InduceWgq;
    type
      TInduceWgq = class(TComponent)
      private
        FInduForm: TInduForm;
        FColumns: TDBGridColumns;
        .
        .
        .
        function GetActive: Boolean;
        procedure SetActive(const Value: Boolean);
        procedure SetColumns(const Value: TDBGridColumns);
      public
        constructor Create(AOWner: TComponent); override;
        destructor Destroy; override;
        .
        .
        .
      published
        .
        .
        .
        property Active: Boolean read GetActive write SetActive default False;
        property Columns: TDBGridColumns read FColumns write SetColumns;
      end;implementationconstructor TInduceWgq.Create(AOWner: TComponent);
    begin
        inherited Create(AOWner);
        FInduForm:=TInduForm.Create(nil);
        FColumns:=TDBGridColumns.Create(FInduForm.DBGrid1,TColumn);
    end;procedure TInduceWgq.SetColumns(const Value: TDBGridColumns);
    begin
        If FColumns <> Value then
        begin
            FColumns.Assign(Value);
            FInduForm.DBGrid1.Columns.Assign(Value);
        end;    
    end;function TInduceWgq.GetActive: Boolean;
    begin
        Result:=FInduForm.DataSourceQ.Active;
    end;procedure TInduceWgq.SetActive(const Value: Boolean);
    begin
        If FInduForm.DataSourceQ.Active <> Value then
        begin
            FInduForm.DataSourceQ.Active:=Value;
            If Value then FColumns.Assign(FInduForm.DBGrid1.Columns);
        end;
    end;把上面的代码编译安装后,点击Columns属性后的...按钮,能弹出原来的属性编辑器,也能添加列,但是删除列的时候,Delphi就陷入了错误循环中,只能结束任务。我不知道是哪里错了。因为我只用到了Columns的Width,Visible子属性,所以我想到了自己做一个属性编辑器,可是又不知道怎么做。请cscentaur(太公陈)不吝赐教,感激不尽。
      

  10.   

    其实,如果不深究原因的话,你把FColumns:=TDBGridColumns.Create(FInduForm.DBGrid1,TColumn);句改成FColumns:=TDBGridColumns.Create(nil,TColumn);在SetActive时,先把FInduForm.DBGrid1.Columns.Assign( FColumns );再把FInduForm.DataSourceQ.Active:=Value;在SetColumns中,把FInduForm.DBGrid1.Columns.Assign(Value);去除,重新编译应该就可以了,反正我的Delphi7是可以了。对于,还有那个If FColumns <> Value then判断条件是不需要的,你直接Assign就可以了,不要去作这种判断。如果深究其原因的话,我现在还不太清楚,只是知道这和IDE的Designer有关。我现在还没搞清楚,你身边有没什么牛人,可以去问问他们.如果有问出什么来,或是还是有问题的话给我发个短信吧。
    我的qq号是38541213  如果用msn,为[email protected]