Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何制作从TBlob到TBitmap的LiveBinding转换器_Delphi_Firemonkey_Delphi Xe6_Livebindings - Fatal编程技术网

Delphi 如何制作从TBlob到TBitmap的LiveBinding转换器

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个

我的软件主要基于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,内部为:

  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转换为位图吗?怎么做
  • 我需要注册转换适配器吗?怎样?为什么不被解雇
  • 此转换适配器中的正确转换代码是什么

我看到TDataset上有一个ftGraphic TField,我可以创建这种类型的字段。但也存在以下问题: -这种类型的预期TField返回值是多少? -我的代码在平台之间共享:VCL和FMX,TBitMap或TGraphic在这两个平台上都不相同。此共享由未限定范围的bpl包进行。它是必需的,因为我注册了其他BPL的冲突。我有一个共享的通用bpl和其他使用它的特定于平台的bpl

由于我还没有找到解决bpl共享和平台单元不兼容的方法,我切换到第一个选项,尝试在数据库级别处理原始数据,并让转换在livebinding级别进行,这已经在每个平台的域中发生了

我完全不知道图像相关的操作,特别是在转换和正确的对象创建方面,以避免内存泄漏


重要提示:它也必须是跨平台的,因为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);