Delphi 如何制作从TBlob到TBitmap的LiveBinding转换器
我的软件主要基于Firemonkey TListView,它是根据Delphi示例项目中的“SampleListViewMultiDetailAppearanceProject”定制的 “C:\Users\Public\Documents\Embarcadero\Studio\14.0\Samples\Object Pascal\Mobile Samples\User Interface\ListView\” 这是使用PrototypeBindSource时的情况: 每条记录显示1个图像和4个文本项 我使用TMS Aurelius作为数据集,连接到BindSource。它是使用所有标准字段类型的TDataset子体 它实现了TBlobField,内部为:Delphi 如何制作从TBlob到TBitmap的LiveBinding转换器,delphi,firemonkey,delphi-xe6,livebindings,Delphi,Firemonkey,Delphi Xe6,Livebindings,我的软件主要基于Firemonkey TListView,它是根据Delphi示例项目中的“SampleListViewMultiDetailAppearanceProject”定制的 “C:\Users\Public\Documents\Embarcadero\Studio\14.0\Samples\Object Pascal\Mobile Samples\User Interface\ListView\” 这是使用PrototypeBindSource时的情况: 每条记录显示1个图像和4个
TBlob = record
private
FIntData: TArray<byte>;
livebinding系统检索TBlobField时,调用的函数如下:
function TEntity.GetImage: TBlob;
begin
if FImage.IsNull then
AssignResource('default', FImage);
result := FImage;
end;
FImage是一个TBlob类型,具有一些辅助功能,但正如我所说的是一个TArray,没有任何类型的处理,只有一个容器
因此,FImage将直接转到FMX TListView的TBitmap
不发生任何事情,不显示任何图像
我尝试了以下代码:
TValueRefConverterFactory.RegisterConversion(TypeInfo(TBlob), TypeInfo(TBitMap), TConverterDescription.Create(
procedure(const I: TValue; var O: TValue)
var
Blob: TBlob;
BitMap: TBitMap;
begin
Blob := I.AsType<TBlob>;
BitMap := O.AsType<TBitMap>;
end,
'BlobToBitMap' + GetTypeName(TypeInfo(TBlob)), 'BlobToBitMap' + GetTypeName(TypeInfo(TBitMap)), 'Nahar.LiveBinding', True, '', nil
));
TValueRefConverterFactory.RegisterConversion(类型信息(TBlob)、类型信息(TBitMap)、TConverterDescription.Create(
过程(常数I:TValue;变量O:TValue)
变量
Blob:TBlob;
位图:TBitMap;
开始
Blob:=I.AsType;
位图:=O.AsType;
完,,
'BlobToBitMap'+GetTypeName(TypeInfo(TBlob)),'BlobToBitMap'+GetTypeName(TypeInfo(TBitMap)),'Nahar.LiveBinding',True',nil
));
从与图像无关的其他类型的转换中获取此代码。但它显然是错误的,除了它编译的事实
此代码中的问题:
-它似乎得到了注册,我放置了一个断点,并且RegisterConversion确实得到了执行,但是在匿名过程中,内部的断点永远不会执行。在创建包含TlisView的任何帧之前,我将在初始化部分注册此项。
-在匿名程序中,转换本身纯粹是虚构的;因为我相信Blob存储为png,输出应该是fmx位图。我不知道在那里写什么
关于这个主题的文档很少,对我的理解没有帮助
我想知道如何正确制作此流程的顺序:
- 我需要从png转换为位图吗?怎么做李>
- 我需要注册转换适配器吗?怎样?为什么不被解雇
- 此转换适配器中的正确转换代码是什么
重要提示:它也必须是跨平台的,因为fmx应用程序在android上使用。无需进行任何转换 根据David Heffernan的信息,FMX中的TBitmap自然识别PNG格式,我发现错误在于调用AssignResource函数的方式:
procedure TEntity.AssignResource(AName: String; ABlob: TBlob);
然而,这是正确的:
procedure TEntity.AssignResource(AName: String; VAR ABlob: TBlob);
进行此更改可以纠正搜索过程中出现的问题和数周的痛苦。
ftGraphic
是位图,如中所述。它基于VCL.Graphics位图。@KenWhite ok,但FMX的位图是否相同?就我所知,似乎有两个不同的位图不直接兼容。问题是,使用ftGraphic,我需要添加VCL和FMX中不常见的单位,最后我无法生成使用实体的通用bpl,并且应该是平台无关的。我的观点是a)这是一个位图,b)这是一个VCL位图。请注意,这里没有FMX,也没有提到您所使用的PNG格式ftGraphic
从Delphi 1及其之前就已经存在了,当时Paradox是一种主要的数据库类型。这不适合你在这里做的事。(我不能回答你的问题,否则我会这样做而不是发表评论。我只是注意到你提到的其中一个选项很可能不会有用。)如果ftGraphic
字段类型基于VCL.Graphics,那么它不是正确的类型。@KenWhite抱歉不清楚。问题被标记为Firemonkey,我应该在文本上更清楚。我已经编辑并添加了TListVIew是Firemonkey视图。并且从项目资源中检索到的图像是PNG类型的。不,你误解了我说的话。问题显然是关于FMX的;我是说ftGraphic
不合适,因为你的问题是关于FMX的,而且ftGraphic
在PNG存在之前就已经存在了。您的问题很好,但是ftGraphic
并不是您应该考虑的选项。
procedure TEntity.AssignResource(AName: String; VAR ABlob: TBlob);