Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 组件属性更改后更新VirtualStringTree标头_Delphi_Collections_Components - Fatal编程技术网

Delphi 组件属性更改后更新VirtualStringTree标头

Delphi 组件属性更改后更新VirtualStringTree标头,delphi,collections,components,Delphi,Collections,Components,我想创建一个名为TMyComp的组件。 此组件具有关联的以下属性: 属性VirtualStringTree:TVirtualStringTree和 属性列:TMyCompColumns作为项的集合 my组件中的列与关联VirtualStringTree中的标题列相同 我想做的是,当标题更新时,在设计时从VirtualStringTree中重新绘制标题文本 我的问题是我不知道如何触发过程重画VirtualStringTreeHeader,因为类TMyCompColumns甚至TMyCompColu

我想创建一个名为
TMyComp
的组件。 此组件具有关联的以下属性:
属性VirtualStringTree:TVirtualStringTree
属性列:TMyCompColumns
作为项的集合

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

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

我的问题是我不知道如何触发
过程重画VirtualStringTreeHeader
,因为类
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;
TMyCompColumnsItem=class(TCollectionItem)
私有的
FCaption:字符串;
函数GetPosition:整数;
受保护的
函数GetDisplayName:String;推翻
过程SetIndex(值:整数);
公众的
构造函数创建(集合:TCollection);推翻
程序分配(来源:TPersistent);推翻
出版
属性标题:字符串读取FCaption写入FCaption;
结束;
TMyCompColumns=类(TCollection)
私有的
FOwner:t组件;
受保护的
函数GetOwner:TPersistent;推翻
函数GetItem(索引:整数):TMyCompColumnsItem;
过程集合项(索引:整数;值:TMyCompColumnsItem);
程序更新(项目:TMYCOMP);
公众的
构造函数创建(AOwner:TComponent);
功能添加:TMyCompColumnsItem;
属性项[索引:整数]:TMyCompColumnsItem read-GetItem-write-SetItem;
结束;
TMyComp=类(TComponent)
私有的
FColumns:TMyCompColumns;
FVirtualStringTree:TVirtualStringTree;
过程SetMyCompColumns(常量值:TMyCompColumns);
受保护的
{受保护的声明}
公众的
构造函数创建(AOwner:TComponent);推翻
毁灭者毁灭;推翻
出版
属性列:TMyCompColumns读取FColumns写入SetMyCompColumns;
属性VirtualStringTree:TVirtualStringTree读取FVirtualStringTree写入FVirtualStringTree;
结束;
...
函数TMyCompColumnsItem.GetDisplayName:String;
开始
结果:=FCaption;
重新绘制VirtualStringTreeHeader;//0那么
对于i:=0到FColumns.Count-1 do
使用FVirtualStringTree.Header.Columns.Add do
开始
Text:=FColumns.Items[i]。标题;
//...
结束;
结束;
结束;

经过一些搜索,以下是答案:

  • 已通过
    TMyCompColumns
    类内部的
    FOwner
    触发了重绘VirtualStringTreeHeader
  • 程序TMyCompColumns.Update(项目:TCollectionItem);
    开始
    继承;
    (FOwner作为TMyComp)。重新绘制VirtualStringTreeHeader;
    结束

  • 我用
    write SetCaption
    更新了
    属性标题:String read FCaption write FCaption
    ,并添加了过程
  • 过程TMyCompColumnsItem.SetCaption(常量值:字符串);
    开始
    FCaption:=值;
    已更改(错误);//-->这将触发TMyCompColumns.Update
    结束

    事实上,秘密已更改(错误)更新的code>

    还得益于
    TVirtualStringTree
    组件的开源