- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个 TVirtualStringTree (VST) 控件,一个在另一个之上。中间有 TSplitter。滚动第一个时,我使用 VST1/2 的 OnScroll 滚动另一个 VST2/1:
procedure TForm1.VST1Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
VST2.OffsetY:=VST1.OffsetY;
end;
procedure TForm1.VST2Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
VST1.OffsetY:=VST2.OffsetY;
end;
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, VirtualTrees;
type
TForm1 = class(TForm)
VST1: TVirtualStringTree;
VST2: TVirtualStringTree;
Splitter1: TSplitter;
procedure FormCreate(Sender: TObject);
procedure VST1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
procedure VST2GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
procedure VST1Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
procedure VST2Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
VST1.RootNodeCount := 20;
VST2.RootNodeCount := 20;
end;
procedure TForm1.VST1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
begin
CellText:=IntToStr(Node.Index+1);
end;
procedure TForm1.VST1Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
VST2.OffsetY:=VST1.OffsetY;
end;
procedure TForm1.VST2GetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
begin
CellText:=IntToStr(Node.Index+1);
end;
procedure TForm1.VST2Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
VST1.OffsetY:=VST2.OffsetY;
end;
end.
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 337
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Splitter1: TSplitter
Left = 0
Top = 100
Width = 635
Height = 3
Cursor = crVSplit
Align = alTop
ExplicitWidth = 237
end
object VST1: TVirtualStringTree
Left = 0
Top = 0
Width = 635
Height = 100
Align = alTop
Header.AutoSizeIndex = 0
Header.Font.Charset = DEFAULT_CHARSET
Header.Font.Color = clWindowText
Header.Font.Height = -11
Header.Font.Name = 'Tahoma'
Header.Font.Style = []
Header.MainColumn = -1
TabOrder = 0
OnGetText = VST1GetText
OnScroll = VST1Scroll
Columns = <>
end
object VST2: TVirtualStringTree
Left = 0
Top = 103
Width = 635
Height = 234
Align = alClient
Header.AutoSizeIndex = 0
Header.Font.Charset = DEFAULT_CHARSET
Header.Font.Color = clWindowText
Header.Font.Height = -11
Header.Font.Name = 'Tahoma'
Header.Font.Style = []
Header.MainColumn = -1
TabOrder = 1
OnGetText = VST2GetText
OnScroll = VST2Scroll
Columns = <>
end
end
最佳答案
VST 拥有 protected 属性(property) RangeY
它包含整个滚动范围,是解决方案的关键。
所以,ClientHeight - RangeY
= 最大负数 OffsetY
在 VST 中。
代码可能如下所示:
type
TForm1 = class(TForm)
...
private
FScrolling: boolean;
procedure SyncScroll(Sender, Target: TBaseVirtualTree);
end;
...
type
TCustomVirtualStringTreeAccess = class(TCustomVirtualStringTree);
procedure TForm1.SyncScroll(Sender, Target: TBaseVirtualTree);
var
SenderMaxOffsetY, TargetMaxOffsetY: Integer;
DY: Extended;
begin
if FScrolling then Exit; // Avoid reentrancy from Target
SenderMaxOffsetY := Sender.ClientHeight - Integer(TCustomVirtualStringTreeAccess(Sender).RangeY);
TargetMaxOffsetY := Target.ClientHeight - Integer(TCustomVirtualStringTreeAccess(Target).RangeY);
if SenderMaxOffsetY = 0 then Exit;
DY := Sender.OffsetY / SenderMaxOffsetY;
FScrolling := True;
try
Target.OffsetY := Round(TargetMaxOffsetY * DY);
finally
FScrolling := False;
end;
end;
procedure TForm1.VST1Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
SyncScroll(Sender, VST2);
end;
procedure TForm1.VST2Scroll(Sender: TBaseVirtualTree; DeltaX, DeltaY: Integer);
begin
SyncScroll(Sender, VST1);
end;
关于delphi - 如何同步滚动 2 个不同高度的 TVirtualStringTree 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34485742/
VirtualStringTree的可视树结构始终停留在第一列(索引为0的那一列)。当您通过拖动列标题来更改列顺序时,树可能看起来很奇怪(下图)。是否有可能总是在第一个可见列中看到该结构? 最佳答案
我有一个带有 toFullRowSelect 的 VST(有几列)。我想在节点上启用拖放。 问题是,只有直接单击节点标题标题,才能开始拖动节点。如果单击的是行选择而不是节点标题,则拖动操作将不会启动,
我有一个 TVirtualStringTree(版本 5.2.2),我需要向它的节点添加对象而不是记录。 我已经查看了该问题提供的答案: Delphi, VirtualStringTree - cla
这是重现问题的非常小的项目(VirtualStringTree 版本 6.5): type TForm1 = class(TForm) vstTest: TVirtualStringTre
当启用 toThemeAware 时,VirtualTrees.pas 5.0.0 版本中的复选框处理似乎已损坏。 csUncheckedNormal 的节点被绘制为选中 + 热。 要使用 DrawE
我想根据搜索条件突出显示 VirtualStringTree 节点中的文本,如下例所示: 请问有什么建议吗? 最佳答案 感谢 TLama 的回答(How to underline or highlig
我已经学会了如何使用 TVirtualStringTree,并且发现它非常好。我有一个名为 PackedList 的自定义非可视列表,它由另一个线程填充。我想实时显示 TVirtualStringTr
攀登 TVirtualTreeView 的学习高峰,我尝试创建一个自定义后代,以确保在调整控件大小时,最后一列的宽度完全填充控件的宽度,而不需要水平滚动条。 我看到了许多与“AutoFitColumn
我有一个应用程序,可以从二进制日志文件加载记录并将其显示在虚拟 TListView 中。一个文件中可能有数百万条记录,并且显示可以由用户过滤,所以我不会一次性加载内存中的所有记录,并且ListView
在我们的应用程序中,我正在从 TStringGrid 组件迁移到 TVirtualStringTree 组件。正在显示大量数据(最多 50000 行和 5 列)。一列包含一行或多行文本。我设法在字符串
我有一个 VirtualStringTree,其 Header.Column 设置为 taLeftJustify(默认)。 有没有一种方法可以将该列的单元格/节点设置为 taRightJustify,
我试图让 VST 在其高度和宽度发生变化时自动调整大小。 我对其他放置的 VCL 组件没有这个问题,其中一些具有像 TImage 这样的属性“Stretch”,可以让它们自动调整。 VST 保持固执并
我有两个 VirtualStringTree,第一个 VST 已填充数据,我想检查第二个 VST 并添加第一个 VST 中尚未存在的节点。或者我想添加第二个 VST 中不与第一个 VST 重复的节点。
我们正在使用某种搜索表单,最近对其进行了修改。它的功能是标准搜索表单的功能:在顶部的一些框中输入一些条件,点击“搜索”按钮,然后在下面的网格中显示结果。但它很丑陋,而且功能非常有限,所以我的一位同事在
我正在学习 TVirtualStringTree 的用法,并且必须实现增量搜索。当用户在 TEdit 中输入字符时,我想将焦点节点移动到树中的第一个合格节点。 我正在阅读我能找到的所有演示和示例代码,
之前,我使用此VirtualStringTree来显示所有节点,并使用Node.Index来检查OnBeforeCellPaint<内的奇数行和偶数行 事件。 但是当我过滤节点时,我意识到 Node.
我有一个包含 4 列的 VirtualStringTree (VST) 的简单示例,在第二列或第三列中我可以有更多适合默认列宽度的文本。我启用了 hoAutoSpanColumns,因此大文本将与其他
如果我没记错的话,在 a 中不可能有不可见的节点。TVirtualStringTree TreeView ,因为没有启用、可见或其他属性来这样做。我的说法正确吗? 如果是,我是如何设法拥有不可见节点的
如何使用自己的自定义按钮(图像)来替换 VST 中的默认 [-]/[+] 按钮? 我想改用箭头( 、 ),同时也支持 RTL bidi 模式( 、 )。 编辑:我知道 bsTriangle 样式(Bu
我需要填充(用黑色)下图中突出显示的白色小方 block 。 我尝试添加额外的列。我尝试扩展 PaintInfo.PaintRectangle。我已经尝试了“金额”列中我能想到的所有设置。我没有主意了
我是一名优秀的程序员,十分优秀!