![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Добрый день. 
		
	
		
		
		
		
		
		
			Вопрос: Как сохранить Printer.canvas в переменную/файл? Что-то вроде этого Код: 
	begin
// задание настроек принтера-размер бумаги, ориентация, коллаж, дуплекс и т.п. 
Printer.BeginDoc;
// задание некоторых свойств Printer.Canvas.Font
 
Printer.canvas.Textout(5,5,'бла бла бла');
// Вот здесь нужно выдернуть содержимое Printer.canvas и сохранить ее в какую-нибуть переменную, например, типизированную как TBitmap.
// с размерами переменной вопросов не возникает, не могу именно импортировать изображение. 
Помогите в какую сторону копать, читал  про метафайлы и ТП, может в сторону GDI?
// далее можно Printer.Abort и т.п., это не важно.
может быть что-то типа 
      printer.BeginDoc;
      printer.Canvas.TextOut(5,5,'aaaaa');
      Form1.canvas.CopyRect(Bounds(10,10,30,30),Printer.Canvas,Bounds(10,10,30,30));
      printer.AbortMAD: пользуемся тегами! Последний раз редактировалось M.A.D.M.A.N., 23.03.2014 в 10:02.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 А что мешает написать процедуру, которая на вход принимает Canvas и на ней все отрисовывает? А уж какую канву ей подсунуть - это уже дело вызывающего кода. Собственно, так и сделал в одной из своих программ. Процедура отрисовки для печати и превью одна и та же, только "подсовывается" разная канва (ну там еще небольшие игры с пересчетом координат и размеров, т.к. кол-во точек у принтера обычно существенно больше, чем у экрана). 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Код: 
	unit Unit1;
interface
uses
  Printers,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  ACanvas: TCanvas;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Printer.BeginDoc;
  ACanvas:=Printer.Canvas;
  //
end;
end. | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Дело в том, что мне не нужно просто сохранить канву принтера в изображение. Пробовал разные варианты, пока не получается-сохраняет пустое изображение.  
		
	
		
		
		
		
		
		
			Как вариант-печатать сразу в файл, но это не красиво для решения моей задачи. Нужно что-то наподобие этого... объясните, в чем ошибка... Код: 
	  Bitmap: TBitmap;
  Source,
  Dest: TRect;
  acanvas:Tcanvas;
begin
  Bitmap := TBitmap.Create;
  try
      printer.BeginDoc;
      printer.Canvas.TextOut(5,5,'aaaaa');
      acanvas:=printer.Canvas;
      Dest:= Rect(0, 0, 200, 200);
      Source:= Rect(0, 0, 200, 200);
      Bitmap.Canvas.CopyRect(Dest, acanvas, Source);
      Bitmap.SaveToFile('C:\1.bmp');
      printer.Abort;
  finally Bitmap.Free;
  end; // tryMAD: теги. последнее предупреждение. Последний раз редактировалось M.A.D.M.A.N., 23.03.2014 в 10:02.  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 удали Bitmap вообще и не используй Abort 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 И что дальше? 
		
	
		
		
		
		
		
	
		
		
	
	
	Каким образом тогда сохранять канву в файл? Такое ощущение, что вы не совсем педставляете задачу...  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 ![]()  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 смысл заключается, видимо, в том, что ТС сам не понимает зачем он это хочет и как это сделать. Коду все равно на какой канве рисовать, принтер это или Bitmap. Соответсвенно, надо просто коду подсовывать канву соотв. размера. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Мне не нужно печататть на "какой-то канве, типа bitmap". Необходим именно printer.canvas. 
		
	
		
		
		
		
		
		
			Печать отменять не обязательно, я в начале написал, что можно отменять, а можно и нет. Смысл, вкратце, такой: 1) заполнить канву принтера некоторыми символами. 2) считать с канвы в файл. 3) можно печать или абортить печать, на данном этапе это не важно. 4) обрабатывать сохраненный файл некоторыми алгоритмами. в кратце-задача-доказать, что в канве принтера не произошло никаких искажений (после передачи туда контента, как textout так и графики), т.е. своего рода обратный контроль. пока никто дельных вариантов не предложил. Последний раз редактировалось Akunin, 25.03.2014 в 01:36.  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 обработай символы до вывода на печать. доказывать ничего не нужно - при правильном подходе все будет без искажений. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 |