我一直在寻找一个自定义图片网格,并发现a similar question在答案中有一个非常甜蜜的组件。
我下载了代码,经过一些小小的尝试,我设法让它在DXE2中编译。它看起来很酷,但我无法显示任何滚动条。我也无法弄清楚如何动态控制显示的图像。或者如何根据键盘事件更新网格。
另外,要使其编译,我必须删除GR32引用;我下载的库与DXE2有太多的不兼容性,我无法解决。
非常感谢任何帮助。这真的看起来像一个杀手组件。
以下是不正确的缩略图绘制的屏幕截图。我无法将缩略图看作component in question的屏幕截图。
如果缩略图被涂在与第一遍中绘制的相同的XY处,那么它们看起来会更好。对于发生了什么有任何想法?
答案 0 :(得分:1)
...但我无法显示任何滚动条。
嗯,没有水平滚动条。有一个属性ColWidth
可以控制在一行中绘制多少图像,具体取决于控件的宽度。例如,由于锚点设置,您可能会更新ColWidth
事件处理程序中的OnResize
。
当并非所有图像(包括间距)都适合客户端时,垂直滚动条会自动出现。图像在TPaintBox
上绘制,并且一旦图像计数发生变化,该绘图框的大小就会更新:
procedure TImageGrid.RearrangeImages;
begin
...
FPainter.Height := Max(ClientHeight,
FRowCount * (FRowHeight + FImageSpacing) - FImageSpacing);
组件继承自TScrollingWinControl
,因此滚动条应相应修改。如果没有,那么比尔有一个解决方法:评论:
VertScrollBar.Range := FRowCount * (FRowHeight + FImageSpacing) - FImageSpacing;
我明白这显然也有效,但我真的很想知道为什么应该手动修改滚动条的范围。在D7中,我对隐藏的垂直滚动条没有任何问题。
...我也无法弄清楚如何动态控制显示的图像。 ...
填充组件最简单的方法是将Folder
属性分配给带图像的路径。仅加载FileFormats
属性中具有文件格式的图像。要手动指定图像(例如,组合多个文件夹),请使用FileNames
属性。设置Folder
属性后,FileNames
属性会相应更新,但这些文件名不会存储在DFM中。更改文件名(例如,从文件夹中删除文件名)时,将清除Folder
属性,组件将使用FileNames
属性。
...或者如何根据键盘事件更新网格。 ...
目前实施的唯一按键是Up,Down,PageUp,PageDown,Home和End,它们都滚动控件。您还希望采取哪些关键行动?这是一个观众。
以下是不正确的缩略图绘制的屏幕截图。我不能让缩略图看起来像有问题的组件的截图。 ...如果缩略图被绘制在与第一遍中绘制的相同的XY处,那么它们看起来会更好。
在加载图像时,会绘制一个大小为ColWidth
* RowHeight
的临时矩形。所有图像都在该尺寸范围内拉伸,因此请调整这些属性的比例,以使间距相等。请注意,您还可以使用ImageHorzAlign
和ImageVertAlign
属性来影响外观。
您引用的组件最近已完全重写,上面的一些答案已过时。
现在它的Propertional
属性默认为True
,但设置为False
时,它会将拇指拉伸到您设置的任何单元格大小,与原始图像无关大小。除非您将新的Stretch
属性设置为True
,否则小图片可能会保持较窄。
现在区分RowHeight
和CellHeight
,以及ColWidth
和CellWidth
。两者之间的差异是CellSpacing
。
组件不再从TScrollingWinControl
下降,而是从TCustomControl
下降,只添加垂直滚动条。