Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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;
Админ: Пользуемся тегами для оформления кода!

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

Последний раз редактировалось Admin, 21.04.2013 в 20:17.
Ответить с цитированием
  #2  
Старый 23.04.2013, 12:20
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Код:
Printer.Abort;
не?

Ну в смысле
Код:
Printer.BeginDoc; 
Define_count_str; 
Printer.Abort;

Последний раз редактировалось M.A.D.M.A.N., 23.04.2013 в 12:30. Причина: Пользуемся кнопкой "правка"!
Ответить с цитированием
  #3  
Старый 23.04.2013, 13:00
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

не понятно зачем, если не собираешься печатать, иметь контекст принтера (узнавать длину строки на нем)?
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 23.04.2013 в 13:07.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter