如题: TdxComponentPrinter 控件如何打印 cxGrid DBTableView 中的图片?
在 cxGrid 中的图片字段显示正常的一张图片,但是用TdxComponentPrinter 打印预览中看到的确是空白,我能找到的相关设置都已经试过了, 我觉得可能是图片大小和cxGrid 的行距有关。 希望大家帮忙解答一下,谢谢!
我是新手,还没什么积分,等以后技术成熟点了,再来汇报社区吧,呵呵。

解决方案 »

  1.   

    那現在cxGrid DBTableView可以預覽圖片嗎???
      

  2.   

    如果為提高效率,可以在DrawCell事件中自繪,這樣效果會更好接著你再用TdxComponentPrinter組件來處理如果不知道如何處理,請發郵件給我procedure TFormImageRepository.Column_PictureCustomDrawCell(   
      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;  
     
      

  3.   


    你好,天涯浪子,你的头像换了嘛,幸福的人啊,看你回复的帖子很多了,你是个热心肠的人,谢谢你的帮助。
    cxGrid DBTableView 可以预览到图片。 
    现在还不需要考虑提高效率,先从基础的学起,哈哈,我现在想要TdxComponentPrinter打印界面能够出现图片。还望指点。
      

  4.   

    需要在TdxCompoentPrinter的TdxGridReportLink中也处理CustomDraw,首先,设置其SupportedCustomDraw=true,然后在其OnCustomDrawCell事件处理: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);   
        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;   
      

  5.   

    讲的有些模糊,里面的一些组件、类、方法、变量 没有交代清楚:
    ThumbnailList:这个类我没有;
    Column_ImageOID:这个和Column_Picture 是什么关系?我只理解Column_Picture 是 图片列;
    CustomDrawImage: 这个函数我不要,是否可以。
    能否帮忙解释一下,谢谢
      

  6.   

    根据你的提示,我现在的思路是这样: 
    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;