2016-03-20 70 views
0

我想创建一个名为TMyComp的组件。 此组件具有以下属性: property VirtualStringTree: TVirtualStringTreeproperty Columns: TMyCompColumns作为项目的集合。组件属性发生更改后更新VirtualStringTree标头

我的组件中的列与关联的VirtualStringTree中的标题列相同。

我想要做的是在设计时重新绘制VirtualStringTree的标题文本,当标题更新时。

我的问题是,我不知道如何触发procedure RedrawVirtualStringTreeHeader,因为它不知道类TMyCompColumns甚至TMyCompColumnsItem

TMyCompColumnsItem = class(TCollectionItem) 
    private 
    FCaption: String; 
    function GetPosition: Integer; 
    protected 
    function GetDisplayName: String; override; 
    procedure SetIndex(Value: Integer); 
    public 
    constructor Create(Collection: TCollection); override; 
    procedure Assign(Source: TPersistent); override; 
    published 
    property Caption: String read FCaption write FCaption; 
    end; 

    TMyCompColumns= class(TCollection) 
    private 
    FOwner: TComponent; 
    protected 
    function GetOwner: TPersistent; override; 
    function GetItem(Index: Integer): TMyCompColumnsItem; 
    procedure SetItem(Index: Integer; Value: TMyCompColumnsItem); 
    procedure Update(Item: TMyCompColumnsItem); 
    public 
    constructor Create(AOwner: TComponent); 
    function Add: TMyCompColumnsItem; 
    property Items[Index: Integer]: TMyCompColumnsItem read GetItem write SetItem; 
    end; 

    TMyComp = class(TComponent) 
    private 
    FColumns: TMyCompColumns; 
    FVirtualStringTree: TVirtualStringTree; 
    procedure SetMyCompColumns(const Value: TMyCompColumns); 
    protected 
    { Protected declarations } 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property Columns: TMyCompColumns read FColumns write SetMyCompColumns; 
    property VirtualStringTree: TVirtualStringTree read FVirtualStringTree write FVirtualStringTree; 
    end; 

... 

function TMyCompColumnsItem.GetDisplayName: String; 
begin 
    Result:= FCaption; 
    RedrawVirtualStringTreeHeader; //<--- procedure not recognized!!! 
end; 

... 

procedure TMyCompColumns.Update(Item: TMyCompColumnsItem); 
begin 
    inherited; 
    //RedrawVirtualStringTreeHeader; ???or here 
end; 

procedure TMyComp.RedrawVirtualStringTreeHeader; 
var 
    i: Integer; 
begin 
    if Assigned(FVirtualStringTree) then 
    begin 
     FVirtualStringTree.Header.Options:= FVirtualStringTree.Header.Options + [hoVisible]; 
     FVirtualStringTree.Header.Columns.Clear; 

     if FColumns.Count > 0 then 
     for i := 0 to FColumns.Count-1 do 
      with FVirtualStringTree.Header.Columns.Add do 
      begin 
       Text:= FColumns.Items[i].Caption; 
       //... 
      end;  
    end; 
end; 

回答

0

经过一番搜索,这就是答案:

  1. RedrawVirtualStringTreeHeader触发已通过FOwnerTMyCompColumns类里面。

procedure TMyCompColumns.Update(Item: TCollectionItem); begin inherited; (FOwner as TMyComp).RedrawVirtualStringTreeHeader; end;

  • 我更新property Caption: String read FCaption write FCaptionwrite SetCaption和我添加过程
  • procedure TMyCompColumnsItem.SetCaption(const Value: String); begin FCaption:= Value; Changed(False); //---> this will trigger TMyCompColumns.Update end;

    事实上的秘密是Changed(False);该TRIG Update

    也感谢TVirtualStringTree组件的开源。

    相关问题