- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在选中或取消选中 vst 中的复选框时,我想在某些情况下要求确认。(取消)检查工作正常,直到我从 OnChecking
事件处理程序打开 MessageBox
为止。
当我显示 MessageBox
(并将 Allowed
设置为 true)时,复选框状态不会更改,我必须再次单击才能切换复选框。
出于我尚未弄清楚的原因,第二次未调用 OnChecking
事件处理程序。
这似乎与焦点有关:如果我在第二次单击复选框之前单击另一个节点,则它不起作用。我正在使用 Delphi XE2 和 Vitual Treeview 5.3。
有人可以确认这种行为并想出修复/解决方法吗?
此 MCVE 显示了该行为。只需向表单添加一个按钮和一个 vst 并分配事件处理程序:
type
TMyData = class
public
value: String;
constructor Create(str: String);
end;
constructor TMyData.Create(str: String);
begin
value := str;
end;
procedure TForm3.btnInitTreeClick(Sender: TObject);
begin
VirtualStringTree1.NodeDataSize := Sizeof(TObject);
VirtualStringTree1.TreeOptions.MiscOptions := VirtualStringTree1.TreeOptions.MiscOptions + [toCheckSupport];
VirtualStringTree1.CheckImageKind := ckSystemDefault;
with VirtualStringTree1.Header.Columns.Add do
begin
Text := 'Colum header';
Width := 150;
end;
VirtualStringTree1.AddChild(nil, TMyData.Create('1')).CheckType := ctCheckBox;
VirtualStringTree1.AddChild(nil, TMyData.Create('2')).CheckType := ctCheckBox;
VirtualStringTree1.AddChild(nil, TMyData.Create('A')).CheckType := ctCheckBox;
VirtualStringTree1.AddChild(nil, TMyData.Create('B')).CheckType := ctCheckBox;
end;
procedure TForm3.VirtualStringTree1Checking(Sender: TBaseVirtualTree;
Node: PVirtualNode; var NewState: TCheckState; var Allowed: Boolean);
var
data: TObject;
begin
data := TObject(Sender.GetNodeData(Node)^);
if assigned(data) and (data is TMyData) and (TMyData(data).value = 'A') then
Allowed := Application.MessageBox('Are you sure?', 'Confirmation', MB_YESNO or MB_ICONQUESTION) = ID_YES
else
Allowed := true;
end;
procedure TForm3.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
var
data: TObject;
begin
data := TObject(Sender.GetNodeData(Node)^);
if assigned(data) and (data is TMyData) then
CellText := TMyData(data).value
end;
编辑:5.5.2版本也可以重现该问题
最佳答案
我可以确认此行为。 VST v4.5.5
OnChecking
实现 (TBaseVirtualTree.HandleMouseDown
) 的问题是 WM_LBUTTONUP
消息未得到处理,TBaseVirtualTree.显示模式对话框时,HandleMouseUp
不同步,并且新状态不会更新。我还没有深入研究这个问题,无法提出一般性修复建议。
解决方法:
type
TBaseVirtualTreeAccess = class(TBaseVirtualTree);
procedure TForm1.VirtualStringTree1Checking(Sender: TBaseVirtualTree;
Node: PVirtualNode; var NewState: TCheckState; var Allowed: Boolean);
var
data: TObject;
begin
data := TObject(Sender.GetNodeData(Node)^);
if assigned(data) and (data is TMyData) and (TMyData(data).value = 'A') then
begin
Allowed := False; // We will handle this ourself
if Application.MessageBox('Are you sure?', 'Confirmation', MB_YESNO or MB_ICONQUESTION) = ID_YES then
begin
// Update the state and trigger OnCheck if needed
TBaseVirtualTreeAccess(Sender).DoCheckClick(Node, NewState);
end;
end
else
Allowed := True;
end;
关于delphi - 当 OnChecking 打开 MessageBox 时,TVirtualStringTree 中的复选框未正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33668250/
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。我已经尝试了“金额”列中我能想到的所有设置。我没有主意了
我是一名优秀的程序员,十分优秀!