コンポーネントをインストールまたはダウンロードせずにDBGridを印刷するにはどうすればよいですか?
また
DBGridのデータをRichEditに取り込んで、そこから印刷できるようにするにはどうすればよいですか?
データ対応コントロールは DataSource プロパティからデータを取得し、それを使用します。ただし、手動でトラバースする必要がありますが、すぐに実行することはできません (サードパーティのライブラリ/コンポーネントなし)。
次の行に沿って、各フィールドの適切な印刷幅を計算できる必要があります。
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;
改ページを処理するには、いくつかのコードを追加する必要があります。
グリッドにループして、すべて手動でリッチエディットに入れることができます。しかし、なぜ車輪を再発明するのでしょうか。レポート コンポーネントを使用するだけです。delphi 7 - delphi2010 では、rave コンポーネントがインストールされています。