Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Inhalt mehrerer Richedit auf eine Seite drucken

  Alt 4. Aug 2006, 12:28
Oder nimm die folgende Routine.
Delphi-Quellcode:
{ Druckt den Inhalt des angegebenen RichEdit-Fensters ab der Zeichenposition
  "FromPos" in das angegebene Rechteck. Liefert die Zeichenposition des ersten
  nicht mehr gedruckten Zeichens zurück.
}

const
  PageRect_Twips = 144000;
  PageRect_MM = 2540;
  PageRect_Printer = 0;

function PrintRichEditIntoRect(RichEditHandle: HWND; const PageRect: TRect;
  Scaling: Integer = PageRect_Printer; FromPos: Integer = 0): Integer;
var
  Range: TFormatRange;
  MM: Integer;
  pho, lpx: TPoint;
begin
  Range.hdc := Printer.Handle;
  Range.hdcTarget := Range.hdc;

  lpx.x := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSX);
  lpx.y := 100 * GetDeviceCaps(Range.hdc, LOGPIXELSY);

  // In Druckerkoordinaten umwandeln falls nötig
  if Scaling <> PageRect_Printer then
  begin
    Range.rc.Left := MulDiv(PageRect.Left, lpx.x, Scaling);
    Range.rc.Top := MulDiv(PageRect.Top, lpx.y, Scaling);
    Range.rc.Right := MulDiv(PageRect.Right, lpx.x, Scaling);
    Range.rc.Bottom := MulDiv(PageRect.Bottom, lpx.y, Scaling);

    // Druckoffset anpassen
    pho.x := GetDeviceCaps(Range.hdc, PHYSICALOFFSETX);
    pho.y := GetDeviceCaps(Range.hdc, PHYSICALOFFSETY);
    OffsetRect(Range.rc, -pho.x, -pho.y);
  end
  else
    Range.rc := PageRect;

  // In Twips umwandeln
  Range.rc.Left := MulDiv(Range.rc.Left, 144000, lpx.x);
  Range.rc.Top := MulDiv(Range.rc.Top, 144000, lpx.y);
  Range.rc.Right := MulDiv(Range.rc.Right, 144000, lpx.x);
  Range.rc.Bottom := MulDiv(Range.rc.Bottom, 144000, lpx.y);

  Range.rcPage := Range.rc;
  Range.chrg.cpMin := FromPos;
  Range.chrg.cpMax := -1;

  MM := SetMapMode(Printer.Handle, MM_TEXT);
  try
    SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
    Result := SendMessage(RichEditHandle, EM_FORMATRANGE, 1, Integer(@Range));
  finally
    SendMessage(RichEditHandle, EM_FORMATRANGE, 0, 0);
    SetMapMode(Printer.Handle, MM);
  end;
end;
Beispielcode:
Delphi-Quellcode:
procedure TForm1.Print1Click(Sender: TObject);
var
  h: THandle;
  rc: TRect;
  pp: Integer;
begin
  h := RichEdit1.Handle;

  Printer.BeginDoc;
  try
    pp := 0;

    rc := Rect(10, 10, 100, 100);
    pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);

    rc := Rect(110, 110, 200, 200);
    pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);

    rc := Rect(10, 110, 100, 200);
    pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);

    rc := Rect(110, 10, 200, 100);
    pp := PrintRichEditIntoRect(h, rc, PageRect_MM, pp);

    Printer.EndDoc;
  except
    Printer.Abort;
    raise;
  end;

  MessageDlg('Ausdruck erfolgte bis Zeichen ' + IntToStr(pp),
    mtInformation, [mbOk], 0);
end;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat