- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的其他问题 Here 的后续问题.
正如我在评论中建议提出有关此主题的新问题
有人建议我在 Row 中绘制不同的图像。我从一开始的目标就是并排插入节点,我被告知这不能用 VDT 来完成,它不是为此目的而制作的。但是什么让我确信有办法,因为我看到一个在线项目使用相同的 VDT 来做到这一点
这是该项目的屏幕截图
使用资源查看器(例如 PE 资源管理器)我发现了以下形式的数据
object VDT: TVirtualDrawTree
AlignWithMargins = True
Left = 5
Top = 5
Width = 457
Height = 227
Margins.Left = 5
Margins.Top = 5
Margins.Right = 5
Margins.Bottom = 5
Align = alClient
BevelInner = bvNone
BevelOuter = bvNone
DefaultNodeHeight = 55
Header.AutoSizeIndex = 0
Header.Font.Charset = DEFAULT_CHARSET
Header.Font.Color = clWindowText
Header.Font.Height = -11
Header.Font.Name = 'Tahoma'
Header.Font.Style = []
HotCursor = crHandPoint
TabOrder = 0
TreeOptions.PaintOptions = [toHideFocusRect, toHideSelection, toHotTrack, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages, toAlwaysHideSelection, toUseBlendedSelection]
TreeOptions.SelectionOptions = [toExtendedFocus, toMiddleClickSelect, toRightClickSelect]
OnBeforeCellPaint = VDTBeforeCellPaint
OnGetNodeWidth = VDTGetNodeWidth
OnMouseUp = VDTMouseUp
ExplicitLeft = 3
ExplicitTop = 3
Columns = <
item
Position = 0
Width = 54
WideText = '55'
end
item
Position = 1
Width = 54
WideText = '55'
end
item
Position = 2
Width = 54
WideText = '55'
end
item
Position = 3
Width = 54
WideText = '55'
end
item
Position = 4
Width = 54
WideText = '55'
end
item
Position = 5
Width = 54
WideText = '55'
end
item
Position = 6
Width = 54
WideText = '55'
end
item
Position = 7
Width = 54
WideText = '55'
end>
end
end
所以我告诉自己,我必须使用Tviruaildrawtree
来实现相同的目标,然后我开始创建数据
type
TAnmiClass = class
private
Fanmigraphic : TGifImage;
public
property anmigraphic: TGifImage read Fanmigraphic write Fanmigraphic;
public
constructor Create;
destructor Destroy; override;
end;
type
PAnimeData = ^TAnimeData;
TAnimeData = record
FObject: TAnmiClass;
end;
因为我认为我必须为节点创建图像对象,因为我将从 url 下载一些图像列表,然后将它们添加到节点,如下所示,因此以下代码将图像从字符串列表下载到桌面然后加载它到节点 Tgifimage
For i := 0 To animationimages.Count-1 do
begin
Animaturl := animationimages.Strings[i];
URI := TIdURI.Create(Animaturl);
try
ImageName := URI.Document;
finally
FreeAndNil(URI);
end;
if (ExtractFileExt(ImageName) = '.gif') then
begin
addanimation(Animaturl);
end;
end;
procedure TForm2.addanimation(AAnimationUrl: String);
var
AnmiClass: TAnmiClass;
path: string;
begin
VDTAni.BeginUpdate;
try
AnmiClass := TAnmiClass.Create;
path := AAnimationUrl;
if fileexists(path) then
begin
AnmiClass.anmigraphic.LoadFromFile(path);
AnmiClass.anmigraphic.Animate := True;
AnmiClass.anmigraphic.Transparent := True;
end;
AddAnmiToVD(VDTAni, nil, AnmiClass);
finally
VDTAni.EndUpdate;
end;
这是我如何在 VDT 内绘制节点
procedure TForm2.VDTAniBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
Data: PAnimeData;
NewRect: TRect;
R: TRect;
begin
//
if not Assigned(Node) then
begin
exit;
end;
Data := VDTAni.GetNodeData(Node);
case Column of
0 :
begin
NewRect := ContentRect;
NewRect.Left := NewRect.Left +2;
NewRect.Width := 55;
NewRect.Height := 55;
NewRect.Top := NewRect.Top + 2;
NewRect.Bottom := NewRect.Bottom;
TargetCanvas.StretchDraw( NewRect, Data.FObject.anmigraphic);
end;
end;
end;
但我无法将节点排列为与上面显示的图像相同
似乎它不能在 onbeforecellpanit
中制作。
在我的另一个问题中,Tom Brunberg 建议将图像划分为 10 个节点,例如,如果添加的图像为 80 个,并且每行需要 8 个节点,每个节点有 8 个图像,并且每个图像都显示在其自己的专栏。但我不知道如何在编码中做到这一点或从哪里开始。
当前代码的问题
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VirtualTrees, Gifimg, Vcl.StdCtrls,
Vcl.Grids, Vcl.ExtCtrls;
type
TImageOBJArr = array of TGifimage;
type
TaniDataclass = class
ImageOBJArr: TImageOBJArr;
private
FAnirefrence: String;
FAniIMage: TGifimage;
public
property Anirefrence: String read FAnirefrence write FAnirefrence;
property AniIMage: TGifImage read FAniIMage write FAniIMage;
public
constructor Create;
destructor Destroy; override;
end;
type
Panidata = ^Tanidata;
Tanidata = record
FObject: TaniDataclass;
end;
type
TForm1 = class(TForm)
VDTani: TVirtualStringTree;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure VDTaniBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
procedure FormCreate(Sender: TObject);
procedure VDTaniFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure VDTaniGetNodeDataSize(Sender: TBaseVirtualTree;
var NodeDataSize: Integer);
private
{ Private declarations }
ImageOBJArr: TImageOBJArr; // Main storage of images
public
{ Public declarations }
Dimagelist : Tstringlist;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TaniDataclass }
constructor TaniDataclass.Create;
begin
FAniIMage := TGifImage.Create;
end;
destructor TaniDataclass.Destroy;
begin
FAniIMage.Free;
inherited;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Node: PVirtualNode;
Data: Panidata;
i, row, col: integer;
fn: String;
begin
// Load images to main store ImgArr
SetLength(ImageOBJArr, Dimagelist.Count);
for i := 0 to Dimagelist.Count -1 do
begin
fn := Dimagelist[I];
ImageOBJArr[i] := TGifimage.Create;
ImageOBJArr[i].LoadFromFile(fn);
end;
// Setup vdt nodes and assign images eight in a row
// hardcoded for now. You may want to add dynamics
// for varying window and image sizes
row := 0;
while row <= (Dimagelist.Count div 8) do
begin
Node := VDTani.AddChild(nil);
Data := VDTani.GetNodeData(Node);
SetLength(Data.FObject.ImageOBJArr, 8);
for col := 0 to 7 do
Data.FObject.ImageOBJArr[col] := ImageOBJArr[row * 8 + col];
inc(row);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Dimagelist := Tstringlist.Create;
VDtAni.NodeDataSize := SizeOf(Tanidata);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(Dimagelist) then
begin
FreeAndNil(Dimagelist);
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Dimagelist.Add('1mm.gif');
Dimagelist.Add('2mm.gif');
Dimagelist.Add('3mm.gif');
Dimagelist.Add('4mm.gif');
Dimagelist.Add('5mm.gif');
Dimagelist.Add('6mm.gif');
end;
procedure TForm1.VDTaniBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
Data: Panidata;
begin
if not Assigned(Node) then
begin
exit;
end;
Data := VDTani.GetNodeData(Node);
Sender.NodeHeight[Node] := 54;
CellRect.Height := 54;
TargetCanvas.StretchDraw( CellRect, Data.FObject.ImageOBJArr[Column]);
end;
procedure TForm1.VDTaniFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
Data: Panidata;
begin
Data := VDTani.GetNodeData(Node);
if Assigned(Data) then
Data.FObject.Free;
end;
procedure TForm1.VDTaniGetNodeDataSize(Sender: TBaseVirtualTree;
var NodeDataSize: Integer);
begin
NodeDataSize := SizeOf(Tanidata);
end;
end.
我在以下代码中遇到异常,我向字符串列表添加了 6 个图像路径,然后尝试在每一列上绘制
row := 0;
while row <= (Dimagelist.Count div 2) do
begin
Node := VDTani.AddChild(nil);
Data := VDTani.GetNodeData(Node);
SetLength(Data.FObject.ImageOBJArr, 2);
for col := 0 to 7 do
Data.FObject.ImageOBJArr[col] := ImageOBJArr[row * 2 + col];
inc(row);
end;
最佳答案
这是我建议的实现。
type
TImgArr = array of TBitmap;
TVdtData = record
FObject: TimgArr;
end;
PVdtData = ^TVdtData;
TForm2 = class(TForm)
Vdt: TVirtualDrawTree;
...
private
{ Private declarations }
ImgArr: TImgArr; // Main storage of images
implementation
procedure TForm2.Button1Click(Sender: TObject);
var
Node: PVirtualNode;
Data: PVdtData;
p: pointer;
i, row, col: integer;
fn: TFileName;
begin
// Load images to main store ImgArr
SetLength(ImgArr, 100);
for i := 0 to 99 do
begin
fn := Format('c:\tmp\nums\%.2d.bmp',[i]);
ImgArr[i] := TBitmap.Create;
ImgArr[i].LoadFromFile(fn);
end;
// Setup vdt nodes and assign images eight in a row
// hardcoded for now. You may want to add dynamics
// for varying window and image sizes
row := 0;
while row <= (100 div 8) do
begin
Node := Vdt.AddChild(nil);
p := Node.GetData;
Data := Vdt.GetNodeData(Node);
// SetLength(Data.FObject, 8);
SetLength(Data.FObject, Vdt.Header.Columns.Count);
for col := 0 to 7 do
Data.FObject[col] := ImgArr[row * 8 + col];
inc(row);
end;
end;
procedure TForm2.VdtBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
Data: PVdtData;
begin
if not Assigned(Node) then exit;
Data := Vdt.GetNodeData(Node);
Sender.NodeHeight[Node] := 64;
CellRect.Height := 64;
if Assigned(Data.FObject[Column]) then
TargetCanvas.StretchDraw( CellRect, Data.FObject[Column]);
end;
不保证不存在错误。
结果
但说实话,正如其他人指出的那样,仅使用 TDrawGrid
或 TStringGrid
会容易得多。当然,这是你的决定。
关于delphi - TVirtualDrawTree - 如何将节点放置在一行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828254/
我想要以下代码的 Python 单行解决方案,但是怎么做呢? total = 0 for ob in self.oblist: total += sum(v.amount for v in o
今天和大家一起学习一种可视化技术:构建树状热力图treemap。树形图易于可视化,且易于被人理解。树状图通过展示不同大小的矩形,以传达不同大小的数据量,一般认为,较大的矩形意味着占总体的一大部分,而较
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我有一个声明 $set eq "Y" ? $set = "N" : $set = "Y"; 但不管它总是设置为 "N" # Toggle setting if ($set eq "Y") { $
当我尝试在我的服务器上上传一个 php 文件时,我收到一条消息:"Parse error: ..." 我知道这是什么意思,但问题是别的。 如果我在本地服务器上编辑文件(我的计算机上安装了 XAMPP)
我是 python oneliner 循环的新手。 我希望用户将数据输入到二维列表中,同时提醒他他们将输入的数据索引。我的代码是: flag=0 x=[[int(input("enter the "+
尝试在变量之前和之后打印字符串。C 是否有能力使用一条语句来显示此输出? 这有效: float value = 5; printf("\nThe value of %f", value); print
我正在验证我创建的 MySQL 数据库的结果,为此,我需要一些屏幕截图。 例如,以下查询: select distinct run_ID from ngsRunStats_FK.failedRuns
有人可以解释一下这个 JS LINE 吗?数据是一个对象。 var list = data == null ? [] : (data.wine instanceof Array ? data.wine
如何在一行中添加三个下拉菜单。我想把我的日、月和年放在一行中,但不能这样做。任何帮助将不胜感激。我附上我的 jsfiddle . .... 最佳
我正在尝试使用 html 将 iframe 的高度设置为 100%(我已成功完成),但我还在顶部添加了一行额外的文本,所以它太高了 ~16px(这需要一个滚动条)。有没有办法更改 iframe 以显示
这是一个示例,我从文件中读取行作为字符串,以使整个文件作为字符串数组: String[] ArrayOfStrings = (new Scanner( new File("log.txt") ).us
我有一个包含大量定义的配置文件,用于在编译期间包含模块。此外,这意味着我必须经常检查代码内部的定义。每张支票需要 3 行,是否可以在一行中执行此操作。 #if FUNC_ENABLED functio
我正在尝试制作一个水平列表,其中每个 列表中的 s 的高度为 385px,宽度为 400px。 我尝试使用 inline-block 使列表水平排列,但这似乎不起作用。也就是说,我的意思是列表仍然是垂
这很烦人,我有一个带有 css 文件的 wordpress 主题,所有内容都在一长行中。我想知道为什么有人会那样做。现在我已经升级了,我需要将旧文件与新文件进行比较,以便我可以接受更改。 Meld、d
我有一个对象数组,其中每个对象都有一个 search_order 属性。我要检查数组并将所有对象的属性增加 1这是简单的方法: res = [] for r in array: r.searc
我在某些服务器上遇到许多具有相同内容和相同名称的文件。我需要隔离这些文件进行分析,所以我不能只删除重复项。操作系统为Linux(centos和ubuntu)。 我枚举文件名和位置并将它们放入文本文件中
你能在不抛出错误的情况下解决这个问题吗?答案是单线。这是来自一个死的职位发布,在回复中要求回答。我认为这是剔除受访者的聪明方法,但我似乎无法在不出错的情况下回答它。 显而易见的解决方案: f.moo(
这个问题在这里已经有了答案: Is it ok if I omit curly braces in Java? [closed] (16 个答案) 关闭 9 年前。 我在 java 中使用没有大括号
我在这里试图用 python 制作一个简单的计算器,我想知道是否可以在命令运行时将前 3 行合并为一行。我的意思是;我不必按 Enter 键来键入下一个数字/运算符,而是按空格键(在输入部分)。 wh
我是一名优秀的程序员,十分优秀!