Wie kann ich in Delphi einen Array von Records direkt auf einem Drucker ausgeben?

1 Antwort

uses Printers;
// ...
Printer.BeginDoc;  // Druck Starten
// ...
Printer.Canvas.Textout(10,10,"Textzeile1"); // Einzelne Zeilen malen, geht wie bei normalen Zeichenflächen auf dem Bildschirm
// ...
Printer.EndDoc. // Druck beenden

Du musst die Seite selbst "zeichnen" und dich auch um einen evtl. nötigen Zeilenumbruch selbst kümmern.

Ein (etwas unübersichtlicher, längerer) Code aus einem altem Programm (Achtung, das ist Delphi 1, evtl. heisst da jetzt einiges anders) von mir. Wird nicht laufen, weil ich einiges zwischendrin gelöscht habe. tf ist eine Textdatei, das wird noch mit dem alten readlin ausgelesen, was jeweils eine neue Zeile liefert. Da musst du dann deine Zeilen ergänzen. Spannend ist nur die Berechnung der Zeilenhöhe / Seitenhöhe und ggf. des Randes.

     w:=GetDeviceCaps(Printer.Handle,HORZRES);
     h:=GetDeviceCaps(Printer.Handle,VERTRES);
     Seite:=1;
         inc(Seite);
       end;
     Printer.Canvas.Font:=Font.Font;
     ppm:=h/GetDeviceCaps(Printer.Handle,VERTSIZE);
     Escape(Printer.Handle, GETPRINTINGOFFSET,0,nil,@POffset);
     Escape(Printer.Handle, GETPHYSPAGESIZE,0,nil,@PPage);
     RandL:=trunc(ppm*rl.value)-POffset.x;
     if RandL<0 then begin
       RandL:=0;
       LStat.Items.Add('Linker Rand korrigiert, minimum = '+IntToStr(1+trunc(POffset.x/ppm))+' mm.');LStat.Update;
       end;
     RandO:=trunc(ppm*ro.value)-POffset.y;
     if RandO<0 then begin
       RandO:=0;
       LStat.Items.Add('Oberer Rand korrigiert, minimum = '+IntToStr(1+trunc(POffset.y/ppm))+' mm.');LStat.Update;
       end;
     RandR:=(trunc(ppm*rr.value)-(PPage.x-w-POffset.x));
     if RandR<0 then begin
       RandR:=0;
       LStat.Items.Add('Rechter Rand korrigiert, minimum = '+IntToStr(1+trunc((PPage.x-w-POffset.x)/ppm))+' mm.');LStat.Update;
       end;
     RandU:=(trunc(ppm*ru.value)-(PPage.y-h-POffset.y));
     if RandU<0 then begin
       RandU:=0;
       LStat.Items.Add('Unterer Rand korrigiert, minimum = '+IntToStr(1+trunc((PPage.y-h-POffset.y)/ppm))+' mm.');LStat.Update;
       end;
//...
Printer.Canvas.Font.Size:=Printer.Canvas.Font.Size+1;Printer.Canvas.Font.Size:=Printer.Canvas.Font.Size-1;
          AnzSp:=1;
            SpBreite:=(w-(RandL+RandR)-trunc(ppm*(anzsp-1)*sa.value)) div AnzSp;
     ZeilH:=Printer.canvas.TextHeight('MÜjg;#')+2;
     h:=h-(RandO+RandU)-ZeilH*2;
     AnzZ:=h div ZeilH;
     LStat.Items.Add('Seite '+IntToStr(Seite)+' wird erstellt.');
     Application.ProcessMessages;
     AktSp:=1;AktZ:=1;xx:=0;
     split:=TStringList.Create();
     system.reset(tf);
     repeat
         if (split.count>0) then begin
           zeile:=split[0];
           split.delete(0);
           end else begin
           readln(tf,zeile);
           do_spaces(zeile);
           end;
       s:='';
       if AbortPrint then begin
         with Printer do Abort;
         goto AbortLabel;
         end;
       while printer.canvas.TextWidth(zeile)>SpBreite do begin
         s:=copy(zeile,length(zeile),1)+s;
         zeile:=copy(zeile,1,length(zeile)-1);
         end;
       if s<>'' then begin
         split.append(s);
         inc(xx);
         end;
       Printer.Canvas.TextOut(RandL+(AktSp-1)*SpBreite+trunc(ppm*(AktSp-1)*sa.value),
                              (AktZ-1)*ZeilH+RandO,zeile);
       inc(AktZ);
       if AktZ>AnzZ then begin AktZ:=1;inc(AktSp);end;
       if (AktSp>AnzSp) or (system.eof(tf) and (split.count=0)) then begin
         st:='';
//...
         LStat.Items.Add('Seite '+IntToStr(Seite)+' wird an den Drucker übertragen.');
         LStat.ItemIndex:=LStat.Items.Count-1;LStat.Update;
         if (i<(Gewaehlt.items.count-1)) or not((system.eof(tf) and (split.count=0)))  then Printer.NewPage;
         inc(Seite);
         if (not system.eof(tf)) or (split.count>0)  then LStat.Items.Add('Seite '+IntToStr(Seite)+' wird erstellt.');
         LStat.ItemIndex:=LStat.Items.Count-1;LStat.Update;
         AktSp:=1;
         end;
   until (system.Eof(tf) and (split.count=0));
   split.free;
   system.Close(tf);
   end;
   LStat.Items.Add('Druckauftrag wird beendet.');
   Application.ProcessMessages;
   LStat.ItemIndex:=LStat.Items.Count-1;LStat.Update;
   Printer.EndDoc;


Woher ich das weiß:Berufserfahrung – Softwareentwickler & Admin