Announcement

Collapse
No announcement yet.

keine Ränder beim Drucken von RichEdit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • keine Ränder beim Drucken von RichEdit

    Mit der Methode Print drucke ich in einem Programm den Inhalt einer RichEdit-Komponente aus. Dabei wird allerdings in der linken oberen Ecke des Blattes mit dem Druck begonnen. Wie bekomme ich Ränder auf das Papier?!

  • #2
    Hallo Christian,

    in der c't 24/99 ist ein lehrreicher Artikel von Johannes Leckebusch genau zu dem Thema erschienen (Seitenformatierer). Dort wird auch klar, das dieses Thema nicht mit dem aufrufen einer Methode abgehakt werden kann

    Comment


    • #3
      Hallo,

      das folgende Beispiel demonstriert, wie man eine Preview-Funktion mit TRichEdit implementieren kann, bei der auch ein Rand berücksichtigt wird. Das aufgerufene zweite Formular enthält nur eine TImage-Instanz. <br>
      Auf dem gleichen Weg sollte auch der Ausdruck möglich sein:
      <pre>
      unit PreviewFrm;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ExtCtrls, ToolWin, ActnList, ImgList;

      type
      TForm1 = class(TForm)
      ToolBar1: TToolBar;
      ToolButton1: TToolButton;
      RichEdit1: TRichEdit;
      ToolButton2: TToolButton;
      OpenDialog1: TOpenDialog;
      ImageList1: TImageList;
      ActionList1: TActionList;
      ActionFileOpen: TAction;
      ActionPreview: TAction;
      procedure ActionFileOpenExecute(Sender: TObject);
      procedure ActionPreviewExecute(Sender: TObject);
      private
      { Private-Deklarationen }
      public
      { Public-Deklarationen }
      end;

      var
      Form1: TForm1;

      implementation

      {$R *.DFM}

      uses Printers, RichEdit, PreviewFrmPreview;

      procedure TForm1.ActionFileOpenExecute(Sender: TObject);
      begin
      if OpenDialog1.Execute then
      Richedit1.Lines.LoadFromFile(OpenDialog1.Filename) ;
      end;

      procedure TForm1.ActionPreviewExecute(Sender: TObject);
      var
      rZoom : Single;
      xScale : Single;
      yScale : Single;
      aPageRect : TRect;
      aOutputRect : TRect;
      aFmtRange : TFormatRange;
      begin
      // 50% der Originalgröße
      rZoom := 0.5;
      xScale := Screen.PixelsPerInch / GetDeviceCaps(Printer.Handle, LOGPIXELSX);
      yScale := Screen.PixelsPerInch / GetDeviceCaps(Printer.Handle, LOGPIXELSY);
      // Preview-Fläche mit weißem Hintergrund ausfüllen
      with FormPreview.ImagePreview.Picture.Bitmap do
      begin
      Width := Round(Printer.Pagewidth * rZoom * xScale);
      Height:= Round(Printer.PageHeight * rZoom * yScale);
      with Canvas do begin
      Brush.Color := clWhite;
      Brush.Style := bsSolid;
      FillRect(Cliprect);
      end;
      end;
      // Zoomfaktor berücksichtigten
      with FormPreview.ImagePreview.Picture.Bitmap.Canvas do
      begin
      SetMapMode(Handle, MM_ANISOTROPIC);
      SetWindowExtEx(Handle, Screen.PixelsPerInch, Screen.PixelsPerInch, nil);
      SetViewportExtEx(Handle, Round(Screen.PixelsPerInch * rZoom),
      Round(Screen.PixelsPerInch * rZoom), nil);
      end;
      // Ausgabebereich in TWIPS (1/1440 inch) festlegen
      with FormPreview.ImagePreview.Picture.Bitmap do
      aPageRect := Rect(0, 0,
      Round(Width * 1440 / Screen.PixelsPerInch / xScale),
      Round(Height * 1440 / Screen.PixelsPerInch / yScale));
      aOutputRect := aPageRect;
      // Rand berücksichtigen
      InflateRect(aOutputRect, -720, -720 );
      // EM_FORMATRANGE-Parameter zusammensetzen
      FillChar(aFmtRange, SizeOf(aFmtRange), 0);
      with aFmtRange do
      begin
      hDC := FormPreview.ImagePreview.Picture.Bitmap.Canvas.Han dle;
      hdcTarget := hDC;
      rc := aOutputRect;
      rcPage := aPageRect;
      chrg.cpMin := 0;
      chrg.cpMax := Richedit1.GetTextLen-1;
      end;
      // Richedit-Text für die Bildschirmausgabe rendern
      Richedit1.Perform(EM_FORMATRANGE, 1, Longint(@aFmtRange));
      // Wichtig! Cache-Daten wieder löschen
      Richedit1.Perform(EM_FORMATRANGE, 0, 0);
      with FormPreview do
      begin
      Width := ImagePreview.Picture.Bitmap.Width;
      Height := ImagePreview.Picture.Bitmap.Height;
      ShowModal;
      end;
      end;

      end.
      </pre&gt

      Comment


      • #4
        Danke für den Tip

        Comment

        Working...
        X