如题: TdxComponentPrinter 控件如何打印 cxGrid DBTableView 中的图片?
在 cxGrid 中的图片字段显示正常的一张图片,但是用TdxComponentPrinter 打印预览中看到的确是空白,我能找到的相关设置都已经试过了, 我觉得可能是图片大小和cxGrid 的行距有关。 希望大家帮忙解答一下,谢谢!
我是新手,还没什么积分,等以后技术成熟点了,再来汇报社区吧,呵呵。
在 cxGrid 中的图片字段显示正常的一张图片,但是用TdxComponentPrinter 打印预览中看到的确是空白,我能找到的相关设置都已经试过了, 我觉得可能是图片大小和cxGrid 的行距有关。 希望大家帮忙解答一下,谢谢!
我是新手,还没什么积分,等以后技术成熟点了,再来汇报社区吧,呵呵。
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
OID:integer;
begin
inherited;
OID:=AViewInfo.RecordViewInfo.GridRecord.Values[Column_ImageOID.Index];
CustomDrawImage(OID,ACanvas.Canvas,AViewInfo.Bounds,false);
ADone:=true;
end;
procedure TFormImageRepository.CustomDrawImage(AOID: integer;
ACanvas: TCanvas; ARect: TRect;AIsExpand:Boolean);
var
ABmp:TGraphic;
AData:AnsiString;
AFormat:WideString;
R:TRect;
begin
ABmp:=ThumbnailList.Find(InttoStr(AOID));
if ABmp=nil then
begin
if FDataSetImage.Locate('OID',AOID,[]) and
not FDataSetImage.FieldByName('Thumbnail').IsNull then
begin
AData:=FDataSetImage.FieldByName('Thumbnail').AsString;
AFormat:=VarToWideStr(FDataSetImage.FieldByName('Format').asVariant);
if VarIsNull(AFormat) then AFormat:='';
//缩略图都是bmp格式
ABmp:=ThumbnailList.AddThumbnail(InttoStr(AOID),AData);
end;
end;
ACanvas.Pen.Color:=ACanvas.Brush.Color;
ACanvas.Rectangle(ARect);
if ABmp<>nil then
begin
R:=ARect;
R:=TThumbnailList.GetStretchRect(R,ABmp.Width,ABmp.Height,AIsExpand);
if AIsExpand then
ACanvas.StretchDraw(R,ABmp)
else
ACanvas.Draw(R.Left,R.Top,ABmp);
end;
end;
你好,天涯浪子,你的头像换了嘛,幸福的人啊,看你回复的帖子很多了,你是个热心肠的人,谢谢你的帮助。
cxGrid DBTableView 可以预览到图片。
现在还不需要考虑提高效率,先从基础的学起,哈哈,我现在想要TdxComponentPrinter打印界面能够出现图片。还望指点。
Sender: TdxGridReportLink; ACanvas: TCanvas;
AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData;
var ADone: Boolean);
var
AOID:integer;
begin
inherited;
if AColumn=Column_Picture then
begin
AOID:=ARecord.Values[Column_ImageOID.Index];
CustomDrawImage(AOID,ACanvas,AnItem.BoundsRect,false);
ADone:=true;
end;
end; AnItem.BoundsRect的坐标非常大,Left=46050;Right=51300,这个Cell的宽度是5250,远远超过Screen.Width的大小,因此看起来这里计量单位不是所谓的Pixel,我们图片相对于这样的坐标系:
procedure TFormImageRepository.ReportLink_ImageCustomDrawCell(
Sender: TdxGridReportLink; ACanvas: TCanvas;
AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData;
var ADone: Boolean);
var
AOID:integer;
begin
inherited;
if AColumn=Column_Picture then
begin
AOID:=ARecord.Values[Column_ImageOID.Index];
ACanvas.Ellipse(AnItem.BoundsRect);
//CustomDrawImage(AOID,ACanvas,AnItem.BoundsRect,false);
ADone:=true;
end;
end;
Cell的宽度是5250,而我们的Column.Width是100:procedure TFormImageRepository.CustomDrawImage(AOID: integer;
ACanvas: TCanvas; ARect: TRect;AIsExpand:Boolean;APixelsRatio:integer);
var
ABmp:TGraphic;
AData:AnsiString;
AFormat:WideString;
R:TRect;
begin
ABmp:=ThumbnailList.Find(InttoStr(AOID));
if ABmp=nil then
begin
if FDataSetImage.Locate('OID',AOID,[]) and
not FDataSetImage.FieldByName('Thumbnail').IsNull then
begin
AData:=FDataSetImage.FieldByName('Thumbnail').AsString;
AFormat:=VarToWideStr(FDataSetImage.FieldByName('Format').asVariant);
if VarIsNull(AFormat) then AFormat:='';
//缩略图都是bmp格式
ABmp:=ThumbnailList.AddThumbnail(InttoStr(AOID),AData);
end;
end;
ACanvas.Pen.Color:=ACanvas.Brush.Color;
ACanvas.Rectangle(ARect);
if ABmp<>nil then
begin
R:=ARect;
R:=TThumbnailList.GetStretchRect(R,ABmp.Width*APixelsRatio,ABmp.Height*APixelsRatio,AIsExpand);
if AIsExpand or (APixelsRatio<>1) then
ACanvas.StretchDraw(R,ABmp)
else
ACanvas.Draw(R.Left,R.Top,ABmp);
end;
end;
procedure TFormImageRepository.ReportLink_ImageCustomDrawCell(
Sender: TdxGridReportLink; ACanvas: TCanvas;
AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData;
var ADone: Boolean);
var
AOID:integer;
begin
inherited;
if AColumn=Column_Picture then
begin
AOID:=ARecord.Values[Column_ImageOID.Index];
CustomDrawImage(AOID,ACanvas,AnItem.BoundsRect,false,Round(AnItem.Width/AColumn.Width));
ADone:=true;
end;
end; 結論:
procedure TFormImageRepository.ReportLink_ImageCustomDrawCell(
Sender: TdxGridReportLink; ACanvas: TCanvas;
AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData;
var ADone: Boolean);
var
AOID:integer;
begin
inherited;
if AColumn=Column_Picture then
begin
AOID:=ARecord.Values[Column_ImageOID.Index];
CustomDrawImage(AOID,ACanvas,AnItem.BoundsRect,false,dxPSCore.OnePixel);
ADone:=true;
end;
end;
ThumbnailList:这个类我没有;
Column_ImageOID:这个和Column_Picture 是什么关系?我只理解Column_Picture 是 图片列;
CustomDrawImage: 这个函数我不要,是否可以。
能否帮忙解释一下,谢谢
1、测试了一张已经存在的图片:AImage_1,直接利用ACanvas.StretchDraw(AnItem.BoundsRect, AImage_1);可以打印出来。所以我现在需要取得每一条记录打印时对应的图片(这个是我目前的问题)。 // 暂时不考虑图片伸缩导致的失真问题。
2、在CustomDrawCell 函数中 怎么得到每一条记录 Image 字段 的数据呢?你提供的程序中 ThumbnailList 应该是个Hash表对象吧,我在Delphi 2009 里面用 TDictionary<string, TGraphic> 也可以做到,预先存储一条记录的ID和对应的 Image数据。 这样应该是可以的。 但是,DBTable 增、删、改 的时候,我都需要对 Hash 表做修改,才能保证打印时 图片数据 与 当前数据库 中的数据一致,稍微有点麻烦。我想是不是还有简单点的方法,我尽力在CustomDrawCell 函数的 传入参数(AView、ARecord、AColumn、AnItem)中 寻找 有关的属性或方法,但是没找到可用的,除了 ARecord.Values[AColumn.Index], 返回的是 Variant 类型,转换为 TGraphic 类型 不可以,郁闷在这里。
希望就在前方,哈哈,希望明天能够和各位探讨这个问题。procedure TFrmMain.dxComponentPrinter2Link1CustomDrawCell(
Sender: TdxGridReportLink; ACanvas: TCanvas; AView: TcxCustomGridTableView;
ARecord: TcxCustomGridRecord; AColumn: TcxGridColumn;
AnItem: TAbstractdxReportCellData; var ADone: Boolean);
begin
inherited;
if AColumn = cxGridRightTopDBTableView1Picture then
begin
ACanvas.StretchDraw(AnItem.BoundsRect, AImage_1);// AImage_1是预先生成的一个TGraphic对象
ADone:=true;
end;