【问题标题】:Working with a Custom Image Grid使用自定义图像网格
【发布时间】:2012-03-27 03:28:53
【问题描述】:

我一直在寻找自定义图像网格,发现 a similar question 在答案中有一个非常甜蜜的组成部分。

我下载了代码,经过一番折腾,我设法让它在 DXE2 中编译。它看起来真的很酷,但我无法让任何一个滚动条出现。我也不知道如何动态控制显示的图像。或者如何根据键盘事件更新网格。

另外,为了编译它,我必须删除 GR32 引用;我下载的库与 DXE2 存在太多不兼容问题,我无法解决。

任何帮助将不胜感激。这看起来真的像一个杀手级组件。

Bill更新:

这是不正确的缩略图绘制的屏幕截图。我无法让缩略图看起来像来自component in question 的屏幕截图。

如果缩略图与第一遍中绘制的矩形绘制在相同的 XY 上,它们看起来会更好。知道发生了什么吗?

【问题讨论】:

  • 我假设您的意思是来自this answer 的组件,我是作者。你到底错过了什么?水平滚动条是设计缺失的,当加载更多图像时会出现垂直滚动条,然后可以通过设置ColWidthRowHeight 来显示。目前,您可以通过按键滚动控件,您还需要哪些键盘事件? “动态控制显示的图像”是什么意思?
  • 关于删除 GR32 引用:设置 {.$DEFINE GR32} 就足够了。 ;)
  • 感谢您的帮助!首先,为了让它在 DXE2 中编译,我: 从 ImageGrid.pas 中删除 {.$DEFINE GR32} ;-) 在 ImageGrid70.dpk 中用 vclimg 替换 vcljpg 在构建包并安装组件后,我创建了一个新项目并删除表单上的组件。唯一的属性分配是文件夹属性,分配一个带有图像的文件夹。当我运行它时,默认显示 6 张图像,但没有滚动条或键盘导航。 “动态控制显示的图像”:手动加载文件名字符串列表(如果您想使用 btns 导航)。我得到了这个工作。
  • @kobik 是的,我会尽快将它添加到我的存储库中。我可能会添加一大堆 SO-comps... ;)
  • @kobik component 被完全改写为OpenSource

标签: image delphi grid delphi-xe2


【解决方案1】:

...但我无法显示任何滚动条。

嗯,没有水平滚动条。有一个属性ColWidth 控制在一行中绘制多少图像,具体取决于控件的宽度。例如,由于锚点设置,您可能会在 OnResize 事件处理程序中更新 ColWidth

当并非所有图像(包括间距)都适合 clientrect 时,垂直滚动条会自动出现。图片是在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 属性。

... 或者如何根据键盘事件更新网格。 ...

当前实现的唯一击键是向上、向下、PageUp、PageDown、Home 和 End,它们都会滚动控件。您还希望采取哪些关键行动?它是一个查看器。

这是不正确的缩略图绘制的屏幕截图。我无法让缩略图看起来像相关组件的屏幕截图。 ...如果缩略图被绘制在与第一遍绘制的矩形相同的 XY 上,它们看起来会更好。

在加载图像时,会绘制一个大小为 ColWidth * RowHeight 的临时矩形。所有图像都在该尺寸内拉伸,因此请调整这些属性的比例以使各处的间距相等。请注意,您还可以使用 ImageHorzAlignImageVertAlign 属性影响外观。

更新:

你提到的组件最近完全重写了,上面的一些答案已经过时了。

它现在有一个Propertional 属性,默认为True,但是当设置False 时,它会将拇指拉伸到您设置的任何单元格大小,与原始图像大小无关。不过,小图像可能仍然很窄,除非您将新的 Stretch 属性设置为 True

它现在可以区分RowHeightCellHeight,以及ColWidthCellWidth。两者的区别是CellSpacing

组件不再从TScrollingWinControl下降,而是从TCustomControl下降,并且只添加了垂直滚动条。

【讨论】:

  • @NGLN- 是否应该公开 ReloadImages 以便您可以在运行时更改缩略图尺寸? SetImageSize(156, 80); ColWidth := 156;行高:= 80;重新加载图像;应该使用 SetImageSize 还是 ColWidth 和 RowHeight?
  • @Bill No. SetImageSize 已公开并致电 ReloadImagesColWidthRowHeight 都调用 SetImageSize。当两种尺寸都发生变化时,您必须使用SetImageSize,否则您可以选择使用哪个。
  • @NGLN- 但是,当我在这里调用 SetImageSize 时,缩略图不会重新加载......?所以我公开了 ReloadImages 并且现在刷新了缩略图。
  • @Bill 那你还没有给出其他维度。那你为什么还要重新加载图像呢?
  • @NGLN- 好的...我的错误... SetImageSize 现在由于某种原因正在工作...我只想重新加载,因为当我第一次尝试时缩略图没有刷新。我也确实看到了一些空的缩略图。你有网站吗?
猜你喜欢
  • 2012-02-09
  • 2017-12-23
  • 2013-01-24
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多