编写组件用TCollection编辑如下属性:
type
  TBase = class end;  TClass1 = class(TBase) end;  TClass2 = class(TBase) end;
  ...  TClassType = (ctClass1, ctClass2, ...);  TClassItem = class(TCollectionItem)
  private
    FClassType: TClassType;
    FItem: TBase;
    procedure SetClassType(const Value: TClassType);
  ...
  published
    property ClassType: TClassType read FClassType write SetClassType;
    property MyClass: TBase read FItem;
  end;  ...  procedure SetClassType(const Value: TClassType);
  begin
    if FClassType = Value then Exit;
    FClassType = Value;
    if Assigned(FItem) then FItem.Free;
    case FClassType of
     ctClass1: FItem := TClass1.Create;
     ctClass2: FItem := TClass2.Create;
     ...
    end;
  end;  由于TClass1,TClass2等的属性个数和类型不一样,当改变FItem的类实例时,如果对应的类属性 
MyClass在Object Inspector中已经展开,不能得到正确的显示,有时还会报错,必须在TCollectionItem编辑窗口移动后,或者将已经展开的属性收拢,显示才正确。
  提问:怎样才能刷新Object Inspector的显示?或者用什么方法控制Object Inspector中属性的结点(展开和收拢)?或者其它方法解决该问题?  不知道问题说清楚没有,如果不明白意思请问我,本人在线等。问题一经解决立即结贴。

解决方案 »

  1.   

    你可以试一下用下面的方法:
    procedure SetClassType(const Value: TClassType);
    var
      Form: TCustomForm
    begin
       ...
      //在这里想办法取得组件所在的窗口,然后
      Form.Designer.Modified;   
    end;或者,重写一个TClassType属性的属性编辑器(继承自原有的属性编辑器,这里应该是TEnumProperty)
    然后在SetValue中写:
    procedure TYourEnumProperty.SetValue(const Value: string);
    begin
      Inherited;
      Designer.Modified;
    end;
    然后注册这个属性编辑器。上面两种方法仅作为参考,有效否,还得自己试一下。
      

  2.   

    谢谢linzhengqun(风。我回来了) ,按你的方法试了,还是不行,而且我说的不能在Object Inspector刷新显示的不是TClassType属性,而是类属性MyClass,当类属性的节点展开后,修改TClassType,MyClass也重新由不同的派生类建立,这时在Object Inspector中显示的MyClass的子属性仍然是以前的,必须手工收拢MyClass的节点后再展开,或者移动到其它元件项后再回来,显示就正确了,总之,是Object Inspector不知道MyClass的实例已经改变,不能刷新显示.