调整列大小时的Delphi,TVirtualStringTree,WM_SIZE事件

问题描述 投票:2回答:1

我有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并且列自动调整它们的宽度,这并不意味着它们。如何在实际更改控件宽度时使自动调整大小工作?

delphi tvirtualstringtree
1个回答
3
投票

您可以添加一个布尔标志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

© www.soinside.com 2019 - 2024. All rights reserved.