3

コンポーネントをインストールまたはダウンロードせずにDBGridを印刷するにはどうすればよいですか?

また

DBGridのデータをRichEditに取り込んで、そこから印刷できるようにするにはどうすればよいですか?

4

3 に答える 3

2

データ対応コントロールは DataSource プロパティからデータを取得し、それを使用します。ただし、手動でトラバースする必要がありますが、すぐに実行することはできません (サードパーティのライブラリ/コンポーネントなし)。

于 2011-09-21T08:40:06.450 に答える
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;

改ページを処理するには、いくつかのコードを追加する必要があります。

于 2011-09-21T12:57:53.693 に答える
0

グリッドにループして、すべて手動でリッチエディットに入れることができます。しかし、なぜ車輪を再発明するのでしょうか。レポート コンポーネントを使用するだけです。delphi 7 - delphi2010 では、rave コンポーネントがインストールされています。

于 2011-09-21T11:05:34.557 に答える