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

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

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

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

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

Однако можно "привыкнуть" к определенному принтеру и определенной бумаге. В смысле, через некоторое время пользователи приспособятся как именно надо вставлять бумагу в каждый конкретный принтер, чтобы "попасть" в бланк.
...
Рейтинг: 0 / 0
13.04.2011, 21:29
    #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
14.04.2011, 10:51
    #37215856
Макс_П
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отчёт на разных принтерах
igorbikПриведу решение "в лоб", возможно, не самое изящное, но думается, что проблему решит.
Вам нужно будет приготовить 2 отчета, "начинка" которых будет различаться высотой колонтитула или заголовка отчета на 2мм, и использовать команду SET PRINTER TO NAME.
Именно так я и поступил пока у меня было 2 принтера, но когда их стало 5 и все разные, среди которых 2 матричных, то хотелось бы сделать это красиво и на все случаи жизни. Думаю, всё-таки, что здесь может помочь только ReportListener.
...
Рейтинг: 0 / 0
14.04.2011, 11:53
    #37216035
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отчёт на разных принтерах
Макс_П,
если документы MS Office печатаются на всех принтерах одинаково, то попробуйте сделать вывод в MS Excel или MS Word
...
Рейтинг: 0 / 0
14.04.2011, 12:04
    #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
15.04.2011, 17:52
    #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
15.04.2011, 20:36
    #37219108
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отчёт на разных принтерах
Макс_Пхотелось бы реализовать это под FoxPro 9 с его новыми возможностями.

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

Там в самом конце темы пример по теме
...
Рейтинг: 0 / 0
15.04.2011, 22:08
    #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
16.04.2011, 12:50
    #37219498
Макс_П
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отчёт на разных принтерах
прошелмимообратите внимание на строчку в проекте-примере
Код: plaintext
repl vpos    with vpos + nTopMargin * 10000 / 25 . 4  all

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

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

Там в самом конце темы пример по теме
А за это огромное спасибо!!! А какую команду и куда... здесь нужно добавить, чтобы определить минимальное верхнее поле выбранного для печати принтера?
...
Рейтинг: 0 / 0
16.04.2011, 13:32
    #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
16.04.2011, 13:37
    #37219531
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отчёт на разных принтерах
Макс_ПА какую команду и куда... здесь нужно добавить, чтобы определить минимальное верхнее поле выбранного для печати принтера?
Вторая ссылка прошелмимо содержит архив (203GetMargin.zip около 45КБ), в котором показан пример использования специфических API-функций для определения реквизитов принтера. В том числе и полей.

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

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


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