Показать сообщение отдельно
  #1  
Старый 21.04.2013, 19:56
Akunin Akunin вне форума
Прохожий
 
Регистрация: 02.12.2010
Сообщения: 7
Репутация: 10
По умолчанию Определение длины строки Printer.Canvas

Вопрос:
Как определить длину строки для 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;
Админ: Пользуемся тегами для оформления кода!

хотелось бы ничего не отправлять на принтер, а просто узнавать эти параметры (хочу организовать предпросмотр)
Ответить с цитированием