【问题标题】:Loading a blob field into a ListBox将 blob 字段加载到 ListBox
【发布时间】:2014-11-29 20:59:25
【问题描述】:

我在本周早些时候回答了一个问题,我需要更进一步我正在使用 XE7,我在将表中的 blob 字段 (Image.jpg) 加载到 ListBox 甚至变量中时遇到问题稍后我可以将其输入到列表框。我的适用于字符串字段的代码如下。

// draw address line and postcode to listbox
ListBox2.Clear;
ListBox2.BeginUpdate;
// Read From Database to Listbox
FDQueryUpdate.Close;
FDQueryUpdate.SQL.Text := 'SELECT Address1, Postcode, Photo FROM Address';
try
  FDQueryUpdate.Open;
  Item := TlistBoxItem.Create(ListBox2);
  while not FDQueryUpdate.Eof do
  begin
  // create and format listbox to show bottomdetail
    Item := TlistBoxItem.Create(ListBox2);
    Item.StyleLookup := 'listboxitembottomdetail';
    // draw address to text part and postcode to bottom detail of Listbox item
    Item.Text := (FDQueryUpdate.Fields[0].AsString);
    Item.ItemData.Detail := (FDQueryUpdate.Fields[1].AsString);

    TBlobField(FDQueryUpdate.FieldByName('Photo')).SaveToFile('c:\sample_2.jpg');
    Item.ItemData.Bitmap.LoadFromFile('c:\sample_2.jpg');

    ListBox2.AddObject( Item );
    FDQueryUpdate.Next;
  end;
finally
ListBox2.EndUpdate;
FDQueryUpdate.Close;
end;

一直在努力,现在我可以通过将 DBase Blob 作为图像文件保存在磁盘上,然后从磁盘重新加载它,从而使 sample_2.jpg 图片被添加到列表框,从而使程序在 Windows 中运行。

但是这在 Android 中不起作用,因为我无法将文件保存在任何地方,因此我必须找到其他地方来保存图像文件

【问题讨论】:

    标签: delphi listbox firedac delphi-xe7


    【解决方案1】:

    设法解决了我的问题,请参阅下面使用 blob 流的代码:

    var
      Stream: TStream;
    
    // draw address line and postcode to listbox
    ListBox2.Clear;
    ListBox2.BeginUpdate;
    // Read From Database to Listbox
    FDQueryUpdate.Close;
    FDQueryUpdate.SQL.Text := 'SELECT Address1, Postcode, Photo FROM Address';
    try
      FDQueryUpdate.Open;
      Item := TlistBoxItem.Create(ListBox2);
      while not FDQueryUpdate.Eof do
      begin
        // create and format listbox to show bottomdetail
        Item := TlistBoxItem.Create(ListBox2);
        Item.StyleLookup := 'listboxitembottomdetail';
        // draw address to text part and postcode to bottom detail of Listbox item
        Item.Text := (FDQueryUpdate.Fields[0].AsString);
        Item.ItemData.Detail := (FDQueryUpdate.Fields[1].AsString);
        // prefer using blob stream this way
        Stream := FDQueryUpdate.CreateBlobStream(FDQueryUpdate.FieldByName('Photo'), bmRead);
        try
          Item.ItemData.Bitmap.LoadFromStream(Stream);
        finally
          Stream.Free;
        end;
    
        ListBox2.AddObject(Item);
        FDQueryUpdate.Next;
      end;
    finally
      ListBox2.EndUpdate;
      FDQueryUpdate.Close;
    end;
    

    然而,这一切都引发了另一个问题,我将作为一个单独的问题提出,请跟我来回答我的下一个问题。

    【讨论】:

    • 你似乎在Stream.Position := 0; 行多了一个end;。你应该有一个错误,但也许你的实际代码中没有它。
    • 是的,我注意到发布后,它不在代码中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2022-06-14
    • 2018-07-27
    • 2014-03-19
    相关资源
    最近更新 更多