gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:29:49 35 4
gpt4 key购买 nike

我有 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;

一切正常,除了一件事:手动调整列的大小(通过鼠标在标题上)而不改变控件的实际大小会导致生成不需要的 WM_SIZE具有不同 LParam(控制大小)的事件。因此 Resize被调用,列会自动调整它们的宽度,我不是故意的。如何仅在实际更改控件宽度时才使自动调整大小起作用?

最佳答案

您可以添加 bool 标志 FColumnResize ,您将其设置为 TrueDoColumnResize方法。

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最好覆盖和设置 FColumnResizeTrueDoHeaderMouseDown ,然后返回 FalseDoHeaderMouseUp .在这种情况下,删除 FColumnResize := FalseResize方法。

关于调整列大小时的 Delphi、TVirtualStringTree、WM_SIZE 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55910108/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com