Komponente zum Drucken

Rund um die LCL und andere Komponenten
Antworten
braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Komponente zum Drucken

Beitrag von braunbär »

Gibt es eigentlich eine Komponente (oder dergleichen), mit HIlfe derer man ohne großen Aufwand einen Text drucken kann - ohne explizit auf einen Canvas zu zeichnen? Ich meine auf die Art wie in Turbopascal, wo man einfach ein write statement machen konnte?
Ich habe jetzt eine Weile gesucht, aber nichts vergleichbares gefunden.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Komponente zum Drucken

Beitrag von Socke »

braunbär hat geschrieben:
Di 10. Nov 2020, 20:43
Gibt es eigentlich eine Komponente (oder dergleichen), mit HIlfe derer man ohne großen Aufwand einen Text drucken kann - ohne explizit auf einen Canvas zu zeichnen? Ich meine auf die Art wie in Turbopascal, wo man einfach ein write statement machen konnte?
Ich habe jetzt eine Weile gesucht, aber nichts vergleichbares gefunden.
Wenn dein Drucker das unterstützt, kannst du ihn immer noch über die Datei LPT (Windows) bzw. /dev/lp0 (Linux) ansprechen.
Das liegt weniger an Free Pascal/Lazarus denn am Drucker bzw. die Konfiguration im Betriebssystem.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Komponente zum Drucken

Beitrag von braunbär »

Hmmm
Inzwischen gibt es leider etliche Drucker, die das nicht mehr können und nur über einen Treiber angesprochen werden können.
Ich werde mir dann wohl so eine Komponente selbst basteln müssen.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Komponente zum Drucken

Beitrag von Winni »

Hallo!

Nun mal nicht so eilig und gleich ne Komponente bauen.

In Linux hat man alles an Bord oder griffbereit:

Mit gnu enscript konvertiert man nackten Text in PostScript.
Dann kann der PostScript file an die entsprechend Drucker-Queue von CUPS
schicken mit "lp". Wenn die Kollegen nicht allzu viel drucken, kommt das
dann zeitnah aus dem Drucker. Das mach ich mit allen wichtigen
Server-Fehlermeldungen so. Automatisch.

Für Windows fehlt hier das Tool zum automatischen Umwandeln von Text in PostScript bzw. PDF (????)
Wenn Du irgenwie eine PDF aus dem Text erstellt hast, bist Du fein raus:
Die meisten modernen Drucker - wenn das nicht die allerbilligsten sind - können
PDF-Dateien als Input ab und konvertieren den automatisch in ihre interne Befehlssprache. .
Also einfach die PDF zum Druckertreiber jagen.

Hier ist die Heimseite von enscript: https://www.gnu.org/software/enscript/enscript.html

Winni

PS.: Was da alles so in der Windows-Welt passiert .......
gnu enscript giibt es nun auch für Windows:

http://gnuwin32.sourceforge.net/packages/nenscript.htm

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Komponente zum Drucken

Beitrag von braunbär »

Danke!
Ich werde mal schauen, ob das für alle meine Kunden passt.
Ich weiß nicht, ob wirklich schon die meisten Drucker mit einem Postscript Output was anfangen können. Ich bin in der Windows Welt zu Hause, und vor nicht so langer Zeit gabs da noch ziemlich viele (günstige) Drucker, die überhaupt nur mit einem eigenen Windows Treiber gedruckt haben. Die können nicht einmal einen normalen ASCII Text direkt ausdrucken.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Komponente zum Drucken

Beitrag von wp_xyz »

In LazStats (https://sourceforge.net/p/lazarus-ccr/s ... /lazstats/) gibt es ein einfache Druck-Routine, die mit kleinen Änderungen auch allgemein verwendbar ist. Aber Achtung: die Routine druckt die Zeilen einer StringListe aus und macht keinen eigenen Zeilenumbruch.

Code: Alles auswählen

uses
  Printers, OSPrinters;

const
  LEFT_MARGIN = 20;   // mm
  RIGHT_MARGIN = 20;
  TOP_MARGIN = 15;
  BOTTOM_MARGIN = 20;
  INCH = 25.4;   // 1" in mm

var
  FPrintY: Integer;

procedure PrintText(ALines: TStrings; AFontName: String = ''; AFontSize: Integer = 0);
var
  i: Integer;
  x: Integer;
  xmax, ymax: Integer;
  pageNo: Integer;
  oldFontSize: Integer;
  h: Integer;
  leftMM, rightMM, topMM, bottomMM: Integer;
begin
  with Printer do
  begin
    leftMM := round(LEFT_MARGIN/INCH*XDPI);
    rightMM := round(RIGHT_MARGIN/INCH*XDPI);
    topMM := round(TOP_MARGIN/INCH*YDPI);
    bottomMM := round(BOTTOM_MARGIN/INCH*YDPI);
    x := leftMM;
    FPrintY := topMM;
    xMax := PaperSize.Width - rightMM;
    yMax := PaperSize.Height - bottomMM;
    pageNo := 1;
    try
      Canvas.Brush.Style := bsClear;  // no text background color
      if AFontName = '' then
        Canvas.Font.Name := 'Courier New'
      else
        Canvas.Font.Name := AFontName;
      if AFontSize = 0 then
        Canvas.Font.Size := 10
      else
        Canvas.Font.Size := AFontSize;
      oldFontSize := Canvas.Font.Size;
      for i:=0 to ALines.Count-1 do begin
        // Print page number
        if FPrintY = topMM then begin
          Canvas.Font.Size := 10;
          h := Canvas.TextHeight('Page 9') + 4;
          Canvas.TextOut(x+1, FPrintY, 'Page ' + IntToStr(PageNo));
          Canvas.Pen.Width := 3;
          Canvas.Line(leftMM, FPrintY+h, xmax, FPrintY+h);
          inc(FPrintY, 2*h);
          Canvas.Font.Size := oldFontSize;
        end;
        Canvas.TextOut(x, FPrintY, ALines[i]);
        inc(FPrintY, Canvas.TextHeight('Tg'));
        if FPrintY > yMax then begin
          NewPage;
          FPrintY := topMM;
          inc(PageNo);
        end;
      end;
    except
      on E: EPrinter do ShowMessage('Printer Error: ' +  E.Message);
      on E: Exception do ShowMessage('Unexpected error when printing.');
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
    try
      PrintText(Memo1.Lines, 'Arial', 12);
    finally
      Printer.EndDoc;
    end;
  end;
end;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Komponente zum Drucken

Beitrag von pluto »

Ich weiß zwar nicht genau was du vorhast, aber schau dir mal RichMemo an. Da gibt es ein Beispiel zum Thema drucken.
Die Windows Version von RichMemo kann deutlich mehr, als die Linux Variante(wie das immer so ist).....
Könntest Glück haben, dass das Brauchbare Ergebnisse erzielt.

Dann gibt es (meine ich) auch beim HTML Panel Möglichkeiten Seiten zu drucken.
Es gab oder gibt doch noch immer das Drucker Dialog.

Vielleicht gibt es bei den diversen HTML Ausgabe Komponenten eine druck Möglichkeit.

Das einfachste für den Notfall: Eine HTML Datei erstellen und über den Default Web Browser drucken.
MFG
Michael Springwald

Antworten