Announcement

Collapse
No announcement yet.

TImage.Canvas als Druckvorschau möglich?

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

  • TImage.Canvas als Druckvorschau möglich?

    Hallo beisammen,

    ich drucke mittels folgender Source direkt auf Printer.Canvas und hätte nun auch gerne eine Druckvorschau.

    <PRE>
    with Printer do
    begin
    PrinterIndex := fmProDruck.cbPrinters.ItemIndex;
    Copies := StrToInt(fmProDruck.edExemplare.Text);
    Title := 'Dokumententitel';
    Orientation := poPortrait;

    BeginDoc;

    with Canvas do
    begin
    MoveTo(0,0); // Einheit auf mm stellen
    SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);
    Font.Name := 'Arial'; // Schriftart

    TextOut(x, y, 'Dieser Text wird gedruckt');
    end;

    EndDoc;
    end;
    </PRE>

    Es sollte doch möglich sein, anstatt die Ausgabe direkt auf Printer.Canvas zu lenken, zunächst auf TImage.Canvas zu "drucken", das Image anzuzeigen und - wenn tatsächlich gedruckt werden soll - TImage.Canvas auf Printer.Canvas zu kopieren.

    Dabei habe ich folgende Fragen:

    Wie kann ich bei der Verwendung von TImage.Canvas einen Seitenumbruch realisieren? Muss ich für jede Seite ein neues TImage-Objekt anlegen?

    Wie kann ich beim Kopieren sicherstellen, dass der Druck auf Papier nicht verzerrt ausgegeben wird?

    Hat jemand ein bisschen Code für mich, wenn das schon jemand realisiert hat?

    Bereits jetzt herzlichen Dank für jede Hilfe!

    Ralph

  • #2
    Hallo das ist ein Beispiel aus einem Buch vieleicht Hilft's ja<br>
    <pre>
    implementation
    {$R *.DFM}
    var blatt : TCanvas;
    dc : HDC;
    druckbreite,druckhoehe: integer;
    panelx : TWinControl;
    MMproPixelY,
    MMproPixelX : single;
    procedure DC_TextOut(c:TCanvas;x,y,winkel,groesse:integer;tx t:PChar);
    var hfont, fontold : integer;
    dc : hdc;
    fontname : string;
    begin
    dc := c.handle;
    fontname := c.font.name + #0;
    hfont := CreateFont(groesse,0,winkel*10,0,fw_normal,0,0,0,1 ,out_tt_precis,$10,2,4,@fontname[1]);
    fontold := SelectObject(dc,hfont);
    c.TextOut(x,y,txt);
    SelectObject(dc, fontold);
    DeleteObject(hfont);
    end;
    procedure blattanpassen;
    var prnxy, formxy : single;
    dx,dy,x,y : integer;
    blattbreite,
    blatthoehe : integer;
    scale : single;
    xofs,yofs : single;

    begin
    MMproPixelX := 25.4 / GetdeviceCaps(printer.handle,LOGPIXELSX) ;
    MMproPixelY := 25.4 / GetdeviceCaps(printer.handle,LOGPIXELSY) ;

    blattbreite := Round(GetdeviceCaps(printer.handle,PHYSICALWIDTH) * MMproPixelX);
    blatthoehe := Round(GetdeviceCaps(printer.handle,PHYSICALHEIGHT) * MMproPixelY);

    xofs := Round(GetdeviceCaps(printer.handle,PHYSICALOFFSETX )*MMproPixelX);
    yofs := Round(GetdeviceCaps(printer.handle,PHYSICALOFFSETY )*MMproPixelY);

    druckbreite := GetDeviceCaps(printer.handle, horzsize);
    druckhoehe := GetDeviceCaps(printer.handle, vertsize);
    y := 35;
    x := 10;
    formxy := (form1.clientWidth - x) / (Form1.clientheight - y);

    prnxy := blattbreite / blatthoehe;
    If formxy < prnxy Then begin //Breite dominiert
    dx := form1.clientWidth - 20;
    dy := round(dx / prnxy);
    y := round((Form1.ClientHeight / 2 + 8) - (dy / 2));
    end else begin //Höhe dominiert
    dy := form1.clientHeight - y-10;
    dx := round(dy * prnxy);
    x := round((form1.clientWidth / 2) - (dx / 2));
    End;
    form1.shape1.setbounds(x,y,dx,dy);
    scale := dy /blatthoehe;
    panelx.setbounds(x+Round(xofs*scale),y+Round(yofs* scale),Round(druckbreite*scale),Round(druckhoehe*s cale));
    SetMapMode(blatt.handle,mm_anisotropic);
    SetViewportExtEX(blatt.handle,dx,dy,nil); // Scalierung
    SetWindowExtEX(blatt.handle,druckbreite*10,-druckhoehe*10,nil);
    Setbkmode(blatt.handle,TRANSPARENT);
    blatt.Brush.Style := bssolid;
    blatt.Brush.Color := clwhite;
    blatt.Pen.Color := clblack;
    blatt.fillrect(bounds(0,0,druckbreite*10,-druckhoehe*10));
    end;
    procedure ausgabe(ziel : TCanvas);
    var i,l,n,x,y,breite,hoehe : integer;
    s : string;

    begin
    with ziel do begin
    font.Height:=50;
    font.Name := 'Arial';
    SetTextAlign(handle,TA_CENTER+TA_TOP);
    breite := druckbreite*10;
    hoehe := druckhoehe*10;
    moveto(0,1);LineTo(breite,1);
    i := 1;
    while i <= breite do begin
    MoveTo(i,-1);
    if (i-1) mod 100 = 0 then begin
    LineTo(i,-50);
    TextOut(i,-50,intToStr(i div 100));
    end else LineTo(i,-30);
    inc(i,10);
    end;
    SetTextAlign(handle,TA_LEFT+TA_TOP);
    n := 200;
    i := 0;
    x := druckbreite * 5;
    y := druckhoehe * 5;
    while i < 500 do begin
    Dec(n,5);
    DC_textout(ziel,x, -y, i, n, ' rotierender Text');
    Inc(i,15);
    end;
    end;
    end;
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
    printer.begindoc;
    SetMapMode(printer.canvas.handle,MM_LOMETRIC);
    ausgabe(printer.canvas);
    printer.enddoc
    end;
    procedure TForm1.SpeedButton2Click(Sender: TObject);
    begin
    printersetupdialog1.execute;
    blattanpass

    Comment


    • #3
      <pre>
      procedure TForm1.SpeedButton2Click(Sender: TObject);
      begin
      printersetupdialog1.execute;
      blattanpassen;
      ausgabe(blatt);
      end;

      procedure TForm1.FormResize(Sender: TObject);
      begin
      blattanpassen;
      ausgabe(blatt);
      end;

      procedure TForm1.FormCreate(Sender: TObject);
      begin
      panelx := TWincontrol.create(self);
      panelx.parent := Form1;
      blatt := TCanvas.Create;
      blatt.handle := GetDC(panelx.handle);
      setmapmode(blatt.handle,mm_anisotropic);
      end;

      procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
      begin
      releaseDC(handle, blatt.handle);
      end;

      procedure TForm1.FormPaint(Sender: TObject);
      begin
      blattanpassen;
      ausgabe(blatt);
      end;

      end.
      </pre>
      Quelle Kochbuch Borland Delphi 5<br&gt

      Comment


      • #4
        Andreas,

        herzlichen Dank!! Ich werde mich gleich mal dran machen...

        Grüße
        Ralp

        Comment

        Working...
        X