Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Memo Drucken (https://www.delphipraxis.net/197725-memo-drucken.html)

TarantelFaser47 30. Aug 2018 16:17

Memo Drucken
 
Hi,
ich versuche gerade mich in das Drucken einzuarbeiten und bin auf ein Problem gestoßen.
Code:
procedure TForm1.Button2Click(Sender: TObject);
var i,y : Integer;
begin


  Printer.BeginDoc;
  Printer.NewPage;

  for i := 0 to memo1.Lines.Count do
   begin
    inc(y,5);
    Printer.Canvas.TextOut(2,y,memo1.Lines[i]);
   end;

  Printer.EndDoc;
end;
Wie hier zu sehen ist, versuche ich alle Zeilen eines Memos genau so auszudrucken wie sie, sozusagen, auf dem Bildschirm zu sehen sind (also untereinander).
Es werden auch keine Fehlermeldungen angezeigt, aber auf dem Papier, welches dann aus dem Drucker kommt ist auch nichts drauf :|.
Ich komme leider nicht dahinter was daran falsch ist ...

Danke für jede Hilfe :-D

bcvs 30. Aug 2018 19:12

AW: Memo Drucken
 
Ist das der komplette Quellcode? Wenn ja, dann wird das y nicht initialisiert und da steht irgendetwas drin, nur nicht das, was du erwartest.

Außerdem ist ein inc(y, 5) etwas wenig für einen Zeilenvorschub auf einem Drucker.

Hobbycoder 30. Aug 2018 21:30

AW: Memo Drucken
 
Ich würde mal schätzen, deine Textausgabe liegt außerhalb des bedruckbaren Bereichs deines Druckers. Die meisten Drucker haben eine Rand, auf dem nichts gedrückt werden kann.
Ein Drucker hat eine wesentlich höhere Pixelauflösung (dpi) als z.b. Der Canvas einer Paintbox.
Und du solltest ,al ermitteln welchen Mindestrand dein Drucker hat (meist in mm angegeben) und den umrechnen in Inch und das dann mit der DPI deines Drcker multiplizieren.
Diese Werte addierst du dann auf die x bzw. y Angabe deine Canvas.textout Damit kannst du sicherstellen, dass die Ausgabe schon mal im druckbare Bereich liegt.

noisy_master 31. Aug 2018 06:37

AW: Memo Drucken
 
Hi,

wenn du es dir etwas einfacher machen möchtest gibt es bei Torry.net eine nette kleine Komponente namens TLinePrinter. Mit der bekommst du dein Anliegen ganz einfach umgesetzt

hoika 31. Aug 2018 06:45

AW: Memo Drucken
 
Hallo,
SetMapMode (https://www.delphipraxis.net/128708-...-funktion.html) richtig setzen.
Ohne das setzen, sind die y-Werte negativ, weil der 0,0-Punkt links oben ist.

KodeZwerg 31. Aug 2018 08:03

AW: Memo Drucken
 
Wie wäre es hiermit?
Delphi-Quellcode:
uses Printers;
Delphi-Quellcode:
procedure PrintStrings(Strings: TStrings);
var
  Prn: TextFile;
  i: word;
begin
  AssignPrn(Prn);
  try
    Rewrite(Prn);
    try
      for i := 0 to Strings.Count - 1 do
        writeln(Prn, Strings.Strings[i]);
    finally
      CloseFile(Prn);
    end;
  except
    on EInOutError do
      MessageDlg('Drucker nicht bereit.', mtError, [mbOk], 0);
  end;
end;
so in etwa Aufrufen:
Delphi-Quellcode:
  PrintStrings(Memo1.Lines);

Oder so:
Delphi-Quellcode:
// pack einen TPrintDialog und TButton auf Form
// hier wird Memo1 Font auch berücksichtigt, falls das eine Rolle spielt
procedure TForm1.Button1Click(Sender: TObject);
var
  MemoOutput: TextFile;
  I: LongInt;
begin
  If PrintDialog1.Execute then
   begin
     AssignPrn(MemoOutput); //assigns a text-file variable to the printer.
     try
       Rewrite(MemoOutput); //creates a new file and opens it
       try
         Printer.Canvas.Font := Memo1.Font; //Sets Font to Printer
         For I := 0 to Memo1.Lines.Count - 1 do
         WriteLn(MemoOutput, Memo1.Lines[I]); //puts it to the Printer Canvas
       finally
         CloseFile(MemoOutput); //terminates the association between file variable and an external disk file
       end;
     except
      on EInOutError do
       MessageDlg('Drucker nicht bereit.', mtError, [mbOk], 0);
     end;
   end;
end;
einen hab ich noch :)
Delphi-Quellcode:
procedure PrintMemo(const TheMemo: TMemo);
var
  MemoOutput: TextFile;
  I: LongInt;
begin
  If PrintDialog1.Execute then
   begin
     AssignPrn(MemoOutput); //assigns a text-file variable to the printer.
     try
       Rewrite(MemoOutput); //creates a new file and opens it
       try
         Printer.Canvas.Font := TheMemo.Font; //Sets Font to Printer
         For I := 0 to TheMemo.Lines.Count - 1 do
         WriteLn(MemoOutput, TheMemo.Lines[I]); //puts it to the Printer Canvas
       finally
         CloseFile(MemoOutput); //terminates the association between file variable and an external disk file
       end;
     except
      on EInOutError do
       MessageDlg('Drucker nicht bereit.', mtError, [mbOk], 0);
     end;
   end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz