![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Вопрос: 
		
	
		
		
		
		
		
		
			Как определить длину строки для Printer без printer.BeginDoc? Есть ф-ии: Код: 
	//----------Перевод значения String-->Char---------------------------------------------//
function strtoPchar(s:string):Pchar;
begin
  S := S+#0;
  result:=StrPCopy(@S[1], S) ;
end;
//---определение максимальных значений страницы---------------------------------------/
function MaxCoordForPrint: TPoint;
begin
  try
    MaxCoordForPrint.X:=GetDeviceCaps(Printer.Handle, HORZRES);//Horizontal width in pixels
    MaxCoordForPrint.Y:=GetDeviceCaps(Printer.Handle, VERTRES);  //Vertical height in pixels
    except
    on EPrinter do callErr(8551);
  end;
end;
//---Определение кол-ва строк и символов в строках для текущего принтера-----------------//
procedure Define_count_str;
var
  DC:HDC;
  PrinterCanvasFontHandle:HFONT;
  Save: THandle;
begin
//определяем разрешающую способность
  X_Width:=MaxCoordForPrint.X;
  Y_Height:=MaxCoordForPrint.Y;
// определение количества символов в строке - Kol_Simvol_str
  PrinterCanvasFontHandle:=GetPrinterCanvasFontHandle; // ф-ия передает handle 
  DC := GetDC(0);
  Save := SelectObject(DC, PrinterCanvasFontHandle);
  P_Stroka_Tabl:=strtoPchar(P_str);
  if GetTextExtentPoint32A(DC,P_Stroka_Tabl,StrLen(P_Stroka_Tabl),P_Size) then Kol_Simvol_str:=round(X_Width/(P_Size.cx/strlen(P_Stroka_Tabl)))-1  // погрешность в меньшую сторону т.к. может криво захватить бумагу
    else Kol_Simvol_str:=100;
// определение количества строк - Kol_Str_Height
  Kol_Str_Height:= {round}trunc(Y_Height/(P_Size.cy+P_Size.cy*0.03937));  //округляем в нижнюю сторону -на всякий случай
  ReleaseDC(0, DC);
end;
дело в том, что пока нет команды Printer.BeginDoc я не знаю как получить Printer.Canvas.Handle и не корректно работает ф-ия GetDC и GetTextExtentPoint32A. Тоесть в P_Size кладутся неверные значения... 
Основная задача-получить правильный P_Size.
все работает только когда использую 
Printer.BeginDoc;
Define_count_str;
Printer.EndDoc;хотелось бы ничего не отправлять на принтер, а просто узнавать эти параметры (хочу организовать предпросмотр) Последний раз редактировалось Admin, 21.04.2013 в 20:17.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код: 
	Printer.Abort; Ну в смысле Код: 
	Printer.BeginDoc; Define_count_str; Printer.Abort; Последний раз редактировалось M.A.D.M.A.N., 23.04.2013 в 12:30. Причина: Пользуемся кнопкой "правка"!  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 не понятно зачем, если не собираешься печатать, иметь контекст принтера (узнавать длину строки на нем)? 
		
	
		
		
		
		
			
		
		
		
		
		
			Последний раз редактировалось NumLock, 23.04.2013 в 13:07.  |