gpt4 book ai didi

arrays - 如何在运行时将多个图像从数据库保存到 TMemoryStream 并稍后提取它们

转载 作者:行者123 更新时间:2023-12-02 00:35:58 26 4
gpt4 key购买 nike

我正在delphi(RAD Studio)创建一个项目。数据库表中的某些行存储有图像。我想在运行时提取图像(为此我使用 TMemoryStream 数组)并在 frxReport 中显示它们。

我的代码片段如下

公共(public)变量TStream声明为

Stream2:TStream 数组; i,k:整数

查看按钮点击事件的代码段,放置在MainForm上,预计显示frxReport。

`

procedure TFrmMain.btnViewClick(Sender: TObject);
begin
i := 0;
k := 0;
UniTable1.SQL.Text := 'Select * from userplays order by id';
UniTable1.Execute;

rowcount := UniTable1.RecordCount;

SetLength(myid, rowcount);
SetLength(mydesc, rowcount);
SetLength(myimg, rowcount);
SetLength(Stream2, rowcount);

while not UniTable1.Eof do
begin
try
Stream2[k] := TMemoryStream.Create;
myid[k] := UniTable1.FieldByName('id').Value;
Stream2[k] := UniTable1.CreateBlobStream(TBlobField(UniTable1.FieldByName('image')), bmRead);
mydesc[k] := UniTable1.FieldByName('description').Value;

UniTable1.Next;
inc(k);

finally
//Stream2[k].Free;
end;

end;

frxUserDataSet1.RangeEnd := reCount;
frxUserDataSet1.RangeEndCount := rowcount;
frxReport1.ShowReport;
i := 0;
end;

`

但是此方法不会将任何图像加载到 Stream2 数组中。有一个选项可以使用 JPEGImage 数组,但是如果使用 JPEGImage 数组,那么在 frxRaport 上显示它就会出现问题


procedure TFrmMain.frxReport1GetValue(const VarName: string; var Value: Variant);

`

Graphic := TJPEGImage.Create;
Graphic.LoadFromStream(Stream2[j]);
TfrxPictureView(frxreport1.FindObject('Picture1')).Picture.Graphic := Graphic;

` 请让我知道如何执行此操作。

最佳答案

However this method is not loading any image to Stream2 array

在当前代码中,您首先将新创建的TMemoryStream分配给Stream2[k]:

      Stream2[k] := TMemoryStream.Create;

那么您将丢弃TMemoryStream(造成内存泄漏)并用您创建的 blob 流替换它:

      Stream2[k] := UniTable1.CreateBlobStream(TBlobField(UniTable1.FieldByName('image')), bmRead);

但是您从未从 blob 流中读取数据。

这是重写的 while 循环(未经测试)

var
blobstream: TStream;
Stream2: array of TMemoryStream;

....
// read 'id', 'description' and 'image' fields to respective arrays
while not UniTable1.Eof do
begin
myid[k] := UniTable1.FieldByName('id').Value;
mydesc[k] := UniTable1.FieldByName('description').Value;

blobstream := UniTable1.CreateBlobStream(TBlobField(UniTable1.FieldByName('image')), bmRead);
try
Stream2[k] := TMemoryStream.Create;
Stream2[k].LoadFromStream(blobstream);
finally
blobstream.Free;
end;

UniTable1.Next;
inc(k);
end;

顺便说一句,我建议定义一个记录来将 iddescriptionimage 保存在一起,然后定义一个由这些记录组成的数组,而不是三个单独的数组。只管理一个数组而不是三个数组要简单得多。

关于arrays - 如何在运行时将多个图像从数据库保存到 TMemoryStream 并稍后提取它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410112/

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