以前已经说过怎么在DBGridEh里面显示图片,还有怎么让图片更清晰,但是碰到数据量比较大和图片特别大的情况下就会卡死,一般有两种方案,一种是异步加载图片,保证主程序不会被卡住,一种是把图片加载到缓存里面,我是用图片加载到缓存里面
1.先定义一个变量存储图片FImageList: TDictionary<String, TMemoryStream>;
2.在create或者show事件里面创建变量FImageList := TDictionary<String, TMemoryStream>.Create;
3.在DrawColumnCell事件里面添加这些代码,这样速度就快很多了
procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
var
ProNo: String;
jpeg: TDBImageEh;
FileName: String;
size: Integer;
MemStream, Stream: TMemoryStream;
begin
if (Column.FieldName = 'IMG') and (Column.Field <> NIL) then
begin
size := 100;
ProNo := MemTableEh1.FieldByName('ProNo').AsString;
if FImageList.ContainsKey(ProNo) then
begin
jpeg := TDBImageEh.Create(nil);
jpeg.PicturePlacement := ipStretchEh;
FImageList[ProNo].Position:=0;
jpeg.Picture.LoadFromStream(FImageList[ProNo]);
end
else
begin
MemStream := TMemoryStream.Create;
jpeg := TDBImageEh.Create(nil);
jpeg.PicturePlacement := ipStretchEh;
MakeThumbnailImage(ExtractFilePath(ParamStr(0)) + 'A1.jpg',size,size,jpeg.Picture,True);
jpeg.Picture.Graphic.SaveToStream(MemStream);
MemStream.Position := 0;
FImageList.Add(ProNo, MemStream);
end;
DBGridEh1.Canvas.StretchDraw(Rect, jpeg.Picture.Graphic);
jpeg.Free;
end;
end;
主要原理就是避免不停的去加载存储的图片,MakeThumbnailImage过程是提高图片清晰度的