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
组件的开源