- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是在 VST
中绘制自定义动画进度条
我的目标是绘制与下图类似的结果,我尝试做这样的事情OnBeforeCellPaint
:
procedure TForm2.VTs1BeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
NewRect : TRect;
xOff, yOff : Integer;
ProgressBarRect: TRect;
Percents: Real;
DrawProgressBar: Boolean;
begin
//draw progress
Percents := 10; // 40%
// progressBar on Column 3
begin
// draw progressbar
ProgressBarRect.Left := 0;
ProgressBarRect.Top := CellRect.Top + 1;
ProgressBarRect.Right := round((CellRect.Right - CellRect.Left) * Percents) + CellRect.Left;
ProgressBarRect.Bottom := CellRect.Bottom - 1;
if (ProgressBarRect.Right - ProgressBarRect.Left) > 0 then
begin
TargetCanvas.Brush.Color := RGB(179,255,102);
TargetCanvas.FillRect(ProgressBarRect);
end;
// ProgressBarRect
inc(ProgressBarRect.Left);
inc(ProgressBarRect.Top);
dec(ProgressBarRect.Right);
dec(ProgressBarRect.Bottom);
if (ProgressBarRect.Right - ProgressBarRect.Left) > 0 then
begin
TargetCanvas.Brush.Color := RGB(221,255,187);
TargetCanvas.FillRect(ProgressBarRect);
end;
end;
end;
但我无法获得与下图相同的结果并达到相同的方法:
这就是我编码的结果:
进度条沿着节点而不是在它旁边,它的设计与图像中显示的不一样,它是节点的黄色长背景,我想将其放在节点的左侧并具有相同的效果我上面发布的动画图像的设计。
最佳答案
OnBeforeCellPaint
仅在绘制单元格之前触发一次。
我使用计时器重新绘制 VST,以便为矩形“添加动画”。
请注意,Percents
是小数,而不是百分比值,因此 100%
是 1
。
下面是一个非常基本的演示:
private
Percents: Real;
. . .
implementation
procedure TForm2.FormCreate(Sender: TObject);
begin
Percents := 0;
VirtualStringTree1.AddChild(nil);
end;
procedure TForm2.Timer1Timer(Sender: TObject);
begin
if Percents > 1 then
Percents := 0
else
Percents := Percents + 0.025;
VirtualStringTree1.Repaint;
end;
procedure TForm2.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
const
CPROGBARWIDTH = 30;//rect width
CPROGBARSTEPS = 6;//how many rect is 100%
var
r: TRect;
h, n: Integer;
begin
if Percents > 1 then
Percents := 1
else if Percents = 0 then
Exit;//nothing to draw
h := Round(CellRect.Height / CPROGBARSTEPS) - 1;
r.Top := CellRect.bottom - h - 1;
r.Left := 1;{align left}
//r.Left := CellRect.Right - CPROGBARWIDTH - 1;{align right}
r.Width := CPROGBARWIDTH;
TargetCanvas.Brush.Color := clSkyBlue;
n := Ceil(Percents * CPROGBARSTEPS);//how many rect to draw?
while n > 0 do begin
r.Height := h;
TargetCanvas.FillRect(r);
Dec(r.Top, 1 + h);
Dec(n);
end;
end;
<小时/>
八月假期奖金又名“100% 非动画矩形位于动画矩形的左侧”
这会绘制类似于问题中的动画 GIF 的内容。
这里使用了嵌套例程。
procedure drawProgress(AWidth: Integer; APercent: Real; ASteps: Integer; ALeft: Integer = 1);
AWidth
矩形宽度APercent
进度百分比ASteps
完成 100% 进度的 block 数ALeft
矩形左上角点的水平坐标
procedure TForm2.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
procedure drawProgress(AWidth: Integer; APercent: Real; ASteps: Integer; ALeft: Integer = 1);
var
r: TRect;
h, n: Integer;
begin
if APercent > 1 then
APercent := 1
else if APercent = 0 then
Exit;//nothing to draw
h := Round(CellRect.Height / ASteps) - 1;
r.Top := CellRect.bottom - h - 1;
r.Left := ALeft;
r.Width := AWidth;
TargetCanvas.Brush.Color := clSkyBlue;
n := Ceil(APercent * ASteps);//how many rect to draw?
while n > 0 do begin
r.Height := h;
TargetCanvas.FillRect(r);
Dec(r.Top, 1 + h);
Dec(n);
end;
end;
begin
drawProgress(10, 1, 7);
drawProgress(30, Percents, 7, 1 + 10 + 1);
end;
关于delphi - 如何在TVirtualStringTree中绘制动画水平条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38717011/
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。我已经尝试了“金额”列中我能想到的所有设置。我没有主意了
我是一名优秀的程序员,十分优秀!