gpt4 book ai didi

delphi - 将 Blob 内容显示到 OleContainer Delphi

转载 作者:行者123 更新时间:2023-12-03 15:47:44 28 4
gpt4 key购买 nike

使用XE8。Devex TcxGrid 有一列表示带有 PopupEditProperties 的 blob 数据,并且 PopupControl = TOleContainer 控件。该列代表各种数据类型(图像、pdf、word、excel、mpg、avi、mp3、ppt 等)的数据库字段 (BlobType)

当 PopupEditProperties 中的 OnInitPopup 事件触发时,我想这样做:

var
MS: TMemoryStream;
OC: TOleContainer;
begin
if not Query1.FieldByName('data').isNull then begin
OC := TcxPopupEditProperties(cxGrid1DBTableView1Data.Properties).PopupControl as TOleContainer;
//Size of Container
with OC do begin
Parent := TcxPopupEdit(Sender).PopupWindow;
Left := 5;
Top := 5;
Width := cxGrid1DBTableView1.Controller.FocusedColumn.Width;
Height := 300;
end;
MS := TMemoryStream.Create;
try
TBlobField(Query1.FieldByName('data')).SaveToStream(MS);
// I Want show the content with appropiate application
OC.LoadFromStream(MS); // here crashes
finally
MS.Free;
end;
end;
end;

出现无效的流格式消息。执行此操作的最佳问题是什么?

最佳答案

TOleContainer 通过 LoadFromStream/SaveToStream 使用自己的格式。我假设您的数据库 blob 保存原始文件数据。您需要将TMemoryStream保存到临时文件,然后调用CreateObjectFromFile

另一个选择是使用此解决方案: Load a TOleContainer from a stream which contains a file image, without using CreateObjectFromFile (我个人会破解所需的私有(private)成员并编写一个独立的程序,但这将取决于版本)。

显然,我假设正确的上述“解决方案”不起作用,并且失败,并出现 “%1 已存在” EOleSysError 异常,正如您在评论中提到的。

因此,据我所知唯一的方法是使用具有正确扩展名的临时文件。需要扩展名来确定哪个 OLE 服务器应用程序将处理该文件。这些扩展中的每一个都在您的计算机上的 HKEY_CLASSES_ROOT 中注册。 IMO,您必须将文件类型保存在数据库中。您的应用程序稍后如何知道它是什么类型?唯一的方法是检查流/blob签名(这可能不是 100% 准确)。

关于delphi - 将 Blob 内容显示到 OleContainer Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39252681/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com