Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  125

•  TDictionary Custom Sort  3 312

•  Fast Watermark Sources  3 062

•  3D Designer  4 818

•  Sik Screen Capture  3 314

•  Patch Maker  3 528

•  Айболит (remote control)  3 628

•  ListBox Drag & Drop  2 992

•  Доска для игры Реверси  81 537

•  Графические эффекты  3 922

•  Рисование по маске  3 227

•  Перетаскивание изображений  2 608

•  Canvas Drawing  2 732

•  Рисование Луны  2 556

•  Поворот изображения  2 163

•  Рисование стержней  2 160

•  Paint on Shape  1 564

•  Генератор кроссвордов  2 223

•  Головоломка Paletto  1 764

•  Теорема Монжа об окружностях  2 209

•  Пазл Numbrix  1 682

•  Заборы и коммивояжеры  2 052

•  Игра HIP  1 278

•  Игра Go (Го)  1 224

•  Симулятор лифта  1 470

•  Программа укладки плитки  1 214

•  Генератор лабиринта  1 542

•  Проверка числового ввода  1 351

•  HEX View  1 489

•  Физический маятник  1 355

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Хитрости печати



Все просто. Если знать как. Приведу небольшой код, позволяющий стать гуру в области печати. Надеюсь. Смотрите на комментарии. Все очень просто.


const
  INCHES_PER_MILIMETER: Real = 0.04;

type
  TOffset = record
    X, Y: Integer;
  end;

var
  FDeviceName: string; {Имя устройства}

  FPageHeightPixel, FPageWidthPixel: Integer; {Высота и ширина страницы}
  FOrientation: TPrinterOrientation; {Ориентация}
  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]; {Получаем имя}
  FPageHeightPixel := Printer.PageHeight; {Получаем высоту страницы}
  FPageWidthPixel := Printer.PageWidth; {Получаем ширину страницы}
  FOrientation := Printer.Orientation;
  {Ориентация}

  {Получаем отступ при печати (поля страницы)}
{$IFDEF WIN32}
  FPrintOffsetPixels.X := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
  FPrintOffsetPixels.Y := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
{$ELSE}
  retval := Escape(Printer.Handle, GETPRINTINGOFFSET,
    0, nil, @FPrintOffsetPixels);
{$ENDIF}
  {Получаем количество пикселей, печатаемое на миллиметре бумаги}
  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; {Вначале присваиваем флаг неудачи при выполнении функции}
  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 := 'Отчет';
    Printer.BeginDoc; { начинаем пересылать задание на печать }
    PrintGenerator;
    Printer.EndDoc; { EndDoc заканчивает задание печати }
  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 © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте