NewPage;
Canvas.DrawRect(..., WordWrap);
procedure TMainForm.PrintFooter(var R: TRect; LineHeight: Integer);
var
S : String;
begin
with Printer do begin
{ utwórz łańcuch zawierający numer strony }
S := Format('Page %d', [PageNumber]);
{ ustal współrzędne prostokąta, którym wyświetlany będzie łańcuch }
{ zawierający numer strony }
R.Top := PageHeight - (lineHeight * 2);
R.Bottom := R.Top + lineHeight;
{ wyświetl centrycznie łańcuch zawierający numer strony }
DrawText(Handle, PChar(S), -1, R, DT_CENTER);
{ podkreśl tekst zawierający numer strony }
Canvas.MoveTo(0, R.Top - 2);
Canvas.LineTo(R.Right, R.Top - 2);
end;
end;
procedure TMainForm.FilePrintClick(Sender: TObject);
var
I : Integer;
LineHeight : Integer;
LinesPerPage : Integer;
LineCount : Integer;
R : TRect;
S : string;
begin
{ wyświetl dialog drukowania }
if PrintDialog.Execute then begin
{ ustal tytuł drukowanego obiektu }
Printer.Title := 'Scratch - ' + OpenDialog.FileName;
{ ustaw czcionkę drukarkową zgodnie z czcionką Memo }
Printer.Canvas.Font := Memo.Font;
{ Oblicz wysokość linii - na podstawie rozmiaru czcionki }
{ i rozdzielczości drukarki. Dodaj 40% na odstęp między liniami }
LineHeight := Abs(
MulDiv(Printer.Canvas.Font.Size,
GetDeviceCaps(Printer.Handle, LOGPIXELSY), 72));
Inc(LineHeight, (LineHeight * 4) div 10);
{ oblicz, ile linii zmieści się na stronie; uwzględnij }
{ trójliniowy margines }
LinesPerPage := (Printer.PageHeight div lineHeight) - 4;
{ rozpocznij drukowanie w 4. linii, by zostawić miejsce }
{ na nagłówek }
LineCount := 4;
{ wydrukuj nagłówek }
Printer.BeginDoc;
R.Top := LineHeight;
R.Left := 20;
R.Right := Printer.PageWidth;
R.Bottom := LineHeight * 2;
DrawText(Printer.Handle,
PChar(OpenDialog.FileName), -1, R, DT_CENTER);
{ drukowanie poszczególnych linii }
for I := 0 to Pred(Memo.Lines.Count) do
begin
{ po dojściu do końca strony zresetuj licznik linii }
{ i przejdź do nowej strony }
Inc(LineCount);
if LineCount = LinesPerPage then begin
PrintFooter(R, LineHeight);
LineCount := 4;
Printer.NewPage;
end;
{ pobierz kolejną linię Memo }
S := Memo.Lines.Strings[I];
Printer.Canvas.TextOut(0, LineCount * LineHeight, S);
end;
{ zakończ drukowanie }
PrintFooter(R, LineHeight);
Printer.EndDoc;
end;
end;
function TPrintPreview.CalculateViewSize(const Space: TPoint): TPoint;
begin
with FPaperView do
case FZoomState of
zsZoomOther:
begin
Result.X := ActualWidth(MulDiv(FPixels.X, FZoom*Screen.PixelsPerInch,GetDeviceCaps(Printer.Handle, LOGPIXELSX) * 100));{ActualWidth(MulDiv(FPixels.X, FZoom, 100));}
Result.Y := ActualWidth(MulDiv(FPixels.Y, FZoom*Screen.PixelsPerInch,GetDeviceCaps(Printer.Handle, LOGPIXELSY) * 100));{ActualHeight(MulDiv(FPixels.Y, FZoom, 100));}
end;
zsZoomToWidth:
begin
Result.X := Space.X;
Result.Y := ActualHeight(MulDiv(ActualWidth(Result.X), FPixels.Y, FPixels.X));
end;
zsZoomToHeight:
begin
Result.Y := Space.Y;
Result.X := ActualWidth(MulDiv(ActualHeight(Result.Y), FPixels.X, FPixels.Y));
end;
zsZoomToFit:
begin
if (FPixels.Y / FPixels.X) < (Space.Y / Space.X) then
begin
Result.X := Space.X;
Result.Y := ActualHeight(MulDiv(ActualWidth(Result.X), FPixels.Y, FPixels.X));
end
else
begin
Result.Y := Space.Y;
Result.X := ActualWidth(MulDiv(ActualHeight(Result.Y), FPixels.X, FPixels.Y));
end;
end;
end;
end;
Result.X := ActualWidth(MulDiv(FPixels.X, FZoom*Screen.PixelsPerInch,GetDeviceCaps(Printer.Handle, LOGPIXELSX) * 100));{ActualWidth(MulDiv(FPixels.X, FZoom, 100));<-orginal}
Result.Y := ActualWidth(MulDiv(FPixels.Y, FZoom*Screen.PixelsPerInch,GetDeviceCaps(Printer.Handle, LOGPIXELSY) * 100));{ActualHeight(MulDiv(FPixels.Y, FZoom, 100));<-orginal}
Return to DELPHI AREA Projects
Users browsing this forum: No registered users and 44 guests