2011-09-21 41 views
2

如何在不安裝或下載組件的情況下打印DBGrid?打印TDBGrid

OR

我怎樣才能得到一個DBGrid的數據轉換成一個RichEdit的,這樣我可以通過它打印?

回答

2

數據感知控件從DataSource屬性獲取它們的數據,使用它。您必須手動遍歷它,不可能立即(沒有第三方庫/組件)。

0

您可以循環進入您的網格並手動將它們全部放入您的RichEdit中。 但爲什麼要重新發明輪子。只需使用報告組件。 在delphi 7 - delphi2010上安裝了rave組件。

+0

這是一個學校項目女巫在課堂上被拒絕,我們可能無法下載或安裝新組件,因爲有人在安裝組件時將系統燒燬。你能給我一個關於如何使用rave組件的例子嗎? – Arno

+0

自我,我不使用狂歡。我使用ReportBuilder。但是Rave Report正常運行在delphi7-delphi2010上。例如:http://componentace.com/reports-rave-report-delphi.htm但是如果你沒有de IDE的組件。然後你必須循環訪問你的數據。 – Ravaut123

1

你需要能夠沿着這些路線制定出合適的打印寬度爲每個字段,東西:

function PrintFieldWidth(Field: TField): Integer; 
var 
    CharWidth: Integer; // an average character width 
    TitleWidth: Integer; // the width of the field title 
    FieldWidth: Integer; // the width of the field content 
begin 
    CharWidth := Printer.Canvas.TextWidth('0');     
    TitleWidth := Printer.Canvas.TextWidth(Field.DisplayName); 
    FieldWidth := Field.DisplayWidth*CharWidth;    
    if TitleWidth > FieldWidth then 
    Result := TitleWidth+CharWidth 
    else 
    Result := FieldWidth+CharWidth; 
end; 

通過所有的記錄然後循環,循環遍歷每個字段進行打印。

procedure PrintText(S: String; X, Y, W, H: Integer); 
begin 
    Printer.Canvas.TextRect(Rect(X,Y,X+W,Y+H),S); 
end; 

procedure PrintHeader(DataSet: TDataSet; X, Y, H: Integer); 
var 
    I: Integer; // record loop 
    W: Integer; // field width 
begin 
    for I := 0 to DataSet.FieldCount-1 do 
    begin 
    if DataSet.Fields[I].Visible then 
    begin 
     W := PrintFieldWidth(DataSet.Fields[I]); 
     PrintText(DataSet.Fields[I].FieldName, X, Y, W, H); 
     X := X + W; 
    end; 
    end; 
end; 

procedure PrintRecord(DataSet: TDataSet; X, Y, H: Integer); 
var 
    I: Integer; // record loop 
    W: Integer; // field width 
begin 
    for I := 0 to DataSet.FieldCount-1 do 
    begin 
    if DataSet.Fields[I].Visible then 
    begin 
     W := PrintFieldWidth(DataSet.Fields[I]); 
     PrintText(DataSet.Fields[I].AsString, X, Y, W, H); 
     X := X + W; 
    end; 
    end; 
end; 

procedure PrintDataSet(DataSet: TDataSet; X, Y: Integer); 
var 
    OldPos: TBookmark; 
    H: Integer; // line height 
begin 
    if DataSet <> nil then 
    begin 
    H := Printer.Canvas.TextHeight('0'); 
    SaveAfterScroll := DataSet.AfterScroll; 
    DataSet.AfterScroll := nil; 
    try 
     DataSet.DisableControls; 
     OldPos := DataSet.GetBookmark; 
     DataSet.First; 
     PrintHeader(DataSet, X, Y, H); 
     Y := Y + H * 2; 
     while not DataSet.Eof do 
     begin 
     PrintRecord(DataSet, X, Y, H); 
     Y := Y + H; 
     DataSet.Next; 
     end; 
     DataSet.GotoBookmark(OldPos); 
     DataSet.FreeBookmark(OldPos); 
    finally 
     DataSet.AfterScroll := SaveAfterScroll; 
     DataSet.EnableControls; 
    end; // try 
    end; 
end; 

您需要添加一些代碼來處理分頁符。

+0

感謝您提供此信息 – Arno