我在互联网上的很多地方搜索过但我找不到合适的解决方案。大多数示例使用其他组件或目标直接保存等。
我的问题是;我在服务器上有2个数据库,一个是产品信息(股票代码,名称,价格等),其他是产品图片(可以是jpeg,png,gif)。两个数据库都有一个独特的值来配对产品和图像(prod_id)。
我在表单上放了2个TFDConnection,2个TFDQuery和1个TDataSource组件,我从info数据库中获取数据并通过TDataSource,TFDConnection,TFDQuery和其他TFDConnection和TFDQuery组件将这些数据加载到StringGrid中以连接图像数据库
我想这样做;当我单击StringGrid上的一行时,让程序获取所选行的prod_id值(直到那里没有问题)然后搜索图像的数据库(如果有prod_id值,图像为blob(FILEDATA字段)在TImage控件上显示此图像)。
使用FireDAC组件有什么办法吗?或者我应该采取另一种方式?感谢。
答案 0 :(得分:1)
如果您查看Delphi示例文件夹,您应该在名为BindGridLinkVCLProject的LiveBindings文件夹下找到一个示例(可能您已经在使用它了。)
这显示了如何使用实时绑定从StringGrid
填充TDataSet
,以及如何使用它来加载存储在数据库中的图像,基于{{{ 1}}。
它使用加载了标准(Borland)Biolife数据库(又名FishFacts)数据的StringGrid
。我已经检查过,您可以用FireDAC替换ClientDataSet
(我使用ClientDataSet
,因为样本数据也包含其格式的Biolife DB)。正如Ken White在评论中所说,使用Firebird数据库不应该有任何区别(当然,除了你使用的FireDAC数据集类型之外)。
我还检查过你可以使用第二个FireDAC数据集进行查找以检索图像并将其加载到TFDMemTable
中。以下显示了如何。
在BindGridLinkVCLProject演示项目中,数据的Graphic列包含
鱼的图片通过Livebinding显示在TImage
。
很容易调整此演示项目以从其他TImage
检索图像
(尽管我在下面描述的内容中,我们只是使用Biolife数据集的第二个副本)
并使用FireDAC数据集而不是ClientDataSets。 (显然这是一个人为的例子,因为Biolife数据已经包含了图像数据,但以下内容表明,即使使用实时绑定,如果需要,也很容易从另一个数据集中检索图像。)
尝试以下方法:
制作项目及其GridLinkFormUit1.Pas文件的副本。
将TDataSet
替换为ClientDataSet1
。
点FDMemTable
和DataSource1
位于BindSourceDB1
。
从Biolife.Fds加载FDMemTable1
(在IDE中右键单击它)
文件在Samples Data文件夹中。
此时,FDMemTable1
应显示Biolife数据,StringGridWithBindColumns
TImage应显示当前鱼的图片。现在,
双击ImageWithHandler
,然后在弹出窗口中删除BindingList1
的绑定组件。我们将其添加到下面的单独BindingList中。
向表单添加第二个FDMemTable,并使用与ImageWithHandler
相同的数据加载它。
在表单中添加第二个FDMemTable1
和DataSource
。点BindingList
在
DataSource2
。
然后,双击FDMemTable2
,并使用编辑器在两者之间添加新的绑定
BindingList2
的{{1}}字段和Graphic
TImage的字段(请参阅下面的DFM)
如何连接它。 Bindings编辑器应该自动创建FDMemTable2
您需要将其ImageWithHandler
和BindSourceDB2
属性设置为DataSet
和DataSource
。
然后,将以下代码添加到表单的单元中,编译并运行:
FDMemTable2
DFM提取物:
DataSource2