【问题标题】:Delphi loading TImage from CreateBlobStream ADO QueryDelphi 从 CreateBlobStream ADO 查询加载 TImage
【发布时间】:2012-03-22 15:32:27
【问题描述】:

我一直在尝试使用下面的代码将存储在 varbinary mssql 列中的图像数据加载到 TImage 组件,但它给出了错误

用 Query_Refresh 做 开始 关闭; 打开; 如果 RecordCount > 0 那么 开始 //编辑以允许字段的流式传输 编辑; //MyStream 是 TStream 类型 MyStream := CreateBlobStream(FieldByName('MyBlobField'),bmWrite); //加载到图像---错误发生在下面的行 MyImage.Picture.Graphic.LoadFromStream(MyStream); 结尾; 结尾;

错误是访问冲突......

请有人帮忙解决这个问题

【问题讨论】:

  • 访问冲突,意味着你试图访问一个不存在的对象。错误发生在哪一行? FieldByName('MyBlobField') 返回 MyBLobField 的实例?我建议你删除你的“with Query_Refresh do”,它会使调试更加困难。
  • 首先,我将去掉with 语句并用解释变量替换它。访问冲突发生在哪一行?
  • 尝试将 TStream 加载到 Timage 对象时发生错误
  • @Ceasar MyBlobField 只是数据库中 varbinary 字段的名称
  • 不应该是bmRead而不是bmWrite吗?

标签: delphi


【解决方案1】:

TPicture 不持有TGraphic,除非你告诉它。它一开始是空的,所以Graphic 属性为空。这就是为什么当您尝试对其调用方法时会遇到访问冲突。

如果您还不知道自己存储了哪种图形,您要么必须编写一些东西来检查字段的内容以找出答案,要么将另一个字段添加到数据库中来描述格式图形字段。

一旦您知道您拥有什么样的图形,您就可以创建该类的一个实例,从流中加载它,并将其分配给TPicture 容器。之后释放您的图形,因为TPicture 创建了自己的图形副本。这是一个例子:

var
  DBGraphicClass: TGraphicClass;
  Graphic: TGraphic;

// Implementing FieldValToGraphicClass is an exercise for the reader.
DBGraphicClass := FieldValToGraphicClass(FieldByName('MyBlobFieldType'));
Graphic := DBGraphicClass.Create;
try
  Graphic.LoadFromStream(MyStream);
  MyImage.Picture.Graphic := Graphic;
finally
  Graphic.Free;
end;

如果已知类型始终是TPicture 已经拥有的图形属性之一,那么您可以直接访问特定于类型的属性并跳过分配您自己的图形对象的步骤。例如,如果您的数据库包含位图,那么您可以访问TPicture.Bitmap 而不是TPicture.Graphic。然后TPicture 将自动创建一个TBitmap 对象。例如:

MyImage.Picture.Bitmap.LoadFromStream(MyStream);

【讨论】:

  • 不应该是MyImage.Picture.Graphic.Assign(Graphic);吗?或者在这种情况下MyImage.Picture.Graphic := Graphic; 方法是否等同于前者?
  • 这是一回事,@Andriy。查看TPicture.SetGraphic 并亲自查看。
  • 啊,我明白了。 几乎 相同,因为它 Assigns 是 new TGraphic 实例的参数(然后将其存储到属性后面的字段中)。无论如何,它必须更好,因为他们决定使用这么多步骤来实现它。感谢您提请我注意!
  • 是的,@Andriy。事实上,这就是我回答的重点。您必须分配给Graphic 属性,因为调用Graphic.Assign 将失败,原因与调用Graphic.LoadFromStream 失败的原因相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多