Форум » [x]Harbour » Загрузка шрифтов в принтер » Ответить

Загрузка шрифтов в принтер

wad1: Здравствуйте Всем! Завершаю перевод большого Clipper-проекта под HARBOUR. Уже работает почти все, однако есть еще проблемы. Одна из них - режим прямой DOS-печати на принтер. В Clippere для LJ принтеров нами были нарисованы русские фонты с псевдографикой, которые загружались в принтер перед печатью. Фонтов - несколько, разных размеров. Они имитировали размеры Epson - принтеров. В HARBOUR загрузка не получается, так как не работает функция PRINTSEND (она из CT2). Может быть подскажете как обойти проблему?

Ответов - 9

Andrey: Использую библиотеку Александр Простосердова <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 )

Pasha: wad1 пишет: В HARBOUR загрузка не получается, так как не работает функция PRINTSEND (она из CT2). Может быть подскажете как обойти проблему? Вместо PrintSend шрифт можно загрузить на принтер обычными файловыми функциями fopen/fwrite: nHandle := FOPEN('PRN', 1) FWrite(nHandle, cFont) ... FClose(nHandle)

wad1: Спасибо, Pasha! Получилось. Причем все записывается оптом, без применения буферизации (64К позади), т.е. очень быстро.


wad1: Если принтер включен, то все хорошо. Если же выключен, а печать в WINDOWS настроена "прямо на принтер", то программа вешается намертво. Есть ли какие-то способы проверить готовность принтера или прерывания действия функции FWRITE()? Андрей! Я скачал демку Простосердова для пробы. Так вот она ведет себя точно также.

Andrey: wad1 пишет: Я скачал демку Простосердова для пробы. Так вот она ведет себя точно также. Здесь на форуме обсуждалась эта проблема ! Нельзя проверить включен принтер или нет ! Наши гуру не дали нам ответа на этот вопрос !

Pasha: wad1 пишет: Если же выключен, а печать в WINDOWS настроена "прямо на принтер", то программа вешается намертво. Есть ли какие-то способы проверить готовность принтера или прерывания действия функции FWRITE()? Надо проверять, что возвращает fwrite. Если меньше, чем длина строки для печати - значит, строка на принтер не выведена

wad1: В том то и беда, что FWRITE() ничего не возвращает, так как на ней программа затыкается (в отладчике проверял). Почему-то не срабатывает никакой TIME-OUT. Причем происходит это только с файлом шрифтов. При посылке обычного текстового файла затыкания нет: программа рапортует, что печать закончена, и при последующем включении принтера выполняет печать.

Pasha: Можно выводить строку посимвольно, проверяя каждый байт: 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

wad1: Спасибо, Pasha, за участие! Оказывается, что примерно 66500 байт уходят куда-то нормально (в какой-то буфер), а при посылке следующего байта возврата из FWRITE() не происходит. Видимо поэтому небольшие текстовые файлы улетали у меня без проблем.



полная версия страницы