我需要填写(黑色)我在下面的图片中突出显示的小白方块.
我试过添加额外的列.我试过扩展PaintInfo.PaintRectangle.我已经尝试了我能想到的Amount列上的每个设置.我没有想法.
任何人对如何做到这一点都有任何想法?
以下是执行自定义标题绘制的代码.(原谅with声明,不是我原来的代码....)
procedure TWinPOSReceiptPluginForm.ReceiptDisplayTreeAdvancedHeaderDraw(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo;
const Elements: THeaderPaintElements);
var
TempText: string;
begin
with PaintInfo do
begin
// First check the column member. If it is NoColumn then it's about the header background.
if (hpeBackground in Elements) and (Column <> nil) then begin
TempText := Column.Text;
TargetCanvas.Brush.Color := $444444;
TargetCanvas.FillRect(PaintRectangle);
TargetCanvas.Font.Color := clWhite;
TargetCanvas.Font.Style := [];
TargetCanvas.TextOut (PaintRectangle.Left + 3, PaintRectangle.Top + 3, TempText);
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
好吧,我在这里得到了一些非常棘手的东西...我想将一个或者使用Header给一个ChildNode.我认为这个想法是合理的,因为在子节点中有标题会让人看起来很棒,所以可以在表格中指定子节点.是否存在VST具有或根本不可能的功能?
谢谢你的帮助.
我正在尝试创建一个TVirtualStringTree类似于以下内容的视图:

在上面的例子中,我展示了一些我想要达到的可能场景.FolderA具有粗体文本,之后在同一节点中位于其后面的红色非压缩文本.我正在寻找制作这种输出的方法.
但是,如果创建太难或太难,我会对FolderB或FolderC类型的输出感到满意- 这可能是由2列组成的,一列包含文件夹名称,另一列包含内部文件的数量.
FolderD在这里仅作为没有文件的文件夹的示例和该文件夹的输出(文本是非文本的,没有数字).
我正在寻找任何方向如何产生这种效果,因为似乎VirtualTreeView每个节点只能有单色或粗体设置.任何提示或建议如何向FolderA或FolderB或FolderC的方向移动高度赞赏,所以我有一个起点.Delphi或C++ Builder示例都是受欢迎的(最终代码将在C++ Builder中).
我有一个类型的组件TVirtualStringTree(让我们称之为VST).它具有列表形式的节点,即所有节点处于同一级别.我想在删除节点后使用该DeleteNode方法更改焦点并使用OnFreeNode事件:
procedure TMyForm.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
NewFocus: PVirtualNode;
begin
NewFocus := VST.GetNext(Node);
if not Assigned(newFocus) then
NewFocus := VST.GetPrevious(Node);
if Assigned(NewFocus) then
begin
VST.FocusedNode := NewFocus;
VST.Selected[NewFocus] := True
end;
end;
Run Code Online (Sandbox Code Playgroud)
我还希望更改引起一些反应,例如设置Enabled按钮的属性:
procedure TMyForm.VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex);
begin
btn1.Enabled := Assigned(Node);
end;
Run Code Online (Sandbox Code Playgroud)
但是解决方案存在一些问题.例如,当我使用"取消"按钮关闭表单(表单是使用ShowModal方法打开)时,节点被释放,VSTFocusChanged被触发,并且由于nil按钮,后者会抛出异常.当然,我可以检查按钮是否已分配,但在删除节点后是否有更优雅的解决方案更改焦点而没有这种不良影响(并且没有其他不良影响)?
我想为我的整个应用程序使用自定义Hint窗口类.我使用Application.OnShowHint,分析THintInfo,并返回我自己TMyHintWindow的HintInfo.HintWindowClass.这适用于所有控件,但我只有TVirtualStringTree Columns提示有一个奇怪的问题.
VT使用它自己的提示窗口和自己的结构HintInfo.HintData.我研究代码,并知道它使用了VTHintData.到现在为止还挺好.问题是,当我返回自己的提示窗口类(派生自THintWindow)时,它仅显示提示窗口一瞬间消失!
为树节点返回的提示没有问题.他们使用相同的方法/结构(VTHintData).
这是一个非常简单的MCVE:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, VirtualTrees, StdCtrls;
type
TForm1 = class(TForm)
VirtualStringTree1: TVirtualStringTree;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
public
procedure ApplicationShowHint(var HintStr: string; var CanShow: Boolean;
var HintInfo: THintInfo);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TMyHintWindow = class(THintWindow)
public
{ nothing special here for now } …Run Code Online (Sandbox Code Playgroud) 所以,我的最终游戏是通过客户区内的添加/删除按钮来列出项目(如vsReport中的TListView).
例如:
|----------------|
|Old Item 1 X |
|Old Item 2 X |
|Add new item... |
| |
|----------------|
Run Code Online (Sandbox Code Playgroud)
如果您知道某个组件在没有这些额外工作的情况下执行此操作,请告诉我们!
所以我挑选了一个红色的"X",并使用TJvTransparentButton(Jedi Components - JVCL)来显示它.它处理按下/未按下状态,仅显示图像.我原来使用了TButton,但我并不需要围绕字形的所有绒毛.
现在,我将图像按钮保存在与每个节点关联的记录中.
代码如下:
procedure TfrmMain.AddNewAccount(const Username, Password: String);
var
Data : PTreeData;
XNode : PVirtualNode;
Begin
XNode := vstAccounts.AddChild(nil);
If vstAccounts.AbsoluteIndex(XNode) > -1 Then
begin
Data := vstAccounts.GetNodeData(Xnode);
Data^.Column0 := Username;
Data^.Column1 := '';
Data^.DeleteButton := TJvTransparentButton.Create(nil);
With Data^.DeleteButton Do
begin
Parent := vstAccounts;
Left := 0;
Top := 0;
Width := 16;
Height := 16; …Run Code Online (Sandbox Code Playgroud) 我已经学会了如何使用TVirtualStringTree,我发现它非常棒.我有一个名为PackedList的自定义非可视列表,由另一个线程填充.我想实时显示TVirtualStringTree中的所有列表内容.所以我在主窗体上放了一个定时器,每500ms更新一次HexLog(即TVirtualStringTree)RootNodeCount.
我的所有数据都出现在VirtualStringTree上,我没有任何速度问题,非常好.但垂直滚动条有一个问题.当我在控件上按Ctrl + End以跳转到列表的末尾时,它会在中间某处.类似地,当我将滚动条拖动到结尾时,它不会结束.但是HexLog知道DataCount.为什么不跳到最后?如果我按几次按Ctrl + END,它会到达结尾.
在计时器例程中,我想说HexLog按代码跳转到列表的末尾.我该怎么做以及如何正确处理垂直滚动条?
procedure TMainForm.StatusUpdateTimerTimer(Sender: TObject);
begin
if (FirpList.ComOperationCount > 0) and (PacketList.Items.Count <> FirpList.ComOperationCount) then
begin
HexLog.RootNodeCount := PacketList.Items.Count;
end;
end;
procedure TMainForm.HexLogMeasureItem(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
if Sender.MultiLine[Node] then
begin
TargetCanvas.Font := Sender.Font;
NodeHeight := HexLog.ComputeNodeHeight(TargetCanvas, Node, 1, FirpList.ComOperations[Node^.Parent^.Index].DataAsHexString(FAppSettings.HexLogColumnCharWidth) + #13#10);
end;
end;
Run Code Online (Sandbox Code Playgroud)

TLama的建议回复无法正常工作,请参阅图片以获得解释:

有关详细图像说明,请参阅该链接:http://i43.tinypic.com/1445thi.png
我有一个数组保存数据将在TVirtualStringTree上表示.该阵列是线程安全且可锁定的.并由另一个线程增长.
我的问题是,当VST执行OnMeasureItem事件来测量节点的高度时,用于测量的数据可能会在使用OnGetText事件打印数据时发生变化.
我检查了事件的执行顺序,这对我的设计不利.首先它为未初始化的所有节点触发OnMeasureItem事件,然后它开始调用OnGetText事件.我的意思是,假设我们有3个节点,事件将按此顺序触发:
OnMeasureItem for node 1
OnMeasureItem for node 2
OnMeasureItem for node 3
OnGetText for node 1
OnGetText for node 2
OnGetText for node 3
Run Code Online (Sandbox Code Playgroud)
但是我需要这样的东西才能锁定:
OnMeasureItem for node 1
OnGetText for node 1
OnMeasureItem for node 2
OnGetText for node 2
OnMeasureItem for node 3
OnGetText for node 3
Run Code Online (Sandbox Code Playgroud)
保持OnMeasureItem和OnGetText事件之间获得的数据同步的最佳方法是什么?
我不想在所有OnMeasureItem()和OnGetText()事件中锁定我的数组.
谢谢.
添加onTimer:
procedure TMainForm.SyncHexLog;
begin
HexLog.BeginUpdate;
Try
if (HexLog.RootNodeCount <> FirpList.ComOperationCountLagged) then
begin
HexLog.RootNodeCount := FirpList.ComOperationCountLagged;
// measure for fast scrolling
HexLog.ReInitNode(HexLog.GetLastNoInit(), True);
if FAutoScroll then …Run Code Online (Sandbox Code Playgroud) 我有一个3列的VST,可以均匀占用可用空间.
(我在Header.Options中设置了hoAutoSpring,所有列都有Column [x] .Option设置了coAutoSpring.)
现在我希望能够隐藏最后一列并保持其他列均匀占用空闲空间(有点像alClient控件).
当我只将列设置为不可见(见下文)时,该列占用的空间就不再使用了.
VST.Header.Columns[2].Options:=VST.Header.Columns[2].Options - [coVisible];
Run Code Online (Sandbox Code Playgroud)
当我将Header.Options.hoAutoResize设置为True并将Header.AutoSizeIndex设置为1时,第二列将占用所有新空间.
是否有方法告诉列填充可用空间并均匀调整大小?
截图:

我想根据搜索条件突出显示VirtualStringTree节点中的文本,例如来自bellow的示例:

有什么建议吗?