我有TVirtualStringTree
类的后代和我自己的自动调整列程序。为了在控件大小改变时使其工作,我已经覆盖了Resize
程序:
type
TMyVirtualStringTree = class(TVirtualStringTree)
protected
procedure Resize; override;
end;
.....
procedure TMyVirtualStringTree.Resize;
var
cb: Integer;
begin
inherited;
if Header.Columns.Count > 0 then
for cb := 0 to Header.Columns.Count - 1 do
Header.Columns[cb].Width := round((Width - 20) / Header.Columns.Count);
end;
一切正常,除了一件事:手动调整列(通过标题上的鼠标)而不改变控件的实际大小会导致生成具有不同LParams(控件大小)的不需要的WM_SIZE
事件。因此调用Resize
并且列自动调整它们的宽度,这并不意味着它们。如何在实际更改控件宽度时使自动调整大小工作?
您可以添加一个布尔标志FColumnResize
,您可以在True
方法中将其设置为DoColumnResize
。
在Resize
方法中检查标志,即:
type
TVirtualStringTree = class(VirtualTrees.TVirtualStringTree)
protected
FColumnResize: Boolean;
procedure Resize; override;
procedure DoColumnResize(Column: TColumnIndex); override;
end;
...
procedure TVirtualStringTree.DoColumnResize(Column: TColumnIndex);
begin
inherited;
FColumnResize := True;
end;
procedure TVirtualStringTree.Resize;
var
cb: Integer;
begin
inherited;
if not FColumnResize then
begin
Header.Columns.BeginUpdate; { Important: do not trigger OnColumnResize }
try
if Header.Columns.Count > 0 then
for cb := 0 to Header.Columns.Count - 1 do
Header.Columns[cb].Width := round((Width - 20) / Header.Columns.Count);
finally
Header.Columns.EndUpdate;
end;
end;
FColumnResize := False;
end;
另一种选择,而不是覆盖DoColumnResize
,最好覆盖并在FColumnResize
中将True
设置为DoHeaderMouseDown
,然后再回到False
中的DoHeaderMouseUp
。在这种情况下,删除FColumnResize := False
方法中的Resize
。