- Delphiartiklar, tips, forum, länksamling - 

      

START | DELPHI | LÄNKARGÄSTBOK 




 Forum

Grundkurs
  »Introduktion
  »Snabbguide
  »Komponenter
  »Händelser
  »Strängar
  »Räkna med Delphi   »Egna typer
  »Selektion
  »Iteration
  »Menyer
  »Funktioner
  »Arraystrukturer

Tips & Tricks
  »Nya tips
  »Blandat
  »Databaser
  »Filer
  »Forms
  »Grafik
  »Internet
  »Komponenter
  »Matematik
  »Multimedia
  »Objekt/ActiveX
  »Skrivare
  »Strängar
  »System
  »Mest lästa tips

Artiklar
  »Delphi och ADO
  »Bygga en DLL
  »Skapa en enkel rapport
  »Hantera registret
  »Enheter, units
  »Klassen TCanvas
  »Använd LookUp Controls

 Nya tips
 Lägg till tips
 Delphilänkar
 Gästbok

 

Printertricks Kategori: Skrivare
Inlagt: 2003-11-03
Läst: 1708
Inlagt av: Staffan Berg
Beskrivning
Här presenteras diverse tricks och inställningar för din skrivare. Denna kod hjälper dig bland annat med att ange pappershöjd och bredd, textjustering, sidbrytningar m m. Studera koden och du får en aha-upplevelse. 
Kod
const INCHES_PER_MILIMETER : Real = 0.04; 
 
type 
 TOffset =  record 
        X,Y: Integer; 
       end; 
 
var FDeviceName : String; {Get the name} 
  FPageHeightPixel, FPageWidthPixel : Integer ; {Page height and Page Width} 
  FOrientation : TPrinterOrientation; {Orientation} 
  FPrintOffsetPixels : TOffset; 
  FPixelsPerMMX,FPixelsPerMMY: Real; 
  MMSize, FPageHeightMM : Integer; 
  TheReport, TheHead, HeadLine, RecordLine, TFname, TLname :String; 
 
procedure TMissing_Rep.GetDeviceSettings; 
 
var 
 retval: integer; 
 PixX, PixY: Integer; 
 
begin 
  FDeviceName := Printer.Printers[Printer.PrinterIndex]; {Get the name} 
  FPageHeightPixel := Printer.PageHeight;         {Page height} 
  FPageWidthPixel := Printer.PageWidth;          {Page Width} 
  FOrientation := Printer.Orientation; 
{Orientation} 
  {Get the printable area offsets} 
  {$IFDEF WIN32} 
    FPrintOffsetPixels.X := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX); 
    FPrintOffsetPixels.Y := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY); 
  {$ELSE} 
    retval := Escape(Printer.Handle,GETPRINTINGOFFSET, 
            0, nil, @FPrintOffsetPixels); 
  {$ENDIF} 
  {Get Pixels per Milimeter Ratio} 
  PixX := GetDeviceCaps(Printer.Handle, LOGPIXELSX); 
  PixY := GetDeviceCaps(Printer.Handle, LOGPIXELSY); 
  FPixelsPerMMX := INCHES_PER_MILIMETER * PixX; 
  FPixelsPerMMY := INCHES_PER_MILIMETER * PixY; 
  FPageHeightMM := Round(FPageHeightPixel/FPixelsPerMMY); 
end; 
 
function TMissing_Rep.PutText(mmX,mmY: Integer; S: string ; LeftAlign: 
Boolean): boolean; 
var 
 X, Y: Integer; 
 align: WORD; 
begin 
 if LeftAlign then 
  align := SetTextAlign(Printer.Handle,TA_BOTTOM or TA_LEFT) 
 else 
  align := SetTextAlign(Printer.Handle,TA_BOTTOM or TA_RIGHT); 
 result := FALSE; {Assume fail} 
 X := Trunc(mmX * FPixelsPerMMX) - FPrintOffsetPixels.X; 
 Y := Trunc(mmY * FPixelsPerMMY) - FPrintOffsetPixels.Y; 
 if X < 0 then exit; 
 if Y < 0 then exit; 
 Printer.Canvas.TextOut(X,Y,S); 
 result := TRUE; 
end; 
 
procedure TMissing_Rep.Print_ButClick(Sender: TObject); 
 
var PixelSize: Integer; 
 
begin 
Print_But.Enabled := False; 
if PrintDialog1.Execute then 
begin 
Printer.Canvas.Font := Missing_Rep.Font; 
PixelSize := Printer.Canvas.TextHeight('Yy'); 
MMSize := Round(PixelSize/FPixelsPerMMY); 
Printer.Title := 'Breast Cancer Project Missing Report'; 
Printer.BeginDoc;            { begin to send print job to printer } 
PrintGenerator; 
Printer.EndDoc;         { EndDoc ends and starts printing print job } 
end; 
Print_But.Enabled := True; 
end; 
 
procedure TMissing_Rep.PrintGenerator; 
 
Var 
 yLoc , NumRows, TheRow :Integer; 
 
 procedure Heading; 
 begin 
  yLoc := 20; 
  PutText(20, 20, TheHead, TRUE); 
  yLoc := yLoc + MMSize; 
  PutText(20, yLoc, StringGrid1.Cells[0,0], TRUE); 
  PutText(60, yLoc, StringGrid1.Cells[1,0], TRUE); 
  PutText(100, yLoc, StringGrid1.Cells[2,0], TRUE); 
  PutText(120, yLoc, StringGrid1.Cells[3,0], TRUE); 
  PutText(150, yLoc, StringGrid1.Cells[4,0], TRUE); 
  yLoc := yLoc + MMSize; 
end; 
 
 procedure Footer; 
 begin 
 PutText(100,FPageHeightMM,InttoStr(Printer.PageNumber), TRUE); 
 end; 
 
begin 
  Heading; 
  TheRow := 1; 
  while (TheRow < StringGrid1.RowCount) do 
  begin 
    if (yLoc > (FPageHeightMM - MMSize)) then 
  begin 
 Footer; 
 Printer.NewPage; 
 Heading; 
    end; 
TheGauge.Progress := Round(100 * TheRow/(StringGrid1.RowCount - 1)); 
PutText(20, yLoc, StringGrid1.Cells[0,TheRow], TRUE); 
PutText(60, yLoc, StringGrid1.Cells[1,TheRow], TRUE); 
PutText(100, yLoc, StringGrid1.Cells[2,TheRow], TRUE); 
PutText(120, yLoc, StringGrid1.Cells[3,TheRow], TRUE); 
PutText(150, yLoc, StringGrid1.Cells[4,TheRow], TRUE); 
yLoc := yLoc + MMSize; 
TheRow := TheRow + 1; 
end; 
Footer; 
end; 
 

 
 
© Copyright 2005 - Staffan Berg
- Alla rättigheter förbehålles -