Announcement

Collapse
No announcement yet.

Form drucken

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

  • Form drucken

    Hi Leute

    Ich habe folgendes Problem:
    Ich möchte ein Form ausdrucken. Das ist ja eigentlich kein Problem,
    aber auf dem Form sind RichText-Komponeten untergebracht.
    Wenn ich nun das Form (ist das Deutsch???) drucke, druckt es mir
    den Inhalt der RichEdit-Komponente nicht mit aus.
    Gibt es eine Lösung?
    Ich möchte auf alle Fälle das Form mit den RichEdit-K. drucken.
    Danke

    Hansi

  • #2
    Hallo,

    in diesem Fall würde ich das Formular als Bitmap ausdrucken, wobei die folgende Funktion (stammt im Original aus einer Tool-DLL) als erster Ansatzpunkt herangezogen werden kann:
    <pre>
    procedure E_Snapshot(const Text: PChar; hWindow: Integer);
    const
    cRAND = 250;
    var
    hWin : HWND;
    aWinRect : TRect;
    iW, iH : Integer;
    aScreenBitmap : TBitmap;
    aDC : THandle;
    hBM : HBitmap;
    iInfoSize : DWORD;
    iImageSize : DWORD;
    pInfo : PBitmapInfo;
    pImage : Pointer;
    iDIBWidth : Integer;
    iDIBHeight : Integer;
    iScale : Integer;
    iDestWidth : Integer;
    iDestHeight : Integer;
    iDPI : Integer;
    sInfo : String;
    begin
    try
    if Assigned(Text) then
    sInfo := Text
    else
    sInfo := '(ohne Titel)';
    hWin := hWindow;
    GetWindowRect(hWin, aWinRect);
    iW := aWinRect.Right - aWinRect.Left;
    iH := aWinRect.Bottom - aWinRect.Top;
    aDC := GetWindowDC(hWin);
    aScreenBitmap := TBitmap.Create;
    try
    aScreenBitmap.Width := iW;
    aScreenBitmap.Height := iH;
    BitBlt(aScreenBitmap.Canvas.Handle, 0, 0, iW, iH, aDC, 0, 0, SRCCOPY);
    ReleaseDC(hWin, aDC);
    Printer.Orientation := poLandscape;
    Printer.BeginDoc;
    with Printer, Canvas do
    begin
    hBM := aScreenBitmap.Handle;
    GetDIBSizes(hBM, iInfoSize, iImageSize);
    pInfo := AllocMem(iInfoSize);
    try
    pImage := AllocMem(iImageSize);
    try
    GetDIB(hBM, 0, pInfo^, pImage^);
    with pInfo^.bmiHeader do
    begin
    iDIBWidth := biWidth;
    iDIBHeight := biHeight;
    end;
    iDPI := GetDeviceCaps(Canvas.Handle, LOGPIXELSX);
    // Druckerauflösung berücksichtigen (300dpi=2; 600dpi=4)
    iScale := (iDPI div 300) * 2;
    // Größe des Druckbereiches berechnen
    iDestWidth := iW * iScale;
    iDestHeight := iH * iScale;
    {$IFDEF TestOutput}
    sInfo := Format('Originalfenster: %d-%d; iScale: %d; iDestWidth: %d; ' +
    'iDestHeight: %d; Screen: %d-%d; Page: %d-%d = %d DPI',
    [iW, iH, iScale, iDestWidth, iDestHeight,
    Screen.Width, Screen.Height,
    PageWidth, PageHeight, iDPI]);
    {$ENDIF}
    Canvas.TextOut(cRAND, 100, sInfo);
    StretchDIBits(Canvas.Handle, cRAND, cRAND,
    iDestWidth + cRAND, iDestHeight + cRAND,
    0, 0, iDIBWidth, iDIBHeight, pImage, pInfo^,
    DIB_RGB_COLORS, SRCCOPY);
    finally
    FreeMem(pImage, iImageSize);
    end;
    finally
    FreeMem(pInfo, iInfoSize);
    end;
    end;
    Printer.EndDoc;
    finally
    aScreenBitmap.Free;
    end;
    except
    MessageBeep($FFFFFFFF);
    end
    end;
    </pre>
    Der erste Parameter <i>Text</i> enthält die Beschriftung des Ausdrucks, während der zweite Parameter <i>hWindow</i> das Fensterhandle des Formulars enthält. Ein Beispielaufruf könnte so aussehen:
    <pre>
    E_Snapshot('Test', Form1.Handle);
    </pre&gt

    Comment

    Working...
    X