Форум » [x]Harbour » PAGESCRIPT 32 FOR (X)HARBOUR » Ответить

PAGESCRIPT 32 FOR (X)HARBOUR

Dima: Пытаюсь прикрутить PageScript 32 к проге на Harbour и облом. К проге на Xharbour прикрутил нормально (работает) Есть в TPSCRIPT.PRG (поставляется вместе с библой) [pre2] #include "PScript.ch" #include "FileIO.ch" #ifdef __XHARBOUR__ // 02.06.2005 - IBTC - changed for xHarbour Builder: #xtranslate Method <Classname>:<x> => Method <x> #define DLL_STDCALL NIL #include "hbclass.ch" #else #include "Xbp.ch" #include "Dll.ch" #endif [/pre2] Harbour естественно не находит Xbp.ch , Dll.ch , не пойму что делать. [pre2] =============================================== PAGESCRIPT 32 FOR (X)HARBOUR =============================================== This file contains important supplementary and late-breaking information that may not appear in the main product documentation. We recommend that you read this file in its entirety. In order to use PageScript 32 with (x)Harbour, you'll need to distribute PSCRIPT.DLL with your programs. We recommand that PSCRIPT.DLL be copied in the application's folder in order to avoid DLL versions conflicts. Three files needs to be included in your (x)Harbour projects : 1 - DLLCALL.C 2 - TPSCRIPT.PRG 3 - PSCRIPT.CH DLLCALL.C gives PageScript a way to call DLL functions in the same way as Xbase++ does. This interface is contributed by Paul Tucker, Ontario, Canada. Many thanks to him for this great contribution. TPSCRIPT.PRG contains all the PageScript 32 functions and one class, named TPageScript. You may either choose to call PS functions or instantiate TPageScript and use its methods. When you use functions, calling PSInit() automaticaly instanciates a Static TPageScript object. PSCRIPT.CH contains constants used by PageScript 32. [/pre2] Что то не пойму она будет вообще с Hаrbour работать http://www.abeelabs.com/pagescript32/index.php у меня версия 1.3.4.0

Ответов - 74, стр: 1 2 3 4 All

Sergy: Dima пишет: Ты в этом уверен ? Мне кажется что после RTE Harbour , сама прога нормально завершается (ну типа с закрытием баз и тд и тп) а далее начинает завершаться сама DLL со своими ошибками , она ж вроде на делфи. Могу быть уверен только в том коде, который сам написал. Или имеющий исходники. А когда есть "черный ящик" в виде DLL - можно предполагать всё, что угодно. Сегодня вот вообще с вероятностью 1к5 стал ловить GPF на ровном месте: [pre2]/*----------------------------------------------------------------------------- Method .....: #GetPrinterCaps() -> aCaps Description : Retreive the printer capabilities of the selected printer -----------------------------------------------------------------------------*/ METHOD TPageScript:GetPrinterCaps() Local cDllTemplate Local nAreaWidth Local nAreaHeight Local nTopMargin Local nLeftMargin Local nPaperWidth Local nPaperHeight // Local nMAreaWidth // Local nMAreaHeight Local nHPixelsInch Local nVPixelsInch Local nBitDepth cDllTemplate := DllPrepareCall(::hDll, DLL_STDCALL, "PSGetPrinterCaps") nAreaWidth := DllExecuteCall(cDllTemplate, HORZRES) // Printable Horz area (Width) Pixels nAreaHeight := DllExecuteCall(cDllTemplate, VERTRES) // Printable Vert area (Height) Pixels nTopMargin := DllExecuteCall(cDllTemplate, PHYSICALOFFSETY) // Top margin Pixels nLeftMargin := DllExecuteCall(cDllTemplate, PHYSICALOFFSETX) // Left margin Pixels nPaperWidth := DllExecuteCall(cDllTemplate, PHYSICALWIDTH) // Total paper width Pixels nPaperHeight := DllExecuteCall(cDllTemplate, PHYSICALHEIGHT) // Total paper height Pixels // nMAreaWidth := DllExecuteCall(cDllTemplate, HORZSIZE) // Printable Horz area mm // nMAreaHeight := DllExecuteCall(cDllTemplate, VERTSIZE) // Printable Vert area mm nHPixelsInch := DllExecuteCall(cDllTemplate, LOGPIXELSX) // Number of Horz pixels/Inch Pixels nVPixelsInch := DllExecuteCall(cDllTemplate, LOGPIXELSY) // Number of Vert pixels/Inch Pixels nBitDepth := DllExecuteCall(cDllTemplate, NUMCOLORS) // Bit depth (number of bits per pixel) Return {nPaperWidth , ; nPaperHeight, ; nAreaWidth , ; nAreaHeight , ; nTopMargin , ; nLeftMargin , ; nHPixelsInch, ; nVPixelsInch, ; nBitDepth} // <<-- ошибка вот тут [/pre2] Затем неожиданно перестали создаваться PDF файлы: [pre2]Application Internal Error - D:\Z_Test\PS32\demo.exe Terminated at: 2018-01-05 21:42:58 Неисправимая ошибка 6005: Exception error: Exception Code:C0000005 ACCESS_VIOLATION Exception Address:009F61F1 EAX:00000000 EBX:00FF4EB0 ECX:00000000 EDX:00000001 ESI:01019D90 EDI:00000000 EBP:0043EF14 CS:EIP:0023:009F61F1 SS:ESP:002B:0043EED8 DS:002B ES:002B FS:0053 GS:002B Flags:00210202 Exception Parameters: 00000000 00000004 CS:EIP: 8B 48 04 8B 40 08 48 85 C0 7C 0E 40 33 F6 3B 11 SS:ESP: 01019D90 00BF54AD 0043EF20 00BF55F8 0043EF14 00000000 00000025 0043F1E4 00000000 00000000 00000001 FFFFFFFF 00000000 01006520 064F3EB4 0043F208 C stack: EIP: EBP: Frame: OldEBP, RetAddr, Params... 009F61F1 0043EF14 0043F208 00C6AC96 00000000 0043F260 00C6BF13 0043F208 0043F2A0 00000001 00000001 00000000 00C6AC96 0043F208 0043F254 00C69233 00000000 00000000 00000000 01012C78 010449A0 01006520 00000001 00000001 00C69233 0043F254 0043F2A4 00C694C6 0043F2A4 0043F2BC 00C69509 0043F2A4 00000001 00000000 00000001 010062CC 00C694C6 0043F2A4 0043F3F0 00BF143D 01012CB8 0043F3A8 0043F358 00000003 0043F408 00BF15D2 0043F3F0 00000110 00BF143D 0043F3F0 0043F464 00C5A8CE 01020320 00C692C8 00FC1A50 010224E0 0043F414 00C5A8F9 0043F464 0043F48C Modules: ... Called from DLLCALL(0) Called from TPAGESCRIPT:ENDDOC(470) Called from PSENDDOC(2475) Called from (b)PS32(38) Called from PS32:FINISH(0) Called from MAIN(148) [/pre2] Хотя еще вчера все работало норм. PSGetPrinterCaps() заменил вот на такой огород: [pre2] // было: aCaps := PSGetPrinterCaps() // параметры принтера // стало: aCaps := { PSGetPrinterCapsEx(110),; PSGetPrinterCapsEx(111),; PSGetPrinterCapsEx( 8),; PSGetPrinterCapsEx( 10),; PSGetPrinterCapsEx(113),; PSGetPrinterCapsEx(112),; PSGetPrinterCapsEx( 88),; PSGetPrinterCapsEx( 90),; PSGetPrinterCapsEx( 24) ; } [/pre2] А вот что случилось с PDF - вообще не могу понять... Единственное, что из серьезного изменилось - утром винда захотела обновиться и попросила установить 100500 мегабайт ежемесячных обновлений. Я не возражал - слышал, там закрывают какой-то серьезный косяк с защитой на уровне ядра процессоров Intel, выпущенных а последние 10 лет...

Dima: Sergy пишет: Я не возражал - слышал, там закрывают какой-то серьезный косяк с защитой на уровне ядра процессоров Intel, выпущенных а последние 10 лет... я тоже читал на яплакал...

Dima: Sergy А ты юзаешь файл из поставки DLLCALL.C ? Я нет.


Sergy: Честно говоря, даже не понял, как это "всё" заработало у меня. Скачал файл из pagescript32.com, потыкал по hbp, prg по очереди... что-то скомпилировалось как библиотека и "куда-то" упали *.a и *.о файлы... Скомпилировался ли dllcall.c - я не в курсе. Нигде ж ничего про это не написано... Пока адаптировал свою библиотеку печати под вызовы pscript.dll, на след неделе в боевом режиме с админом потестируем, что это за зверь... Если что - отключить его и вернуться на hpdf - дело трех секунд: если программа не "видит" dll - будет использовать harupdf.

Dima: Sergy пишет: Нигде ж ничего про это не написано.. [pre2] In order to use PageScript 32 with (x)Harbour, you'll need to distribute PSCRIPT.DLL with your programs. We recommand that PSCRIPT.DLL be copied in the application's folder in order to avoid DLL versions conflicts. Three files needs to be included in your (x)Harbour projects : 1 - DLLCALL.C 2 - TPSCRIPT.PRG 3 - PSCRIPT.CH DLLCALL.C gives PageScript a way to call DLL functions in the same way as Xbase++ does. This interface is contributed by Paul Tucker, Ontario, Canada. Many thanks to him for this great contribution. TPSCRIPT.PRG contains all the PageScript 32 functions and one class, named TPageScript. You may either choose to call PS functions or instantiate TPageScript and use its methods. When you use functions, calling PSInit() automaticaly instanciates a Static TPageScript object. PSCRIPT.CH contains constants used by PageScript 32. [/pre2]

Sergy: Это конечно хорошо, но как его компилировать-то ? Куда девать или где искать соотв. dllcall.а, dllcall.o ??? У себя я их не нашел... Ни в одном из *.hbp/hbc в текущей поставке о нем нет упоминаний... Ты уверен, что этот файл нужен для актуальной версии Harbour ? Хочу избавиться от наличия ps32.hbc, содержащего такие строки: description=PageScript32 wrapper incpaths=. libpaths=lib/${hb_plat}/${hb_comp} libs=${hb_name} libs=hbxpp.hbc вытащил всё из .\lib\hbwin\.hbmk\win\mingw\*.* в .\lib\*.* , заменил его на такой: libpaths=lib libs=ps32 в myprog.hbp добавил hbxpp.hbc и ps32.hbc Вроде работает, но держать отдельный файл ради двух строк, в нем содержащихся... напрягает... в myprog.hbp добавил ещё пару строк: -Llib // путь к библиотеке(ам) -lps32 // определение библиотеки вроде они делают всё тоже самое, что ps32.hbc, но hbmk2 "не может найти библиотеку ps32"...

Dima: Sergy пишет: -lps32 // определение библиотеки Не знаю как в новой версии , но в старой достаточно было прилинковать TPSCRIPT.PRG , в старой версии либа не создавалась.

Sergy: Спасибо за наводку, попробовал прямую линковку tpscript.prg - получилось. Поковыряю ещё немного, добью, я думаю... Хочу типа "addon" оформить, чтобы чужого кода у меня в папке с сырцами приложения вообще не было. И чтобы в случае выхода новой версии pscript не вычищать из дебрей ничего, а просто накатить в hb\addon\ps32 свежие файлы и вуаля. Как, например, это сделано в LetoDB(f).

Pasha: Нескромный вопрос: а зачем сейчас использовать PageScript ? Я понимаю, лет 15 назад еще в клиппере это был способ windows печати. А сейчас в hbwin есть соответствующие средства печати, да и любая gui-библиотека имеет такие возможности. Зачем сейчас печатать через стороннее приложение ?

Dima: Pasha пишет: Нескромный вопрос: а зачем сейчас использовать PageScript ? [pre2] 1. Привычка :) 2. Меньше кода 3. Вывод в PDF , EMF 4. Предпросмотр печати (под WVT самое то) 5. На вскидку есть ряд функций которых нет в Hbwin и нужно писать и тестить свое под Hbwin 6. Достаточно много форм и отчетов реализовано (у меня) под PS32 , переделывать под Hbwin не хочется так как и так нормально работает. 7. Не плохо документировано. [/pre2]

Sergy: Pasha пишет: Нескромный вопрос: а зачем сейчас использовать PageScript ? Практически до 2016 года для печати бухгалтерских документов хватало имеющихся внутренних средств печати наподобие txt2gdi, txt2win и им подобных, которые одним шрифтом/размером фигачат целиком документ, разворачивая по необходимости страницу из портрета в ландшафт. Для разнообразных отчетов - все красивости Excel. Для ценников (повторяющаяся информация по заранее заданным шаблонам) - давно написана безотказно работающая утилита. Когда настал вопрос с печатью доверенностей (где половина текста идет под 90 градусов), стало понятно, что в этом разнообразии пора что-то менять. Сделал свой класс с набором примитивов: начать документ, задать толщину, нарисовать прямоугольник, выбрать шрифт, размер вывести в такую-то координату xy, завершить документ и тп. Из-за того, что PageScript был заброшен создателями, начал вывод через HPDF, всё заработало супер-гуд, кроме собственно печати документов. Sumatra-PDF прекрасно выводит его на экран, но печатает с дикими тормозами - пересылая на принтер как bitmap-картинку. Adobe Reader - имеет задокументированную опцию командной строки /t - распечатать и завершить работу. Печатает без проблем, но несколько лет назад разработчики решили, что этого мало и программа должна предложить юзеру что-нибудь ещё: аннотировать документ, послать его... в облако. Наваял процедуру, которая запускает процесс, ждет некоторое время, одновременно пытаясь удалить pdf файл - и... грохает порожденный процесс. Работает быстро, но... как-то коряво... После того, как в декабре проект PageScript "ожил" - за пару дней подключил его к своему классу. С точки зрения программы - вообще ничего не поменялось. Те-же самые примитивы, те-же самые координаты, те-же самые документы выводятся, только теперь иным способом. Все работает быстро и удобно, только бесплатный "черный ящик" в виде dll напрягает. Если будет поддерживаться и не будет глючить - оставлю его. Если нет - можно поковыряться и с печатью через wingdi, но там отдельно нужно будет думать, как делать preview на экране. Было-бы идеальное решение - все-бы давно сидели на нем...

Dima: Sergy пишет: Было-бы идеальное решение - все-бы давно сидели на нем... +1 Sergy пишет: Sumatra-PDF чем pdfFactory Pro не устраивает ?

Sergy: Dima пишет: чем pdfFactory Pro не устраивает ? Пока искал варианты печати, много что перепробовал, все без особого успеха: STDU Viewer, 3nity PDF viewer, Nitro PDF, PDFLite, PDF X-change и много много других... Возможно и PDFfactory был в том списке. Посмотрел на него только что - 100$ за рабочее место только чтобы печатать?

Dima: Sergy пишет: Посмотрел на него только что - 100$ за рабочее место только чтобы печатать? Ты же про Excel выше упомянул , я было подумал что он пиратский , тогда почему не юзать и эту прогу в "честном" пиратском варианте.... PS _http://fineprint.com/compare-products/

Sergy: Dima пишет: Ты же про Excel выше упомянул , я было подумал что он пиратский , тогда почему не юзать и эту прогу в "честном" пиратском варианте.... Экселю особо альтернатив нет. А тут - море разливенное.

Sergy: Дабы не плодить кучу тем, продолжу тут. PageScript обязывает указать одно/или двустороннюю печать в самом начале документа: PSBeginDoc(nPrinter, cTitle, nOrientation, nCopies, nPageSize, nDuplex, nPaperBin) -> nError Сначала никакой параметр туда не передавал, соотв. по умолчанию была односторонняя печать: DMDUP_SIMPLEX. При печати документа с более чем одной странице - из принтера с двусторонней печатью выходили несколько листов, распечатанных с одной стороны. При настройке SetDevice(DEV_PREVIEW) опция "выбрать двустороннюю печать" становилась серой, соотв. там включить ее вручную - тоже нельзя. Думаю, делов-то - включил всем принудительно DMDUP_VERTICAL или DMDUP_HORIZONTAL (в зависимости от Portrait/Landscape документа) и думать забыл про это. Через пару недель эксплуатации возникли вопросы иного рода: 1) каждая "односторонняя" бумажка сначала вылезает из принтера, потом снова в него засасывается и печатается с другой стороны. А это доооолго. 2) при печати мелких документов (например, складская накладная на выдачу 1-2 артикулов) обычно использовались "половинки" листов А4, скармливаемых через переднюю щель принтера. Теперь это нельзя делать, тк при двусторонней печати некоторые принтеры спотыкаются (из-за того, что лист короткий), а некоторые вообще отказываются брать любую бумагу через переднюю щель. В PSSetDevice(DEV_PREVIEW) опция "двусторонняя или односторонняя печать" по-прежнему серая. PSSetDuplex() тоже не поможет: to set the desired Duplex mode for printers that support Duplex printing. Call this procedure before starting a new document. Как-бы грамотно подступить к этому вопросу? Ведь до создания документа еще не ясно, сколько страниц на нем будет. "Заставить юзера при печати каждого документа указать, что ему нужно" - вариант какой-то... корявый...

Dima: Sergy пишет: Ведь до создания документа еще не ясно, сколько страниц на нем будет. При желании ты бы мог и просчитать сколько их будет .

Sergy: Dima пишет: При желании ты бы мог и просчитать сколько их будет . Да. Но желания дважды выполнять одну и ту-же работу нет. Думал, может есть вариант какой в PageScript использовать "настройки принтера", а не жестко задавать, причем заранее.

Sergy: Может кому актуально - на http://pagescript32.com/ обновилась версия - теперь это 3.0.4.119 Из добавленного официально: New: PSSetPWTopMost New: PSUnicodeChar - Prints a Unicode character at position X,Y using parameters New: PDF/A output Кроме того, обнаружил в pscript,ch новые константы: #define DEV_RTFFILE 6 // Print to RTF file #define DEV_JPGFILE 7 // Print to JPG file

Dima: Sergy Я так понял ты плотно подсел на новый Pagescript. Пока сижу на старом от abbylabs. Скажи плиз , новый PS32 стабилен и работает без глюков ? Я о версии 3.0.4.119



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