• 0
Euvene

Работа с Printer->Canvas

Вопросы

Добрый день. Возникла такая проблема, нужно распечатать обычную таблицу, но при печати получается все очень мелкое, может кто подскажет как это исправить...

вот код:

TRectF SrcRect, DestRect;
	int h = 40, w = 60, x0 = 50, y0 = 150, x, y;
	TPrinter *Printer = Fmx::Printer::Printer();

	Printer->ActivePrinter->SelectDPI(1200, 1200);

	Printer->Canvas->Fill->Color = claBlack;
	Printer->Canvas->Fill->Kind = TBrushKind(1);
	Printer->Canvas->Stroke->Kind = TBrushKind::Solid;
	Printer->Canvas->Stroke->Color = claBlack;

	Printer->BeginDoc();
	DestRect.SetHeight(h);
	DestRect.SetWidth(w);

	for (int i = 0; i < StringGrid1->RowCount; i++)
	{
		x = x0;
		for (int j = 0; j < StringGrid1->ColumnCount; j++)
		{
			DestRect.SetLocation(x, y0);
			Printer->Canvas->Font->Size = 14;
			// Printer->Canvas->DrawRect(DestRect, 0, 0, AllCorners, 1);
			// Printer->Canvas->Font->SetSettings(StringGrid1->TextSettings->Font->Family,StringGrid1->TextSettings->Font->Size,StringGrid1->TextSettings->Font->StyleExt);
			Printer->Canvas->FillText(DestRect, StringGrid1->Cells[j][i], false,
				100, TFillTextFlags(), TTextAlign::Center, TTextAlign::Center);
			x += w;

		}
		y0 += h;

	}

	Printer->EndDoc();

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 ответ на этот вопрос

  • 0
В 05.04.2017 в 11:46, Euvene сказал:

Printer->ActivePrinter->SelectDPI(1200, 1200);

Конечно будет очень мелкое, ведь Вы устанавливаете 1200 точек на дюйм и ширина листа А4 в портретном режиме у Вас получается чуть меньше 100000 точек. Исходя из этого просто задайте адекватные значения для h, w, x0, y0, x, y и все у Вас будет в порядке.

Например, для печати битмапки, я ипользую такой код:

var
  bmp: TBitmap;
  SrcRect, DestRect: TRectF;
  DPI: TPoint;
  cx, cy: Extended;
begin
    Printer.ActivePrinter.SelectDPI(1200, 1200);
    DPI := Printer.ActivePrinter.DPI[Printer.ActivePrinter.ActiveDPIIndex];
    {$IFDEF MSWINDOWS}
    cx := DPI.X / GetDeviceCaps(GetDC(GetDesktopWindow), LOGPIXELSX);
    cy := DPI.Y / GetDeviceCaps(GetDC(GetDesktopWindow), LOGPIXELSY);
    {$ENDIF}

    bmp := TBitmap.Create(0, 0);
    try
      FEditor.GetAsBitmap(bmp);

      SrcRect := TRectF.Create(0, 0, bmp.Width * cx, bmp.Height * cy);
      DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);

      if SrcRect.Width / SrcRect.Height > DestRect.Width / DestRect.Height then
        Printer.Orientation := TPrinterOrientation.poLandscape
      else
        Printer.Orientation := TPrinterOrientation.poPortrait;

      if (SrcRect.Width < DestRect.Width) and (SrcRect.Height < DestRect.Height) then
      begin
        DestRect.Left := (DestRect.Width - SrcRect.Width) / 2;
        DestRect.Width := SrcRect.Width;
        DestRect.Top := (DestRect.Height - SrcRect.Height) / 2;
        DestRect.Height := SrcRect.Height;
      end
      else
      begin
        SrcRect.Fit(DestRect);
        DestRect := SrcRect;
      end;

      Printer.BeginDoc;
      try
        Printer.Canvas.DrawBitmap(bmp, TRectF.Create(0, 0, bmp.Width, bmp.Height), DestRect, 1);
      finally
        Printer.EndDoc;
      end;
    except
      Printer.Abort;
    end;
    FreeAndNil(bmp);
end;

 

Изменено пользователем dnekrasov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу