Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  299

•  TDictionary Custom Sort  3 447

•  Fast Watermark Sources  3 192

•  3D Designer  4 952

•  Sik Screen Capture  3 446

•  Patch Maker  3 649

•  Айболит (remote control)  3 850

•  ListBox Drag & Drop  3 115

•  Доска для игры Реверси  82 610

•  Графические эффекты  4 051

•  Рисование по маске  3 347

•  Перетаскивание изображений  2 720

•  Canvas Drawing  2 870

•  Рисование Луны  2 673

•  Поворот изображения  2 285

•  Рисование стержней  2 217

•  Paint on Shape  1 618

•  Генератор кроссвордов  2 299

•  Головоломка Paletto  1 817

•  Теорема Монжа об окружностях  2 315

•  Пазл Numbrix  1 713

•  Заборы и коммивояжеры  2 089

•  Игра HIP  1 309

•  Игра Go (Го)  1 259

•  Симулятор лифта  1 506

•  Программа укладки плитки  1 253

•  Генератор лабиринта  1 578

•  Проверка числового ввода  1 397

•  HEX View  1 528

•  Физический маятник  1 383

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Проблемы со шрифтами у QuickReport



Я использую Delphi 2.0 и QuickReports 1.1.

Я создал ОЧЕНЬ сложный (графически, во всяком случае) отчет и только что обнаружил, что это не выводится как положено на экране и на принтере во время выполнения программы (хотя это и корректно отображается в окне предварительного просмотра в режиме проектирования). Ошибка возникает только в том случае, если в Windows 95 установлены большие (LARGE) системные шрифты! Ну и что мне теперь прикажете делать?

У меня тоже была такая же серьезная проблема, но только при печати под Win 95 на офисный HP 4M и при просмотре отчета под NT 4.0. Но то же самое приложение у меня прекрасно работало под NT 3.51 SP5.

Я видел дискуссию по поводу этой ошибки, возникающей в GDI коде под NT 4.0, поэтому я не удивился, обнаружив ее у себя. Мне пришлось засучить рукава и очень тесно познакомиться с кодом QuickReports, особенно с процедурой первичного вывода текста, когда программа изменяет шрифт в каждой выводимой области. Вот этот злосчастный сегмент кода в методе TQRCustomControl.Print:


QRPrinter.Canvas.Font:=Font;
QRPrinter.Canvas.Font.size:=trunc(abs(parentreport.xpos(font.size)));
QRPrinter.Canvas.brush.Color:=Color;

Теперь те из нас, которые истратили слишком много времени на изучение исходного кода VCL узнали, что VCL поддерживает кэш ресурса через менеджера дескрипторов в Graphics.pas и что попытки уменьшения количества используемых ресурсов Windows сводятся к методу подсчета ссылок на дескрипторы многократно испольуемых ресурсов. Коду, приведенному выше, отлично удалось это обойти! Каждый раз холст принтера устанавливает шрифты полей, таким образом уменьшая счетчик используемых ресурсов в ноль с дальнейшим его освобождением и затем масштабирует размер шрифта для соответствия его метрике принтера, таким образом требуя размещения нового шрифтового ресурса.

Всдедствие этого _каждое_ поле отчета использует для вывода собственный шрифт, тратя для этого каждый раз системные ресурсы и вгоняя в штопор систему (регистратор метафайлов), пытающуюся уследить за бешенным ритмом смены шрифтов и массовым съеданием ресурсов.

В качестве эксперимента я создал непечатаемую этикетку с тем же самым размером шрифта, что и у масштабируемого шрифта принтера, тем самым заставляя ресурс кэшироваться - ошибка исчезла как страшный сон! Это доказывает идентичность проблемы в NT 4.0 - те же действующие лица: регистратор расширенных метафайлов и огромное количество изменений шрифтов.

Лучшее решение я увидел в следующем:


// При установке нового шрифта сохраняем шрифт принтера
SaveFont := TFont.Create;
SaveFont.Assign(QRPrinter.Canvas.Font);

QRPrinter.Canvas.Font:=Font;
QRPrinter.Canvas.Font.size:=trunc(abs(parentreport.xpos(font.size)));
QRPrinter.Canvas.brush.Color:=Color;

// Освобождаем сохраненный шрифт принтера. Теперь работа сделана.
SaveFont.Free;
SaveFont := nil;

Дополнительными строками нам удается проверить тот факт, что шрифт принтера уже используется или же для холста принтера выбирается тот же самый шрифт. Это работает уже вполне корректно и позволяет печатать правильные отчеты под NT 4.0. Некоторым странным совпадением можно считать устранение зашитых жирных шрифтов, изменившее шрифты, печатаемые под Win95.

Так, если у вас есть зарегистрированная версия QuickReports, вы можете сделать коррекцию исходных файлов, и вы увидите, что ваши отчеты будут генериться быстрее, выглядеть "мягче" и не будет ошибок и издержек шрифтовых ресурсов из-за ограничения кода расширенных метафайлов и GDI.








Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте