- 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

 

Skriv ut en RTF-fil och definiera utskriftsområde Kategori: Skrivare
Inlagt: 2004-11-06
Läst: 1518
Inlagt av: Staffan Berg
Beskrivning
Lite avancerat exempel som demonstrerar hur du skriver ut innehållet i en RTF-fil. Du anger utskriftsutseende och utskriftsområde själv genom att ställa in marginler, sidstorlek, textområde m m. 
Kod
unit Unit1; 
 
interface 
 
uses 
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
 Dialogs, StdCtrls, RichEdit, RxRichEd, ExtCtrls, Printers; 
 
type 
 TPageOffset = record 
  mStart, 
  mEnd: Integer; 
  rendRect: TRect; 
 end; 
 TForm1 = class(TForm) 
  Panel1: TPanel; 
  Editor: TRxRichEdit; 
  PrintBtn: TButton; 
  PreviewBtn: TButton; 
  CloseBtn: TButton; 
  procedure PrintBtnClick(Sender: TObject); 
  procedure PreviewBtnClick(Sender: TObject); 
  procedure CloseBtnClick(Sender: TObject); 
  procedure FormShow(Sender: TObject); 
 private 
  { Private-Deklarationen } 
 public 
  { Public-Deklarationen } 
 end; 
 
var 
 Form1: TForm1; 
 
implementation 
 
uses Unit2; 
 
{$R *.dfm} 
 
procedure TForm1.PrintBtnClick(Sender: TObject); 
var  
 wPage, hPage, xPPI, yPPI, wTwips, hTwips: integer; 
 pageRect, rendRect: TRect; 
 po: TPageOffset; 
 fr: TFormatRange; 
 lastOffset, currPage, pageCount: integer; 
 xOffset, yOffset: integer; 
 FPageOffsets: array of TPageOffset; 
 TextLenEx: TGetTextLengthEx; 
 firstPage: boolean; 
begin 
 //First, get the size of a printed page in printer device units 
 wPage := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH); 
 hPage := GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT); 
 //Next, get the device units per inch for the printer 
 xPPI := GetDeviceCaps(Printer.Handle, LOGPIXELSX); 
 yPPI := GetDeviceCaps(Printer.Handle, LOGPIXELSY); 
 //Convert the page size from device units to twips 
 wTwips := MulDiv(wPage, 1440, xPPI); 
 hTwips := MulDiv(hPage, 1440, yPPI); 
 //Save the page size in twips 
 with pageRect do  
 begin 
  Left := 0; 
  Top := 0; 
  Right := wTwips; 
  Bottom := hTwips 
 end; 
 //Next, calculate the size of the rendering rectangle in twips 
 //Rememeber - two inch margins are hardcoded, so the below code 
 //reduces the width of the output by four inches 
 with rendRect do  
 begin 
  Left := 0; 
  Top := 0; 
  Right := pageRect.Right - (1440 * 4); 
  Bottom := pageRect.Bottom - (1440 * 4) 
 end; 
 //Define a single page and set starting offset to zero 
 po.mStart := 0; 
 //Define and initialize a TFormatRange structure. This structure is passed 
 //to the TRichEdit with a request to format as much text as will fit on a 
 //page starting with the chrg.cpMin offset and ending with the chrg.cpMax. 
 //Initially, we tell the RichEdit control to start at the beginning 
 //(cpMin = 0) and print as much as possible (cpMax = -1). We also tell it 
 //to render to the printer 
 with fr do  
 begin 
  hdc := Printer.Handle; 
  hdcTarget := Printer.Handle; 
  chrg.cpMin := po.mStart; 
  chrg.cpMax := -1; 
 end; 
 //In order to recognize when the last page is rendered, we need to know how 
 //much text is in the control. 
 if RichEditVersion >= 2 then  
 begin 
  with TextLenEx do  
  begin 
   flags := GTL_DEFAULT; 
   codepage := CP_ACP; 
  end; 
  lastOffset := SendMessage(Editor.Handle, EM_GETTEXTLENGTHEX, wParam(@TextLenEx), 0) 
 end 
 else  
  lastOffset := SendMessage(Editor.Handle, WM_GETTEXTLENGTH, 0, 0); 
 //As a precaution, clear the formatting buffer 
 SendMessage(Editor.Handle, EM_FORMATRANGE, 0, 0); 
 //Printers frequently cannot print at the absolute top-left position on the 
 //page. In other words, there is usually a minimum margin on each edge of the 
 //page. When rendering to the printer, RichEdit controls adjust the top-left 
 //corner of the rendering rectangle for the amount of the page that is 
 //unprintable. Since we are printing with two-inch margins, we are presumably 
 //already within the printable portion of the physical page. 
 SaveDC(fr.hdc); 
 SetMapMode(fr.hdc, MM_TEXT); 
 xOffset := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX); 
 yOffset := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY); 
 xOffset := xOffset + MulDiv(1440 + 1440, xPPI, 1440); 
 yOffset := yOffset + MulDiv(1440 + 1440, yPPI, 1440); 
 SetViewportOrgEx(fr.hdc, xOffset, yOffset, nil); 
 //Now we build a table of page entries, one entry for each page that would be 
 //printed. 
 while ((fr.chrg.cpMin <> -1) and (fr.chrg.cpMin < lastOffset)) do  
 begin 
  fr.rc := rendRect; 
  fr.rcPage := pageRect; 
  po.mStart := fr.chrg.cpMin; 
  fr.chrg.cpMin := SendMessage(Editor.Handle, EM_FORMATRANGE, 0, Longint(@fr)); 
  po.mEnd := fr.chrg.cpMin - 1; 
  po.rendRect := fr.rc; 
  if High(FPageOffsets) = -1 then SetLength(FPageOffsets, 1) 
  else  
   SetLength(FPageOffsets, Length(FPageOffsets) + 1); 
  FPageOffsets[High(FPageOffsets)] := po 
 end; 
 pageCount := Length(FPageOffsets); 
 ShowMessage(Format('Es wurde %d Seiten ermittelt', [pageCount])); 
 SendMessage(Editor.Handle, EM_FORMATRANGE, 0, 0); 
 RestoreDC(fr.hdc, - 1); 
 //Now, we are almost ready to actually print. 
 Printer.BeginDoc; 
 fr.hdc := Printer.Handle; 
 fr.hdcTarget := Printer.Handle; 
 SaveDC(fr.hdc); 
 SetViewportOrgEx(fr.hdc, xOffset, yOffset, nil); 
 //Ok, here we go to print 
 firstPage := True; 
 //At this point you can select from page and to page 
 currPage := 0; //Print from the first page 
 pageCount := 1; //Only One page for testing 
 while (currPage < pageCount) do  
 begin 
  if firstPage then firstPage := False 
  else  
   Printer.NewPage; 
  SetViewportOrgEx(fr.hdc, xOffset, yOffset, nil); 
  fr.rc := FPageOffsets[currPage].rendRect; 
  fr.rcPage := pageRect; 
  fr.chrg.cpMin := FPageOffsets[currPage].mStart; 
  fr.chrg.cpMax := FPageOffsets[currPage].mEnd; 
  fr.chrg.cpMin := SendMessage(Editor.Handle, EM_FORMATRANGE, 1, Longint(@fr)); 
  Inc(currPage); 
 end; 
 //At this point, we have finished rendering the contents of the RichEdit 
 //control. Now we restore the printer's HDC settings and tell Windows that 
 //we are through printing this document 
 RestoreDC(fr.hdc, - 1); 
 Printer.EndDoc; 
 //Finally, we clear the RichEdit control's formatting buffer and delete 
 //the saved page table information 
 fr.chrg.cpMin := SendMessage(Editor.Handle, EM_FORMATRANGE, 0, 0); 
 Finalize(FPageOffsets); 
 //That's it 
end; 
 
procedure TForm1.PreviewBtnClick(Sender: TObject); 
begin 
 PreviewForm.ShowModal 
end; 
 
procedure TForm1.CloseBtnClick(Sender: TObject); 
begin 
 Close 
end; 
 
procedure TForm1.FormShow(Sender: TObject); 
begin 
 Editor.Lines.LoadFromFile('Exceltabelle.rtf'); 
end; 
 
end. 

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