gpt4 book ai didi

delphi - 如何在 TVirtualStringTree 中自动调整跨度列的大小?

转载 作者:行者123 更新时间:2023-12-03 15:30:13 29 4
gpt4 key购买 nike

我有一个包含 4 列的 VirtualStringTree (VST) 的简单示例,在第二列或第三列中我可以有更多适合默认列宽度的文本。我启用了 hoAutoSpanColumns,因此大文本将与其他列(如果它们为空)重叠。这效果很好。问题是第二列或第三列中的文本应跨越 VST 的整个长度。在这种情况下,大列仅延伸到最后(第四)列的末尾。

以下是第 3 行中的第 2 列如何仅跨越第 3 列和第 4 列,然后停在第 4 列的宽度处:

enter image description here

如果我使用 AutoFitColumns 自动调整第二列的大小:

VST1.Header.AutoFitColumns(false, smaUseColumnOption,1,1);

然后它会插入第三列和第四列,以便它们从第二列的末尾开始:

enter image description here

但是我需要第三列和第四列保持在相同的位置,如下所示:

enter image description here

有没有办法自动调整第二列到文本,但将第三列和第四列保持在原来的位置?

最佳答案

目前没有内置方法可以将标题自动调整为跨列文本。要自动调整给定列的大小以查看整个跨区文本,您可以编写如下代码(对于单个节点)。请注意,VT 中的自动跨度功能目前不支持 RTL 读取(因此此代码也不支持):

type
TVirtualStringTree = class(VirtualTrees.TVirtualStringTree)
protected
function GetSpanColumn(Node: PVirtualNode): TColumnIndex; virtual;
public
procedure AutoFitSpanColumn(DestColumn: TColumnIndex; Node: PVirtualNode);
end;

implementation

{ TVirtualStringTree }

function TVirtualStringTree.GetSpanColumn(Node: PVirtualNode): TColumnIndex;
begin
{ this returns visible span column for the given node, InvalidColumn otherwise }
Result := Header.Columns.GetLastVisibleColumn;
while ColumnIsEmpty(Node, Result) and (Result <> InvalidColumn) do
Result := Header.Columns.GetPreviousVisibleColumn(Result);
end;

procedure TVirtualStringTree.AutoFitSpanColumn(DestColumn: TColumnIndex; Node: PVirtualNode);
var
ColsWidth: Integer;
SpanWidth: Integer;
SpanOffset: Integer;
SpanColumn: TColumnIndex;
begin
SpanColumn := GetSpanColumn(Node);

if SpanColumn <> InvalidColumn then
begin
{ get the total width of the header }
ColsWidth := Header.Columns.TotalWidth;
{ get the width of the span text cell as it would be autosized }
SpanWidth := DoGetNodeWidth(Node, SpanColumn) + DoGetNodeExtraWidth(Node, SpanColumn) +
DoGetCellContentMargin(Node, SpanColumn).X + Margin;
{ and get the left position of the span cell column in header }
SpanOffset := Header.Columns[SpanColumn].GetRect.Left;
{ now, the width of the autosized column we increase by the subtraction of the fully
visible span cell width and all columns width increased by offset of the span cell
column; in other words, we'll just increase or decrease width of the DestColumn to
the difference of width needed for the span column to be fully visible, or "fit" }
Header.Columns[DestColumn].Width := Header.Columns[DestColumn].Width +
SpanWidth - ColsWidth + SpanOffset;
end;
end;

关于delphi - 如何在 TVirtualStringTree 中自动调整跨度列的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46332824/

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