Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 16.04.09 12:56. Заголовок: Загрузка шрифтов в принтер
Здравствуйте Всем! Завершаю перевод большого Clipper-проекта под HARBOUR. Уже работает почти все, однако есть еще проблемы. Одна из них - режим прямой DOS-печати на принтер. В Clippere для LJ принтеров нами были нарисованы русские фонты с псевдографикой, которые загружались в принтер перед печатью. Фонтов - несколько, разных размеров. Они имитировали размеры Epson - принтеров. В HARBOUR загрузка не получается, так как не работает функция PRINTSEND (она из CT2). Может быть подскажете как обойти проблему?
|
|
|
Ответов - 9
[только новые]
|
|
|
| постоянный участник
|
Пост N: 835
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.04.09 13:18. Заголовок: Использую библиотеку..
Использую библиотеку Александр Простосердова <clipperforwindows@narod.ru>. Посмотреть можно на http://clipperforwindows.narod.ru/ Мой проверочный пример Tstprint2(GetDefaultPrinter()) *:********************************************************************* FUNCTION TstPrint2(cPrinter) LOCAL nI /* Синтаксис печати Set( 20, 'SPOOLER', nROW, nCOL, nFORMAT ), где nROW - количество строк на листе; nCOL - количество столбцов на листе; nFORMAT - формат бумаги: 1 - А4 портрет, 2 - А4 альбомная, 3 - В5 */ Set( 20, 'SPOOLER', 45, 140, 2, cPrinter, HB_OEMTOANSI("Лист 2 - альбом") ) @ 0, 0 Say '0 Лист 2 - альбом' @ 1, 0 Say "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" @ 2, 0 Say "2 10 20 30 40 50 60 70 80 90 100 110 120 130 140" @ 3, 0 Say "3 ╔═════════════╦══════════════════════════╦═════════════════════════╦════════════════╦══════════════════╦═════════════╦═════════════════╗" @ 4, 0 Say "4 ║ ЗАЯВКА ║ ЗАКАЗЧИК ║ ВИД НЕИСПРАВНОСТИ ║СРОКИ ВЫПОЛНЕНИЯ║ УСТАНОВЛЕННОЕ ║ОПЛАТА РАБОТЫ║ПРИБЫТИЕ-КВАРТИРА║" @ 5, 0 Say "5 ║ No/Дата ║ АДРЕС, Ф.И.О., ТЕЛЕФОН ║ ПРИМЕЧАНИЕ ЗАЯВКИ ║СРОЧНОСТЬ,МАСТЕР║ ОБОРУДОВАНИЯ ║ (если есть) ║ ДАТА (ПОДПИСЬ) ║" @ 6, 0 Say "6 ╠═════════════╬══════════════════════════╬═════════════════════════╬════════════════╬══════════════════╬═════════════╬═════════════════╣" FOR nI := 7 TO 44 @ nI,0 say ALLTRIM(STR(nI)) NEXT @ 45, 110 Say 'Конец листа 1' Eject Set Device TO Screen RETURN ( NIL )
|
|
|
|
| Администратор
|
Пост N: 1093
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.04.09 16:15. Заголовок: wad1 пишет: В HARBO..
wad1 пишет: цитата: | В HARBOUR загрузка не получается, так как не работает функция PRINTSEND (она из CT2). Может быть подскажете как обойти проблему? |
| Вместо PrintSend шрифт можно загрузить на принтер обычными файловыми функциями fopen/fwrite: nHandle := FOPEN('PRN', 1) FWrite(nHandle, cFont) ... FClose(nHandle)
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 16.04.09 16:46. Заголовок: Спасибо, Pasha! Полу..
Спасибо, Pasha! Получилось. Причем все записывается оптом, без применения буферизации (64К позади), т.е. очень быстро.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 18.04.09 19:07. Заголовок: Если принтер включен..
Если принтер включен, то все хорошо. Если же выключен, а печать в WINDOWS настроена "прямо на принтер", то программа вешается намертво. Есть ли какие-то способы проверить готовность принтера или прерывания действия функции FWRITE()? Андрей! Я скачал демку Простосердова для пробы. Так вот она ведет себя точно также.
|
|
|
|
| постоянный участник
|
Пост N: 836
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.04.09 20:59. Заголовок: wad1 пишет: Я скача..
wad1 пишет: цитата: | Я скачал демку Простосердова для пробы. Так вот она ведет себя точно также. |
| Здесь на форуме обсуждалась эта проблема ! Нельзя проверить включен принтер или нет ! Наши гуру не дали нам ответа на этот вопрос !
|
|
|
|
| Администратор
|
Пост N: 1094
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.04.09 08:23. Заголовок: wad1 пишет: Если же..
wad1 пишет: цитата: | Если же выключен, а печать в WINDOWS настроена "прямо на принтер", то программа вешается намертво. Есть ли какие-то способы проверить готовность принтера или прерывания действия функции FWRITE()? |
| Надо проверять, что возвращает fwrite. Если меньше, чем длина строки для печати - значит, строка на принтер не выведена
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.04.09 10:13. Заголовок: В том то и беда, что..
В том то и беда, что FWRITE() ничего не возвращает, так как на ней программа затыкается (в отладчике проверял). Почему-то не срабатывает никакой TIME-OUT. Причем происходит это только с файлом шрифтов. При посылке обычного текстового файла затыкания нет: программа рапортует, что печать закончена, и при последующем включении принтера выполняет печать.
|
|
|
|
| Администратор
|
Пост N: 1096
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.04.09 11:14. Заголовок: Можно выводить строк..
Можно выводить строку посимвольно, проверяя каждый байт: LOCAL e, ser := 1 while ser <= len(cStr) if FWRITE(nHandle, Substr(cStr, ser, 1)) # 1 e = ErrorNew() e:genCode = EG_PRINT e:canDefault = .f. e:canRetry = .t. e:severity = ES_ERROR if ! EVAL(ErrorBlock(), e) Exit endif else ser ++ endif enddo
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.04.09 14:28. Заголовок: Спасибо, Pasha, за у..
Спасибо, Pasha, за участие! Оказывается, что примерно 66500 байт уходят куда-то нормально (в какой-то буфер), а при посылке следующего байта возврата из FWRITE() не происходит. Видимо поэтому небольшие текстовые файлы улетали у меня без проблем.
|
|
|
|