Wie kann ich in Delphi einen Array von Records direkt auf einem Drucker ausgeben?
Z. B. einen mit Adressen.
1 Antwort
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
Computer
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