powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отчёт на разных принтерах
19 сообщений из 19, страница 1 из 1
Отчёт на разных принтерах
    #37214165
Макс_П
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем, добрый день!
Есть отчёт, который печатается на разных принтерах. На одном минимальное верхнее поле 1.06 см, а на втором - 0.42 см. При распечатке на бланке строгой отчётности на одном принтере всё получается красиво, а на втором необходимо высоту всех объектов отчёта увеличивать на 0.64 см. Хотелось бы узнать, как можно заставить программу самой определять, после выбора принтера, минимальное значение верхнего поля и изменять расположение всех объектов в шаблоне в зависимости от выбранного принтера? Думаю, что это решается с помощью ReportListener, но опыта работы с ним нет, буду благодарен за примеры программного кода. Заранее спасибо!
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37214183
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс_ПВсем, добрый день!
Есть отчёт, который печатается на разных принтерах. На одном минимальное верхнее поле 1.06 см, а на втором - 0.42 см. При распечатке на бланке строгой отчётности на одном принтере всё получается красиво, а на втором необходимо высоту всех объектов отчёта увеличивать на 0.64 см. Хотелось бы узнать, как можно заставить программу самой определять, после выбора принтера, минимальное значение верхнего поля и изменять расположение всех объектов в шаблоне в зависимости от выбранного принтера? Думаю, что это решается с помощью ReportListener, но опыта работы с ним нет, буду благодарен за примеры программного кода. Заранее спасибо!

намек:
репорт - табличка.
в заголовке есть опред-е поля -
если репорту прореплейсить поля - будет чудо.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37214200
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подобные отемы поищите так
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37214230
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В режиме модификации отчета пункт меню File \ Page Setup

Там есть такое свойство "Print Area" которое может принимать одно из двух значений:

Printable page - учитывать поля принтера и под область печати отводить только ту часть листа, которая находится "внутри" полей
Whole page - игнорировать поля принтера и под область печати отводить весь лист. Т.е. все 210х297 мм

Т.е. если поставить Whole Page то надо озабоится самому отступами от края листа. Если первый объект печати имеет верхнюю координату 1.06, то на ВСЕХ принтерах вне зависимости от размера полей будет предпринята попытка распечатать этот объект именно по этим координатам.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37215067
Макс_П
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМТ.е. если поставить Whole Page то надо озабоится самому отступами от края листа. Если первый объект печати имеет верхнюю координату 1.06, то на ВСЕХ принтерах вне зависимости от размера полей будет предпринята попытка распечатать этот объект именно по этим координатам.
Попробовал, разница уменьшилась с 1.06 см до 2 мм, но это всё равно не то. Хотелось бы, чтобы было точно.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37215188
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно у Вас не получится никак. Это нужна идеальная подача бумаги в принтере и идеальный размер самой бумаги. Погрешность позиционирования в 1..2 миллиметра у Вас будет даже при печати на одном и том же принтере в режиме "Printable page".

Однако можно "привыкнуть" к определенному принтеру и определенной бумаге. В смысле, через некоторое время пользователи приспособятся как именно надо вставлять бумагу в каждый конкретный принтер, чтобы "попасть" в бланк.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37215254
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс_Празница уменьшилась до 2 мм. Хотелось бы, чтобы было точно.Приведу решение "в лоб", возможно, не самое изящное, но думается, что проблему решит.
Вам нужно будет приготовить 2 отчета, "начинка" которых будет различаться высотой колонтитула или заголовка отчета на 2мм, и использовать команду SET PRINTER TO NAME.

Получить имена принтеров, установленных в системе, можно, например, так (взято из Хелпа):
*******************
IF APRINTERS(gaPrinters) > 0
CLEAR && clear the current output window
DISPLAY MEMORY LIKE gaPrinters && show the contents of the array
ELSE
WAIT WINDOW 'No printers found.'
ENDIF
*******************
Через комбо или меню (или переключатель) выбираете имя принтера, и в зависимости от выбора печатаете либо первый, либо второй отчеты.
Например:
********************
IF '1022' $ prnname1
SET PRINTER TO NAME (prnname1)
REPORT FORM report1 ...........
ELSE
SET PRINTER TO NAME (prnname2)
REPORT FORM report2 ...........
ENDIF
*********************
Желаю удачи.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37215856
Макс_П
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igorbikПриведу решение "в лоб", возможно, не самое изящное, но думается, что проблему решит.
Вам нужно будет приготовить 2 отчета, "начинка" которых будет различаться высотой колонтитула или заголовка отчета на 2мм, и использовать команду SET PRINTER TO NAME.
Именно так я и поступил пока у меня было 2 принтера, но когда их стало 5 и все разные, среди которых 2 матричных, то хотелось бы сделать это красиво и на все случаи жизни. Думаю, всё-таки, что здесь может помочь только ReportListener.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37216035
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс_П,
если документы MS Office печатаются на всех принтерах одинаково, то попробуйте сделать вывод в MS Excel или MS Word
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37216065
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.sql.ru/forum/actualthread.aspx?tid=220103&hl=expr

http://www.foxclub.ru/sol/arc/203GetMargin.zip

обратите внимание на строчку в проекте-примере
Код: plaintext
repl vpos    with vpos + nTopMargin * 10000 / 25 . 4  all

поиграйтесь подобным образом.
будет ли какой-то результат?
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37218934
Макс_П
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо http://www.sql.ru/forum/actualthread.aspx?tid=220103&hl=expr

http://www.foxclub.ru/sol/arc/203GetMargin.zip

обратите внимание на строчку в проекте-примере
Код: plaintext
repl vpos    with vpos + nTopMargin * 10000 / 25 . 4  all

Это всё под старые версии Fox, а хотелось бы реализовать это под FoxPro 9 с его новыми возможностями.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219108
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс_Пхотелось бы реализовать это под FoxPro 9 с его новыми возможностями.

Масштабирование отчета

Там в самом конце темы пример по теме
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219184
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс_Ппрошелмимо http://www.sql.ru/forum/actualthread.aspx?tid=220103&hl=expr

http://www.foxclub.ru/sol/arc/203GetMargin.zip

обратите внимание на строчку в проекте-примере
Код: plaintext
repl vpos    with vpos + nTopMargin * 10000 / 25 . 4  all

Это всё под старые версии Fox, а хотелось бы реализовать это под FoxPro 9 с его новыми возможностями.

Вас просили выполнить рекомендацию
и сообщить рез-т
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219498
Макс_П
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимообратите внимание на строчку в проекте-примере
Код: plaintext
repl vpos    with vpos + nTopMargin * 10000 / 25 . 4  all

Это работать будет. Меня же интересует, как после выбора принтера и запуска на печать: заставить программу сначала определить верхнее поле выбранного принтера, потом поменять значение поля VPOS из вашего примера и только потом начинать печатать. Из хелпа вижу, что с этим должен справиться ReportListener - события объекта BeforeReport. Я прав?
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219510
Макс_П
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирММакс_Пхотелось бы реализовать это под FoxPro 9 с его новыми возможностями.

Масштабирование отчета

Там в самом конце темы пример по теме
А за это огромное спасибо!!! А какую команду и куда... здесь нужно добавить, чтобы определить минимальное верхнее поле выбранного для печати принтера?
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219523
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Вас само представление о том как и что работает не правильное.

Если Вы используете режим печати Printable Page, то, собственно, какая Вам разница, какой отступ указан в настройках отчета? Все-равно ведь размер отступа будет взят из настроек принтера, а то, что сохранено в настройках отчета будет просто проигнорировано.

Если Вы используете режим печати Whole Page, то, собственно, какая Вам разница, какой отступ указан в драйвере принтера или настройках отчета. И то, и другое будет также успешно проигнорировано! Не будет использовано ни то, ни другое. Отчет начнет печататься с самого края листа БЕЗ каких-либо отступов.

Погрешность позиционирования при использовании режима Whole Page вообще никак не связана с драйвером чего-либо. Это проблема железа. В самом прямом смысле этого слова. При захвате бумаги чуть дергает лист, лоток для бумаги не очень ровный, бумагу чуть криво положили и т.д., и т.п. Программными средствами это не лечится.

Далее Вы не очень-то правильно представляете себе как работает ReportListener. Он как бы лежит "параллельно" генератору отчетов.

Т.е. есть генератор отчетов FoxPro, который у себя внутри неким "волшебным" образом генерит отчет. После очередного этапа генерации он вызывает метод класса ReportListener и сообщает: "я завершил очередной этап генерации вот с такими параметрами".

Вот в этот момент программист имеет возможность оценить "корректность" рассчитанных значений и, если необходимо, чуть подправить эти самые значения.

Другими словами, программист не в состоянии изменить сам процесс генерации отчета. Он может лишь скорректировать (или отменить) результат этой генерации.

Да, Вы имеете доступ к файлу отчета FRX из ReportListener. Проблема только в том, что Вы имеете доступ только на чтение. Ничего изменить в файле отчета Вы не можете. Первый же абзац в справке по событию BeforeReport об этом четко сообщает

ReportListener.BeforeReport EventWhen Visual FoxPro triggers the BeforeReport event for a report run, it has done all necessary internal setup work for rendering the report. It has read the contents of the report definition file (frx) and has opened a read-only copy of this file in a private datasession for use by your derived class

Когда Visual FoxPro вызывает событие BeforeReport для выполняемого отчета, он сделал всю необходимую подготовку для выполнения отчета. Он прочитал содержание файла определения отчета (frx) и открыл копию только для чтения этого файла в собственном сеансе (data session) для использования вашим классом.

По приведенной мной ссылке чуть выше, я показал как можно сдвинуть все объекты отчета на нужный отступ в классе ReportListener.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219531
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макс_ПА какую команду и куда... здесь нужно добавить, чтобы определить минимальное верхнее поле выбранного для печати принтера?
Вторая ссылка прошелмимо содержит архив (203GetMargin.zip около 45КБ), в котором показан пример использования специфических API-функций для определения реквизитов принтера. В том числе и полей.

Только, повторюсь, для данной задачи - это практически бесполезная информация.
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219629
Макс_П
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМТолько, повторюсь, для данной задачи - это практически бесполезная информация.
Whole Page стоит, погрешность печати на двух разных принтерах - 2 мм. Для бланков строкой отчётности это недопустимо. Как бы в такой ситуации поступили вы?
...
Рейтинг: 0 / 0
Отчёт на разных принтерах
    #37219848
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Макс_П,

Задача, возможно, сложнее, чем Вы сейчас себе представляете. Дело не только в том, что нет одинаковых принтеров. Поступал новый тираж или партия бланков из типографии и обнаруживалось, что сами бланки тоже "гуляют" туда-сюда. Дальше следует привязка к cериям/номерам... Со временем кол-во всевозможных разновидностей начинает расти как снежный ком... В общем, кардинально проблема решилась только отказом от бланков с текстом, всё содержимое формировалось программно, а на бланках только элементы защиты, серия номер.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Отчёт на разных принтерах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]