Delphi 在移动中显示来自db的图像
在Delphi中,我在详细信息表中存储了未知数量的图像文件名。这些图像文件可以是位图、JPEG、PNG和ICO文件 在移动中加载和显示listview或listbox的范例/最佳实践是什么?Delphi 在移动中显示来自db的图像,delphi,delphi-xe2,tlistview,timagelist,Delphi,Delphi Xe2,Tlistview,Timagelist,在Delphi中,我在详细信息表中存储了未知数量的图像文件名。这些图像文件可以是位图、JPEG、PNG和ICO文件 在移动中加载和显示listview或listbox的范例/最佳实践是什么? 我认为我需要在主表的onbeforecroll事件中将它们加载到ImageList中,然后将其分配给listview。使用的数据库组件是dbGO 我只需要显示预定义大小的缩略图(在VCL程序中)。“未知数字”听起来可能有大量图像。因此,预渲染的缩略图将非常有用。如果您的应用程序可以为所有图像创建缩略图并将其
我认为我需要在主表的onbeforecroll事件中将它们加载到ImageList中,然后将其分配给listview。使用的数据库组件是dbGO 我只需要显示预定义大小的缩略图(在VCL程序中)。“未知数字”听起来可能有大量图像。因此,预渲染的缩略图将非常有用。如果您的应用程序可以为所有图像创建缩略图并将其保存在单独的数据库中,这将减少缩小图像所需的CPU资源使用。您可以从主数据库中引用缩略图数据库 我要检查的一件事是RAM是否是一个限制,即在应用程序中将创建多少实际缩略图实例,例如,如果加载1000条数据库记录,这些记录都引用同一个缩略图,那么数据库访问组件是分配1000个图像对象(使用比需要多1000倍的RAM)还是只分配一个,它被引用了1000次。此外,图像数据的取消分配也很重要。听起来可能有大量图像。因此,预渲染的缩略图将非常有用。如果您的应用程序可以为所有图像创建缩略图并将其保存在单独的数据库中,这将减少缩小图像所需的CPU资源使用。您可以从主数据库中引用缩略图数据库
我要检查的一件事是RAM是否是一个限制,即在应用程序中将创建多少实际缩略图实例,例如,如果加载1000条数据库记录,这些记录都引用同一个缩略图,那么数据库访问组件是分配1000个图像对象(使用比需要多1000倍的RAM)还是只分配一个,它被引用了1000次。此外,图像数据的取消分配也很重要。最简单的方法是使用TPicture,因为已经实现了不同图形格式的加载,并且您必须关心不同的图像类。
您必须确保所需的单位包含在使用中,例如jpeg、gifimg和pngimg。
使用TPicture.LoadFromFile加载后,图像将绘制、居中并缩放到具有Imagelist尺寸的准备好的位图上。
最后一步是用位图调用AddBitmap过程,用nil调用掩码
// make sure you included the needed units
// uses pngImage,jpeg,gifimg;
Procedure LoadImagesFromDataset2ImageList(il: TImageList; DS: TDataset; const FileFieldname: String);
var
P: TPicture;
bmp: TBitmap;
Function CalcRectAndPrepare: TRect; // calculate Rect for here centered/streched output
var // and fill the bitmap with the desired beckground color
f: Double;
begin
bmp.Canvas.Brush.Color := clWhite;
bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height));
if P.Width > P.Height then
f := bmp.Width / P.Width
else
f := bmp.Height / P.Height;
Result.Left := Round(bmp.Width - P.Width * f) div 2;
Result.Top := Round(bmp.Height - P.Height * f) div 2;
Result.Right := bmp.Width - Result.Left;
Result.Bottom := bmp.Height - Result.Top;
end;
begin
P := TPicture.Create;
bmp := TBitmap.Create;
try
bmp.Width := il.Width;
bmp.Height := il.Height;
DS.First;
while not DS.Eof do
begin
if FileExists(DS.Fieldbyname(FileFieldname).asString) then
begin
P.LoadFromFile(DS.Fieldbyname(FileFieldname).asString);
bmp.Canvas.StretchDraw(CalcRectAndPrepare, P.Graphic);
il.Add(bmp, nil);
end;
DS.Next;
end;
finally
P.Free;
bmp.Free;
end;
end;
最简单的方法是使用TPicture,因为已经实现了不同图形格式的加载,并且您必须关心不同的图像类。
您必须确保所需的单位包含在使用中,例如jpeg、gifimg和pngimg。
使用TPicture.LoadFromFile加载后,图像将绘制、居中并缩放到具有Imagelist尺寸的准备好的位图上。
最后一步是用位图调用AddBitmap过程,用nil调用掩码
// make sure you included the needed units
// uses pngImage,jpeg,gifimg;
Procedure LoadImagesFromDataset2ImageList(il: TImageList; DS: TDataset; const FileFieldname: String);
var
P: TPicture;
bmp: TBitmap;
Function CalcRectAndPrepare: TRect; // calculate Rect for here centered/streched output
var // and fill the bitmap with the desired beckground color
f: Double;
begin
bmp.Canvas.Brush.Color := clWhite;
bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height));
if P.Width > P.Height then
f := bmp.Width / P.Width
else
f := bmp.Height / P.Height;
Result.Left := Round(bmp.Width - P.Width * f) div 2;
Result.Top := Round(bmp.Height - P.Height * f) div 2;
Result.Right := bmp.Width - Result.Left;
Result.Bottom := bmp.Height - Result.Top;
end;
begin
P := TPicture.Create;
bmp := TBitmap.Create;
try
bmp.Width := il.Width;
bmp.Height := il.Height;
DS.First;
while not DS.Eof do
begin
if FileExists(DS.Fieldbyname(FileFieldname).asString) then
begin
P.LoadFromFile(DS.Fieldbyname(FileFieldname).asString);
bmp.Canvas.StretchDraw(CalcRectAndPrepare, P.Graphic);
il.Add(bmp, nil);
end;
DS.Next;
end;
finally
P.Free;
bmp.Free;
end;
end;
哪一部分对你来说是个问题?正在将文件加载到TPicture,是否将位图添加到imagelist?在imagelist和Dataset/Listview/Listbox之间保持跟踪?@bummi很遗憾地说,上面的所有内容。@bummi实际上你的评论基本上回答了我的问题。所以我想我需要一个实例来实例化TPicture,从文件加载,将其添加到imagelist中,并对每个细节表记录重复。如果你能把你的评论扩展成一个答案,我很乐意接受。哪一部分对你来说是个问题?正在将文件加载到TPicture,是否将位图添加到imagelist?在imagelist和Dataset/Listview/Listbox之间保持跟踪?@bummi很遗憾地说,上面的所有内容。@bummi实际上你的评论基本上回答了我的问题。所以我想我需要一个实例来实例化TPicture,从文件加载,将其添加到imagelist中,并对每个细节表记录重复。如果你能把你的评论扩展成一个答案,我会欣然接受。是的,缩略图绝对是一个不错的选择。就性能而言,在移动中加载全尺寸图像是不可接受的。我想我会在插入记录时创建它们。是的,缩略图绝对是一种方法。就性能而言,在移动中加载全尺寸图像是不可接受的。我想我会在插入唱片时创建它们。很好,正是我想知道的。很好,正是我想知道的。