Форум » [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

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

Dima: Все , разобрался. Прицепил к проге.

Dima: Кто то работает с PageScript под Harbour , или только я один ? Есть вопросик. Функция PSBitmap нормально растягивает картинку по заданным координатам. Но понадобилось печать выводить в PDF формате. В PageScript есть такая возможность через PSSetDevice(3) , все выводится красиво но вот с PSBitmap проблема и изображение не растягивается как следует по горизонтали. То есть грубо говоря если я хочу вписать картинку в прямоугольник шириной 100 мм , то картинка (при PSSetDevice(3)) впишется только в ширину 90 мм. По высоте все чётко. Если выводить на просмотр средствами PageScript или сразу на печать , такой проблемы нет.

gfilatov2002: Dima пишет: Кто то работает с PageScript под Harbour В продолжение темы - PageScript теперь живет по адресу http://pagescript32.com/ и поддержка PDF в его движке существенно переработана и исправлена. Новые владельцы этого продукта обещают уже скоро анонсировать новую версию этой DLL. Кстати, будет обеспечена поддержка 64-битной версии также. Если это будет интересно, то смогу включить их базовый тестовый пример в новую сборку Минигуи. Ваши комментарии приветствуются


Dima: gfilatov2002 Интересно конечно. А кроме HTML хелпа , где то есть страница с загрузкой самого PS32 ? Или снова за бабки ? ))

gfilatov2002: Dima пишет: где то есть страница с загрузкой самого PS32 Они обещают первую бету раздавать бесплатно, когда она будет готова (адрес выложат на сайте выше). А последующие версии будут платные Я сейчас тестирую такую предварительную версию, и впечатления - приятные, но размер подключаемой DLL увеличился примерно на 1 МБайт за счет полной переработки поддержки PDF формата.

Dima: gfilatov2002 Разработчики те же ? На каком языке кодят ( ранее был Delphi ) ?

gfilatov2002: Dima пишет: Разработчики те же ? Нет, права на эту библиотеку выкупила голландская фирма. Dima пишет: На каком языке кодят ( ранее был Delphi ) ? Да, это Дельфи. Дополнение о новом компоненте PDF - теперь используется eDocEngine VCL 5 версии (последний билд).

gfilatov2002: gfilatov2002 пишет: смогу включить их базовый тестовый пример в новую сборку Минигуи. Выложил для ознакомления этот тестовый пример по адресу: http://hmgextended.com/files/MISC/ps32demo.zip Ваши комментарии приветствуются

Dima: gfilatov2002 пишет: Ваши комментарии приветствуются TRIAL и TRAIL это же разные вещи В демке живет именно TRAIL PS TNFSF10 (чаще обозначается как TRAIL) входит в многочисленное семейство факторов некроза опухоли

Dima: gfilatov2002 В целом все нормально. Ранее помнится был еще и TPSCRIPT.PRG , теперь его не будет ?

gfilatov2002: Dima пишет: В целом все нормально Dima пишет: был еще и TPSCRIPT.PRG , теперь его не будет ? Будет, конечно. Ведь в него добавлены переходники для новых функций, которые, кстати, используются в демке

MIKHAIL: Крутая вещь ! А можно прикрутить к консольному Harbour ?

Dima: MIKHAIL пишет: А можно прикрутить к консольному Harbour ? Конечно. У меня давно работает.

MIKHAIL: Dima можешь мне скинуть рабочую версию и если есть описание ?

Dima: MIKHAIL https://web.archive.org/web/20150201213531/http://abeelabs.com/downloads/PS32.zip Описание где то я выкладывал , сейчас поищу https://cloud.mail.ru/public/2yaSnFYj5xHU/Guides.rar

Dima: MIKHAIL Стянул ?

MIKHAIL: Dima пишет: Стянул ? Нет, какая то ссылка странная. Сам сервер http://abeelabs.com не работает...

Dima: MIKHAIL Ссылка нормальная Вот она без подчерка впереди _https://web.archive.org/web/20150201213531/http://abeelabs.com/downloads/PS32.zip PS Я сливал сегодня по ней , всё норм.

MIKHAIL: Dima пишет: https://web.archive.org/web/20150201213531/http://abeelabs.com/downloads/PS32.zip Спасибо скачал. Там есть инструкции как подключать к проекту ?

Dima: MIKHAIL [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] Правда мне пришлось подправить сырец , вот так [pre2] METHOD TPageScript:Init() ::bWaterMark := NIL // Codeblock for Watermark function ::nWaterMark := AWM_NONE // Indicates if the WaterMark is to be printed foreground or background ::lFromDialog := .f. // Indicates if printer selected from printer dialog ::lClipper := .f. // Indicates if calls to TextOut and TextBox should be compatible with PageScript for Clipper ::nUnit := APS_MILL // Default unit is MILLIMETERS ::aPrinters := {} // List of available printers ::nError := PSE_NOERROR // Indicates an error condition, such as no printer available ::aDocInfo := {0, "", "", APS_PORTRAIT, 1, APS_COURIER} // Print job info array ::hDll := DllLoad("PScript.dll") // Handle of the .DLL if ::hDll == nil//0 ::nError := PSE_DLLNOTLOADED // DLL not loaded error else ::nError := DllCall(::hDll, DLL_STDCALL, "PSInit") // No error, set the coordinate system to TOP/LEFT (Default) if ::nError == PSE_NOERROR DllCall(::hDll, DLL_STDCALL, "PSSetCoorSystem", APS_TOPLEFT) endif endif Return Self [/pre2] + ихний DLLCALL.C не использую + вверху сырца у меня так [pre2] #ifdef __HARBOUR__ // 02.06.2005 - IBTC - changed for xHarbour Builder: #xtranslate Method <Classname>:<x> => Method <x> #include "hbclass.ch" #include "Dll.ch" #else #include "Xbp.ch" #include "Dll.ch" #endif [/pre2]

Dima: Кстати в сырцах Harbour глянь \core-master\extras\ps32\

Sergy: gfilatov2002 пишет: Ваши комментарии приветствуются Добрый день. Разрешите неск. вопросов: 1) Взял бету с pagescript32.com, погонял тестовый пример - обратил внимание, что после закрытия Print Preview теряется фокус основного окна программы. Приходится возвращаться щелчком мыши или ALT+TAB. Это только у меня? Windows 7 x64. Можно вылечить? 2) Окно Print Preview можно как-то вызывать БЕЗ диалога выбора принтера? Долго искал, как посмотреть результат, не тратя бумагу, сохранял/переоткрывал pdf, пока не понял, что окно выбора принтера выскакивает, но вместо печати за ним идет просмотр... 3) На форуме _https://groups.google.com/forum/#!topic/harbour-users/gnUs9XMBygg некто Richard Visscher утверждает, что PageScript32 будет бесплатным для зарегистрированных пользователей. Что-то изменилось в ценовой политике с августа? Если нет - какие ждать цены, есть информация по предыдущим версиям ? Спасибо.

Dima: Тоже интересно

gfilatov2002: Sergy пишет: после закрытия Print Preview теряется фокус основного окна программы По-видимому, это проблемы взаимодействия с консолью. Для GUI-приложений такой проблемы нет. Sergy пишет: вызывать БЕЗ диалога выбора принтера? Нет, вызов этого диалога намертво зашит в pagescript DLL Sergy пишет: Richard Visscher утверждает Это новый собственник и разработчик PageScript32 Как он и обещал, он раздает первую публичную бетку DLL версии 3.4.0.105 бесплатно (как рождественский подарок ) Последующие версии, вероятнее всего, будут платными

Dima: Sergy пишет: обратил внимание, что после закрытия Print Preview теряется фокус основного окна программы чеканул с последней версией с сайта abeelabs , с фокусом все нормально

Sergy: С некоторыми вопросами немного разобрался: + Если использовать gtwvg - с фокусом окна Preview все ок. Гуд + Посмотрел внимательнее - Preview вызывается без диалога принтера. Ничего там не "зашито". ? Сколько все-таки стоил PageScript в "свое время" и как лицензировался: по разработчику или по рабочим местам ? Возник следующий: Как-то уже "привык", что сначала я формирую какой-то отчет, а потом предлагаю юзеру - куда его вывести: на экран/принтер/в файл. Без разницы, что это: простой текст, XLS, PDF, DOC. PageScript заставляет указать устройство вывода заранее - ДО СОЗДАНИЯ самого тела документа. Логически я это понимаю: у разных устройств может быть разное разрешение, разные рабочие шрифты, соотв. документ МОЖЕТ выглядеть по-иному. Кто как решал данный вопрос? Пока что приходит в голову: вместо "прямых" вызовов PSSetFontSize(), PSLine(), PSFrame() и тп... накапливать их некий массив блоков кода, например так: вместо PSSetFontSize(5) => AADD(aQueue, {||PSSetFontSize(5)}) вместо PSLine(x1,y1,x2,y2) => AADD(aQueue, {||PSLine(x1,y1,x2,y2)}) и тп... после чего = запросить юзера, чего он хочет и "циклом по массиву" выполнить все вызовы. Но в этой идее не будут "работать" переменные - нужно заменить их конкретным значением в момент помещения в очередь... Коряво как-то... И непонятно, как тогда обрабатывать необходимые значения некоторых функций - например, ширину текста в пикселях... Что-бы придумать в такой ситуации? Хочется сохранить привычную логику работы программы, вне зависимости от типа документа.

Dima: Sergy пишет: и как лицензировался по разработчику или по рабочим места Вот что удалось вытащить https://cloud.mail.ru/public/84NB/NTE4TahxH ЗЫ Цена была если мне память не изменяет где то в районе 200 $ (+-50 $)

Dima: Sergy пишет: PageScript заставляет указать устройство вывода заранее - ДО СОЗДАНИЯ самого тела документа Это можно обойти (если я верно понял вопрос) , так как устройство задается в PSBeginDoc , первым параметром. Поэтому можно до формирования тела документа , запросить доступные принтера + туда же в менюху сунуть и устройство (предпросмотра). На вскидку так , выкинь лишнее :) [pre2] #include "pscript.ch" Func Aprints(nm) local aprinters local bppm:=0 local i hb_default(@nm,"Выберите принтер") if Psinit()==0 aprinters:=APSGetPrinter() for i=1 to len(aprinters) aprinters[ i ]:=" "+aprinters[ i ]+" " next if len(aprinters)>1 bppm:=boxmenu(aprinters,; 10,20,11,21,nm,; Psgetdefprinter(),3,"bg+/b,n/gr*,,,w/b*") elseif len(aprinters)==1 bppm:=1 else soob("Не найдено ни одного принтера.....","r/r","gr+/r") endif else soob("PageScript не загружен...........","r/r","gr+/r") endif return bppm ************ Func APSGetPrinter() local ret:={} local nn:=PSGetPrinterCount() local i for i=1 to nn aadd(ret,PSGetPrinterNames(i)) next return ret [/pre2]

Sergy: Dima пишет: Это можно обойти (если я верно понял вопрос) , так как устройство задается в PSBeginDoc , первым параметром. Я не очень понятно объяснил, сорри... До знакомства с PageScript у меня было так: Сначала создается сам документ в виде файла (txt, xls, doc, pdf), а затем вызывается диалог с юзером, где предлагается: "куда его выводить: экран/принтер/файл". Стандартно и единообразно. Обработчик вывода на экран, скажем для txt и xls, разумеется, разные. Вот и сижу чешу репу, как быть: вместе с каждым документом, которые планирую готовить через PageScript придется переделывать логику диалога с юзером: сначала "куда выводить", потом формирование тела и собственно, вывод. А если юзер захочет сначала "на экран", а потом "на принтер" - тогда тело документа будет пересоздаваться дважды. А по ходу создания некоторых отчетов открываются/закрываются таблицы, устанавливаются фильтры/relation и куча прочей мути...

Dima: Sergy пишет: Сначала создается сам документ в виде файла (txt, xls, doc, pdf) У меня иначе , для отчетов (к примеру) , вызывается диалог в котором задаются условия формирования и там же указывается формат отчета (txt, xls, doc, pdf) Надо будет мне доку полистать нового PS32 , может что то есть в этом плане , что тебе нужно.

Sergy: Кстати заметил, что при любой ошибке в программе во время подготовки документа, дело завершается не только стандартным RTE, но и полным крэшем с созданием "hb_out.log", а Windows "пытается найти способ решения проблемы и предлагает обратиться к разработчику"... Половинчатое решение содержится в таком коде: [pre2]* ----------------------- * EXIT PROCEDURE PS32Finish() // PSEndDoc() // RETURN[/pre2]Почему половинчатое? Потому что недокументировано. Фиг с ним, с частично заполненным листом бумаги, вылезающим из принтера после RTE. Странно другое - PSAbort() в данном случае не помогает, программа точно так-же крэшится, как и без EXIT PROCEDURE.

Dima: Сыроват однако новый PS32 или мне так кажется ? У меня с прежним таких бяк не было. Код примерно такой [pre2] if PSInit() == 0 PSSetClipperComp(.t.) PSSetPageSize(DMPAPER_A4) PSBeginDoc(NPrint) PSSetUnit(APS_MILL) ***** какой то код PSEndDoc() else Soob("PageScript не загружен........","r/r","gr+/r") endif [/pre2]

Sergy: Dima пишет: Сыроват однако новый PS32 или мне так кажется ? Мне особо не с чем сравнить, ты сам то работаешь с новой версией или со старой, провернной ? Попробуй туда, где ... какой-то код поставить что то вроде: ... x := "text string" x++ ... Интересно посмотреть, что будет. Да, забыл уточнить: у меня -mt и gtwvg.

Dima: Sergy пишет: со старой, провернной ? с ней старушкой Sergy пишет: Да, забыл уточнить: у меня -mt и gtwvg. и у меня Sergy пишет: x := "text string" x++ Счас пробну :)

Dima: Dima пишет: Счас пробну :) Получил BASE 1086 , неверный аргумент ++

Dima: И далее как ты описал А не бывает такого у меня так как код отлажен.

Sergy: Dima пишет: Получил BASE 1086 , неверный аргумент ++ И далее как ты описал Значит дело не в "новизне" версии. А не бывает такого у меня так как код отлажен. Круто. У кого нет ошибок в коде - пусть кинет в меня камень ? Развивать дальше ты его не собираешься? Уверен на 200% в отсутствии своих ошибок в дальнейшем? Даже если нет ошибок в твоем коде - их нельзя исключать в окружении: драйвер/память/сеть - неужели не глючат никогда ? А под столом кто-нить пнет ногой системник и из него вывалится на соплях державшийся кабель? Не то, чтобы я жути нагоняю, но RTE - это предсказуемый и контролируемый ядром Harbour процесс корректного (по возможности) завершения всех запущенных процессов, закрытия таблиц, устройств и тд и тп... Крэш, аналогичный вызываемому - это пздц с точки зрения сохранности данных и стабильности работы с системой. Возникает в узле внешнего устройства (принтера в данном случае). К чему приведет - никто не знает. Уверен, что нужно всеми средствами избегать подобной ситуации. Не смог найти форума поддержки PageScript32. Такой есть в природе?

Dima: Sergy пишет: Развивать дальше ты его не собираешься? Пока устраивает то что есть. Sergy пишет: Уверен на 200% в отсутствии своих ошибок в дальнейшем? Нет не уверен , но если нахожу (находят) то фиксю.

Dima: Sergy пишет: Не смог найти форума поддержки PageScript32 Можно пробнуть сюда написать support@pagescript32.com Sergy пишет: Крэш, аналогичный вызываемому - это пздц с точки зрения сохранности данных и стабильности работы с системой Ты в этом уверен ? Мне кажется что после RTE Harbour , сама прога нормально завершается (ну типа с закрытием баз и тд и тп) а далее начинает завершаться сама DLL со своими ошибками , она ж вроде на делфи. Как вариант можно обернуть у себя весь код PS32 начиная с PSINIT в Begin Seguence PS Что то мне кажется что FastReport поведет себя так же в случае RTE в консольной Harbour проге.

Andrey: Dima пишет: Что то мне кажется что FastReport поведет себя так же в случае RTE в консольной Harbour проге. Часто при отладке в МиниГуи форма FastReport ведёт себя непредсказуемо (я писал об этом здесь), приходиться снимать задачу через менеджер задач. Базы после этого ни разу не портились. На терминалке, при отладке формы тоже при ошибках вываливалась прога. Поставил простой обработчик ошибок для вывода функций для FastReport [pre2] BEGIN SEQUENCE WITH { |e|break( e ) } RECOVER USING oError END SEQUENCE[/pre2] и всё... проблемы исчезли... Если форму FastReport отладил - то работает как часы, пока никто не жаловался. Единственно FastReport критичен для принтеров Херокс на ХР, у меня такое было на одном пользователе. Там что то с печатью хитро получилось, со всех программ печатает, а с FastReport нет.

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

Sergy: Да, работаю на версии 4.119 Работает стабильно, но по необъяснимым причинам иногда на одном-двух рабочих местах возникает GPF с кодом ошибки 6005 - DLL модуль вываливается при вызове BeginDoc(). Как понимаю, какая-то беда с драйвером принтера на конкретной машине. Была, к примеру, такая фигня на вроде-бы "спокойной" машине после замены на ней принтера (вместе с драйверами, разумеется). Переписывался с автором - он не может ничем помочь, тк хочет самодостаточный пример... Пока заставил админа пройти по всем проблемным машинам и обновить драйвера. С прежних 1-2 ошибок в неделю число GPF уменьшилось до 1-2 в месяц. Не по фэн-шую, конечно, но пока других вариантов нет.

Dima: Sergy пишет: Работает стабильно, но по необъяснимым причинам иногда на одном-двух рабочих местах возникает GPF У меня тоже бывает , одна из причин не хватка свободного места на системном диске + принтер HP , после чистки ошибка сразу уходит.

Sergy: Dima пишет: У меня тоже бывает , одна из причин не хватка свободного места на системном диске + принтер HP , после чистки ошибка сразу уходит. Нужно будет у меня посмотреть, что с этим параметром... Еще заметил, что фигня происходит на RDP, когда юзеры подключаются со "своими" принтерами. Сказал админу, чтобы всем RDP-юзерам настроил по умолчанию MS XPS Writer. Кол-во GPF значительно уменьшилось.

Dima: Sergy А как ты регулируешь поля при печати ? В основном у меня печать на всех принтерах идет нормально а вот на Hp1020 , съедает то левую сторону документа то правую

Sergy: Dima пишет: А как ты регулируешь поля при печати ? Пока работал с HPDF - проблем не было вообще: задал размер документа 297*210 и не паришься ни о чем. 95% PDF-viewer'ов по умолчанию масштабируют итоговое изображение на конкретный принтер. А вот вместе с PageScript32 я "пооооонял", что физический размер бумаги и область печати - это вообще совершенно разные значения. Сначала, как вариант, думал прочитать размер области печати из свойств принтера и внутри "своего" класса включить автомасштаб... Потом решил, что проще сразу ограничить ширину документа по узкой стороне на 199мм. Этого хватило на весь наш зоопарк. Заодно вопрос с оставшимися 5% PDF-viewer'ов закрылся сам собой.

Dima: Sergy Вопрос такой по PS32... Номер принтера я сразу указываю в PSBeginDoc() У себя проверял дома (все принтера локальные) , при смене принтера в программе печать идет именно на него. А вот на оффисе не понятки , там есть сетевые принтера и после выбора одного из них , печать почему то уходит на Microsoft XPS Document Writer (как правило) . В новом PS32 есть такая проблема ?

Dima: PS Тесты показали что глючит исключительно на Windows XP

Sergy: Dima, с того момента, как я узнал про win_PrinterList() - я перестал обращаться к принтерам по номерам. Совсем. Ибо давным-давно наступил на те самые грабли, о которых ты пишешь. Про PageScript я тогда даже и не слышал. Задаю принтер только по его имени. В одном из офисов, например, их целый зоопарк: один настольный (расшаренный), два сетевых. 5 компов. Проблем с переключением вообще никаких. Все печатают откуда угодно на какой угодно принтер.

Dima: Sergy Интересно а как ты задаешь его по имени в PS32 , если везде где он задается используется именно номер принтера.

Sergy: В настройках каждой рабочей копии программы сохраняю именно имя принтера, а не цифру. 1) При запуске печати по заданному имени проверяю - присутствует ли он в win_PrinterList() и является ли принтером по умолчанию - win_PrinterGetDefault(). 2) Если нет - переставляю перед началом печати документа через win_PrinterSetDefault(). 3) В PSBeginDoc() первым параметром всегда передаю NIL (печатать на дефолтный). 4) После печати - возвращаю дефолтный принтер "назад" (если было его изменение). bullet-proof

Dima: Sergy Хитро ты выкрутился

Dima: Sergy А в проге у тебя какая кодировка , 866 ? Ведь все эти функции WIN_Printer* результат возвращают в кодировке 1251 , и если не сделать перекодировку то принтера имеющие в названиях кирилицу , вместо кирилицы покажут вопросики. С win_PrinterList() и win_PrinterGetDefault() я так и поступил. Примерно так [pre2] Func My_WIN_PRINTERLIST() local alist:={} local i hb_cdpSelect( "RU1251" ) alist:=WIN_PRINTERLIST() if len(alist)#0 for i=1 to len(alist) alist[ i ]:=hb_ansitooem(alist[ i ]) next endif hb_cdpSelect( "RU866" ) return alist [/pre2] Вопрос такой , в win_PrinterSetDefault() тоже имя передавать в RU1251 c временной сменой кодировки ? Я конечно поиграюсь и выясню , просто если готовый ответ я сэкономлю некоторое время а его не так много при средней продолжительности жизни Проехали по вопросу , поиграл , выяснил.

Dima: Sergy Кстати твой фокус не сработал под Win7 + PS32 от AbbeLabs , упорно печатает на принтер по умолчанию который был при запуске программы , под XP возможно и сработает , проверить не где. Sergy пишет: 3) В PSBeginDoc() первым параметром всегда передаю NIL (печатать на дефолтный). Так и делал в тестах. Еще и проверил меняется ли принтер по умолчанию (если его менять с win_PrinterSetDefault) - да меняется , но печатает на тот что я описал выше.

Sergy: Dima Кодировка программы 866, во всех вызовах к API винды/офиса/принтеров использую hb_Translate(cString,"RU866","RU1251"). Получается, что "старый" PageScript32 где-то у себя "запоминает" при инициализации дефолтный принтер и печатает на него.

Dima: Что то глючит PSINIT на Вин10 [pre2] Called from DLLCALL(0) Called from TPAGESCRIPT:INIT(266) in TPSCRIPT.PRG [/pre2] При чем первый раз может упасть а потом все работает ровно. Куда копать ? PS На винде ниже 10 все работает ровно [pre2] METHOD TPageScript:Init() ::bWaterMark := NIL // Codeblock for Watermark function ::nWaterMark := AWM_NONE // Indicates if the WaterMark is to be printed foreground or background ::lFromDialog := .f. // Indicates if printer selected from printer dialog ::lClipper := .f. // Indicates if calls to TextOut and TextBox should be compatible with PageScript for Clipper ::nUnit := APS_MILL // Default unit is MILLIMETERS ::aPrinters := {} // List of available printers ::nError := PSE_NOERROR // Indicates an error condition, such as no printer available ::aDocInfo := {0, "", "", APS_PORTRAIT, 1, APS_COURIER} // Print job info array ::hDll := DllLoad("PScript.dll") // Handle of the .DLL if ::hDll == nil//0 ::nError := PSE_DLLNOTLOADED // DLL not loaded error else ::nError := DllCall(::hDll, DLL_STDCALL, "PSInit") вот тут падает // No error, set the coordinate system to TOP/LEFT (Default) if ::nError == PSE_NOERROR DllCall(::hDll, DLL_STDCALL, "PSSetCoorSystem", APS_TOPLEFT) endif endif Return Self [/pre2] В логах ошибок вот такая срань Неисправимая ошибка  6005: Exception error: Exception Code:0EEDFADE Exception Address:74F7AB32 EAX:009FF010 EBX:00D03E40 ECX:00000007 EDX:00000000 ESI:00000000 EDI:00D03C20 EBP:009FF06C CS:EIP:0023:74F7AB32 SS:ESP:002B:009FF010 DS:002B ES:002B FS:0053 GS:002B Flags:00000212 Exception Parameters: 00CC04F2 00D03E74 00D03E40 00000000 00D03C20 009FF134 009FF0A0 CS:EIP: 8B 4C 24 54 33 CC E8 A3 49 00 00 8B E5 5D C2 10 SS:ESP: 0EEDFADE 00000001 00000000 74F7AB32 00000007 00CC04F2 00D03E74 00D03E40 00000000 00D03C20 009FF134 009FF0A0 00D03E70 00CC1704 00000000 00000000

MIKHAIL: Dima пишет: ::nError := DllCall(::hDll, DLL_STDCALL, "PSInit") вот тут падает Я с PS не работал, но имел похожую ошибку при работе с DllCall, когда в функцию передаются еще какие либо параметры и их размер менее требуемого в вызываемой функции. Глянь доку, может функция принимает какие либо параметры... передай пустые значения для строковых space(50) например

Sergy: PageScript32 падает у меня с вероятностью 1:100 - под Win7 и Win10. Причем не RTE, а качественный крэш с hb_out.log. Либо в PSIniit, либо рядом - PSSetOrientation. Если на одной машине два раза за одну неделю такая петрушка - прошу админа переустановить дрова принтера. Помогает. Писал разработчику - он говорит, что такого ни у кого не бывает. А если и будет, по дампу памяти и hb_out.log он помочь не в состоянии - нужна воспроизводимость ошибки. :(

Dima: Sergy пишет: Причем не RTE, а качественный крэш с hb_out.log. Аналогично а само окно программы просто тихо схлопывается

Dima: [pre2] 31-12-2021 - Next update will get the following new functions: - PDF signing for new and existing PDF files - PDF printing from code and new preview window - New preview window which can be used seperate or used non-modal from PS Check this page next month for the beta version, happy new year ! [/pre2]

fil: Не понял, а почему этот xbp.ch не скачать https://searchcode.com/codesearch/view/4517222/

gfilatov2002: Dima пишет: Check this page next month for the beta version 14.04.2023 - Version 4 update : - PDF signing for new and existing PDF files - PDF printing from code and new preview window - New preview window which can be used seperate or used non-modal from PS - Includes version 3(3.0.4.178) and version 4 ( 4.0.1.157) 32 and 64 bit DLL

gfilatov2002: На сайте https://www.pagescript32.com снова обновление: PsViewer 1.2 - 04.05.2023 Pagescript standalone PDF Viewer 1.2 ------------------------------------- Parameters : 1 -> PDF filename ( use full path if not in same directory as exe ) 2 -> (true -> Disable save/saveas/close in menu 3 -> left position viewer 4 -> top position viewer 5 -> formstyle top = alwaysonTop default = normal * Fixed - starting position of viewer will be saved and used on next usage - if parameters 4 and 5 are used this will be the default



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