什么是处理简单文本样式的最佳方式,如bbcode允许在文本内部加粗斜体等?我所做的是将文本分成几部分,每个部分都分配了样式,然后我从每个部分开始发短信Rect.Left + Canvas.TextWidth(Texts[i-1]).然而,这可能非常慢,而且我不知道如何在VirtualStringTree的情况下发布它.它具有OnBeforeItemPaint,但回调不知道列索引.然而OnBeforeCellPaint并没有公开变量来说我自己绘制的VST,因此它描绘了我的文字......
有人吗?:)
问候,米哈尔
我想创建一个类似下面的图像(我知道是使用TVirtualStringTree完成的),但我还没有找到任何关于如何实现此目的的示例代码.
任何人都知道如何在下面的示例中使用多行项目,并"展开"选择项目以显示更多行?
我意识到我真的需要重写我的程序数据结构(不是现在,但很快,因为截止日期是星期一),因为我目前正在使用VST(VirtualStringTree)来存储我的数据.
我想要实现的是一个联系人列表结构.根节点是类别,子节点是联系人.共有2个级别.
但事实是,我需要一个联系人才能在一个以上的类别中显示,但它们需要同步.特别是Checkstate.
目前,为了保持同步,我遍历整个树来查找与刚刚更改的ID具有相同ID的节点.但是当存在大量节点时,这样做非常缓慢.
所以,我想:是否可以在多个类别中显示联系对象的一个实例?
注意:老实说,我并不是100%熟悉术语 - 我的意思是实例,是一个对象(或记录),所以我不必通过整个树来查找具有相同ID的联系对象.
这是一个例子:

如您所见,Todd Hirsch出现在测试类别和所有联系人中.但是在幕后,那些是2个PVirtualNodes,所以当我更改某个节点(如CheckState)上的属性,或节点的数据记录/类中的某个属性时,2个节点不同步.目前我可以同步它们的唯一方法是循环访问我的树,找到容纳相同联系人的所有节点,并将更改应用于它们及其数据.
总结一下:我正在寻找的是一种使用一个对象/记录的方法,并在我的树中的几个类别中显示它 - 每当一个节点被检查时,每个其他节点都包含相同的Contact对象.
我在这里有意义吗?
delphi synchronization virtualtreeview nodes data-structures
我正在将节点从一个应用程序拖到另一个应用程序.只有在我之前选择节点时,它才能正常工作.这是因为我使用GetNodeData(FocusedNode)方法收集数据.
我想以某种方式在节点悬停上自动聚焦节点.可能吗?
我正在使用VirtualTreeView v.4.8.7
我需要将目录中的文件显示到 TVirtualStringTree。所以,我使用 SHGetFileInfo 来获取文件的图标。但似乎我只能获得“正常”图标(以下屏幕截图的左侧)。如果是这样,TVirtualStringTree 可以将图标绘制为“禁用”吗?就像您禁用了 a 节点一样。请看屏幕截图:

更新
Soft Gems 论坛中有一个类似的帖子。我可以获得图标的矩形,然后自己绘制图标。我正在使用 TcxImageList,它可以轻松绘制“禁用”图标。我首先在 GetImageIndex 事件中分配了一个不存在的图像索引,所以我有一个空间来绘制图标。然后使用以下代码进行绘制。
procedure TfrmMain.tvSharesAfterItemPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
rImage: TRect;
OffsetLeft: Integer;
begin
rImage := ItemRect;
with TVirtualStringTree(Sender) do begin
if (toShowRoot in TreeOptions.PaintOptions) then
OffsetLeft := Indent * (GetNodeLevel(Node) + 1)
else
OffsetLeft := Indent * GetNodeLevel(Node);
Inc(rImage.Left, Margin + OffsetLeft);
Inc(rImage.Top, (NodeHeight[Node] - Images.Height) div 2);
rImage.Right := rImage.Left + Images.Width;
rImage.Bottom := rImage.Top + Images.Height;
end;
// draw the …Run Code Online (Sandbox Code Playgroud) 我正在使用 Delphi XE3 和 Virtual TreeView。
我已启用 toAutoTristateTracking 选项。
当我尝试手动更改节点的检查状态时,受影响节点的检查状态也会更改。
然而,当我以编程方式做同样的事情时,例如
PNode^.CheckState := csMixedNormal;
Run Code Online (Sandbox Code Playgroud)
或者
PNode^.CheckState := csCheckedNormal;
Run Code Online (Sandbox Code Playgroud)
仅 PNode 检查状态会更改。受影响的节点不会改变其状态。为什么?
这就是我"努力"实现的目标
我有一个生成密码的函数,然后我将其添加到TStringList中,之后我应该使用这些项填充VirtualTreeView,但是我没有运气这么做.应该如何以正确的方式完成?我还在学习,不是专业人士.
我的生成密码的功能:
function Generate(AllowUpper,AllowLower,AllowNumbers,AllowSymbols:Boolean; PassLen:Integer):String;
const
UpperList = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
LowerList = 'abcdefghijklmnopqrstuvwxyz';
NumberList = '0123456789';
SymbolList = '!#$%&/()=?@<>|{[]}\*~+#;:.-_';
var
MyList : String;
Index : Integer;
i : Integer;
begin
Result:='';
MyList:='';
//here if the flag is set the elements are added to the main array (string) to process
if AllowUpper then MyList := MyList + UpperList;
if AllowLower then MyList := MyList + LowerList;
if AllowNumbers then MyList := MyList + NumberList;
if AllowSymbols then MyList := MyList + …Run Code Online (Sandbox Code Playgroud) 我正在尝试修改VirtualTreeView以在设计模式下查看树节点中的数据.
分配节点内存是私有静态方法,因此我无法做任何事情.我正在尝试重新分配内存以匹配新的大小.
出于测试目的,我正在尝试重新分配相同数量的内存:
ReallocMemory(Node, sizeof(Node^))
Run Code Online (Sandbox Code Playgroud)
但IDE在随机迭代中挂起了大量的AV.由于我对内存分配的了解非常缺乏,我认为我忘记了一些事情.你能指点我吗?
在虚拟字符串树中是否可以在每列中都有一个复选框(或单选按钮)?这是一张有关更多信息的图片:
我试图附加单选按钮/复选框,但只附加在节点的第一列.
delphi ×10
virtualtreeview ×10
bbcode ×1
delphi-7 ×1
delphi-xe2 ×1
nodes ×1
pointers ×1
sorting ×1