Форум » GUI » PDF файлы » Ответить

PDF файлы

Сергей Р: Григорий подскажи, нет ли в MiniGUI инструмента просмотра PDF файлов?

Ответов - 20

gfilatov: Сергей Р пишет: нет ли в MiniGUI инструмента просмотра PDF файлов? Есть См. рабочий пример в папке samples\Advanced\PDFReader Внимание: для работы примера требуется установленный acrobat reader 7.0 или выше.

Сергей Р: Спасибо Григорий, сейчас посмотрю.

Сергей Р: Все бы хорошо, но после второго вызова функции просмотра PDF файла получаю ошибку: DOGOVOR - oбнapужeнa oшибкa. Пpилoжeниe будeт зaкpытo. Пpинocим извинeния зa нeудoбcтвa. Дополнительные сведения: Пoдпиcь oшибки AppName dogovor.exe AppVer 1.1.1.2 ModName: unknown ModVer 0.0.0.0 Offset: 76b03864 В чем подвох? P.S. Акробат 8.0 стандарт.


gfilatov: Сергей Р пишет: после второго вызова функции просмотра PDF файла получаю ошибку Сергей Обратите внимание на освобождение ресурсов, которое в приведенном примере выполняется так ... ON RELEASE fCloseActivex()

Сергей Р: Григорий, вот пример, где вылезает ошибка. Тупо взял 2 файла из примера в MiniGUI, вызываю из окна и получаю ошибку w.pdf возьми любой. Windows XP Prof SP3 MiniGUI 1.6 Extended Edition (Build 67) - 2009.05.14 Harbour в поставке MiniGUI В чем подвох? #include "minigui.ch" STAT oWActiveX STAT oActiveX Procedure Main fPDF := "w.pdf" DEFINE WINDOW Win_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 400 ; TITLE 'Demo' ; MAIN DEFINE MAIN MENU POPUP "&Вызов" MenuItem 'PDF' Action PDFReader(fPDF) MenuItem 'Exit' Action Win_1.Release END POPUP END MENU END WINDOW ACTIVATE WINDOW Win_1 Return DECLARE WINDOW FORMPDFReader ******************** FUNC PDFReader(fPDF) SET NAVIGATION EXTENDED DEFINE WINDOW FORMPDFREADER ; AT 0, 0 ; WIDTH 800 HEIGHT 550 ; TITLE "PDF Reader" ; ICON 'ADOBE.ICO' ; ON INIT fOpenActivex(fPDF) ; ON SIZE Ajust() ; ON MAXIMIZE Ajust() ; ON RELEASE fCloseActivex() END WINDOW FORMPDFREADER.Center() FORMPDFREADER.Activate() RETU NIL ******************** Static Procedure fOpenActivex(fPDF) LOCAL cPDF *cPDF := "Criar Email Sapo.pt.PDF" cPDF := fPDF IF FILE(cPDF) oWActiveX := TActiveX():New(ThisWindow.Name, ; "AcroPDF.PDF.1", ; 0, ; 0, ; GetProperty(ThisWindow.Name, "width") - 02 * GetBorderWidth() - 1 , ; GetProperty(ThisWindow.Name, "height") - 05 * GetBorderHeight() - ; GetTitleHeight() - ; GetMenuBarHeight() ) oActiveX := oWActiveX:Load() oActiveX:LoadFile(cPDF) ELSE MsgStop("Отсканированный документ не найден") FORMPDFREADER.Release() ENDI Return ******************** STAT FUNC fCloseActivex() IF VALTYPE(oWActiveX) <> "U" oWActiveX:Release() ENDIF RETU NIL ******************** Static Procedure ajust() oWActiveX:Adjust() Return ******************** #include "hbclass.ch" #ifndef __XHARBOUR__ #xcommand TRY => bError := errorBlock( {|oError| break( oError ) } ) ;; BEGIN SEQUENCE #xcommand CATCH [<!oError!>] => errorBlock( bError ) ;; RECOVER [USING <oError>] <-oError-> ;; errorBlock( bError ) #endif CLASS TActiveX DATA oOle DATA hWnd DATA cWindowName DATA cProgId DATA nRow DATA nCol DATA nWidth DATA nHeight DATA nOldWinWidth DATA nOldWinHeight DATA bHide INIT .F. METHOD New( cWindowName, cProgId , nRow , nCol , nWidth , nHeight ) METHOD Load() METHOD ReSize( nRow , nCol , nWidth , nHeight ) METHOD Hide() METHOD Show() METHOD Release() METHOD Refresh() METHOD Adjust() METHOD GetRow() METHOD GetCol() METHOD GetWidth() METHOD GetHeight() ENDCLASS METHOD New( cWindowName , cProgId , nRow , nCol , nWidth , nHeight ) CLASS TActiveX if( empty( nRow ) , nRow := 0 , ) if( empty( nCol ) , nCol := 0 , ) if( empty( nWidth ) , nWidth := GetProperty( cWindowName , "width" ) , ) if( empty( nHeight ) , nHeight := GetProperty( cWindowName , "Height" ) , ) ::nRow := nRow ::nCol := nCol ::nWidth := nWidth ::nHeight := nHeight ::cWindowName := cWindowName ::cProgId := cProgId ::nOldWinWidth := GetProperty( cWindowName , "width" ) ::nOldWinHeight := GetProperty( cWindowName , "Height" ) Return Self METHOD Load() CLASS TActiveX local oError, bError local nHandle := GetFormHandle(::cWindowName) local xObjeto local OCX_Error := 0 AtlAxWinInit() ::hWnd := CreateWindowEx( nHandle, ::cProgId ) MoveWindow( ::hWnd , ::nCol , ::nRow , ::nWidth , ::nHeight , .t. ) xObjeto := AtlAxGetDisp( ::hWnd ) TRY ::oOle := CreateObject( xObjeto ) CATCH MsgInfo( oError:description ) END RETURN ::oOle METHOD ReSize( nRow , nCol , nWidth , nHeight ) CLASS TActiveX if !::bHide MoveWindow( ::hWnd , nCol , nRow , nWidth , nHeight , .t. ) endif ::nRow := nRow ::nCol := nCol ::nWidth := nWidth ::nHeight := nHeight ::nOldWinWidth := GetProperty( ::cWindowName , "width" ) ::nOldWinHeight := GetProperty( ::cWindowName , "Height" ) RETURN .T. METHOD Adjust() CLASS TActiveX Local nAuxRight , nAuxBottom nAuxRight := ( ::nOldWinWidth - ( ::nWidth + ::nCol ) ) nAuxBottom := ( ::nOldWinHeight - ( ::nHeight + ::nRow ) ) MoveWindow( ::hWnd , ::nCol , ::nRow , GetProperty( ::cWindowName , "width" ) - ::nCol - nAuxRight , GetProperty( ::cWindowName , "height" ) - ::nRow - nAuxBottom , .t. ) ::nWidth := GetProperty( ::cWindowName , "width" ) - ::nCol - nAuxRight ::nHeight := GetProperty( ::cWindowName , "height" ) - ::nRow - nAuxBottom ::nOldWinWidth := GetProperty( ::cWindowName , "width" ) ::nOldWinHeight := GetProperty( ::cWindowName , "Height" ) RETURN .T. METHOD GetRow() CLASS TActiveX RETURN ::nRow METHOD GetCol() CLASS TActiveX RETURN ::nCol METHOD GetWidth() CLASS TActiveX RETURN ::nWidth METHOD GetHeight() CLASS TActiveX RETURN ::nHeight METHOD Hide() CLASS TActiveX MoveWindow( ::hWnd , 0 , 0 , 0 , 0 , .t. ) ::bHide := .T. RETURN .T. METHOD Show() CLASS TActiveX MoveWindow( ::hWnd , ::nCol , ::nRow , ::nWidth , ::nHeight , .t. ) ::bHide := .F. RETURN .T. METHOD Release() CLASS TActiveX DestroyWindow( ::hWnd ) AtlAxWinEnd() RETURN .T. METHOD Refresh() CLASS TActiveX ::Hide() ::Show() RETURN .T. #pragma BEGINDUMP #include <windows.h> #include <commctrl.h> #include <hbapi.h> #include <hbvm.h> #include <hbstack.h> typedef HRESULT ( WINAPI *LPAtlAxWinInit ) ( void ); typedef HRESULT ( WINAPI *LPAtlAxGetControl ) ( HWND hwnd, IUnknown** unk ); HMODULE hAtl = NULL; LPAtlAxWinInit AtlAxWinInit; LPAtlAxGetControl AtlAxGetControl; static void _Ax_Init( void ) { if( ! hAtl ) { hAtl = LoadLibrary( "Atl.Dll" ); AtlAxWinInit = ( LPAtlAxWinInit ) GetProcAddress( hAtl, "AtlAxWinInit" ); AtlAxGetControl = ( LPAtlAxGetControl ) GetProcAddress( hAtl, "AtlAxGetControl" ); ( AtlAxWinInit )(); } } HB_FUNC( ATLAXWININIT ) { _Ax_Init(); } HB_FUNC( ATLAXWINEND ) { if( hAtl ) FreeLibrary( hAtl ); } HB_FUNC( ATLAXGETDISP ) // hWnd -> pDisp { IUnknown *pUnk; IDispatch *pDisp; _Ax_Init(); AtlAxGetControl( (HWND)hb_parnl( 1 ), &pUnk ); pUnk->lpVtbl->QueryInterface( pUnk, &IID_IDispatch, ( void ** ) &pDisp ); hb_retnl( (LONG)pDisp ); } HB_FUNC_STATIC( CREATEWINDOWEX ) // hWnd, cProgId -> hActiveXWnd { HWND hControl; hControl = CreateWindowEx( 0, "AtlAxWin", hb_parc( 2 ), WS_VISIBLE|WS_CHILD, 0, 0, 0, 0, (HWND)hb_parnl( 1 ), 0, 0, NULL ); hb_retnl( (LONG) hControl ); } #pragma ENDDUMP

Сергей Р: Люди помогите, работа стоит. Что делать с этой байдой? Поставить черный крест и забыть как страшный сон?

gfilatov: Сергей Р пишет: Что делать с этой байдой? Сергей! Есть альтернатива этому примеру - использовать demo4.prg из папки samples\Basic\ActiveX. #include "minigui.ch" FUNCTION Main() DEFINE WINDOW Win1 ; AT 0,0 ; WIDTH 800 ; HEIGHT 500 ; TITLE 'HMG ActiveX Support Demo' ; MAIN ; ON MAXIMIZE ( Win1.Test.Width := (Win1.Width) - 100, Win1.Test.Height := (Win1.Height) - 100 ) ; ON SIZE ( Win1.Test.Width := (Win1.Width) - 100, Win1.Test.Height := (Win1.Height) - 100 ) ; ON RELEASE Win1.Test.Release DEFINE MAIN MENU POPUP "Test" MENUITEM "Open File" ACTION Test() END POPUP END MENU DEFINE ACTIVEX Test ROW 10 COL 50 WIDTH 700 HEIGHT 400 PROGID "AcroPDF.PDF.1" END ACTIVEX END WINDOW Center Window Win1 Activate Window Win1 RETURN NIL Procedure Test() Win1.Test.Object:src := "c:\minigui\samples\advanced\pdfreader\Criar Email Sapo.pt.PDF" Return #include "ActiveX.prg" Этот пример гарантированно работает с Acrobat 7.0 (проверял на WinXP Home SP1).

Сергей Р: Спасибо Григорий, щас попробую.

Сергей Р: Григорий выручай, при сборке выдает: Unresolved external "_hb_ storvnl" referenced from ...... Не могу понять, какой библиотеки не хватает?

gfilatov: Сергей Р пишет: какой библиотеки не хватает? Дело не в библиотеке - надо просто обновить Харбор

Сергей Р: Теперь выдает : Unresolved external '_hb_vmProcessSymbolsEx' referenced from ... и Unresolved external '_dummy' ...

gfilatov: Сергей Р пишет: Теперь выдает : Не мучайся, а просто обновись до свежей сборки 77 и пробни на ней

Сергей Р: Поставил 77 сборку. Те же две неразрешенные _hb_vmProcessSymbolsEx и _dummy.

gfilatov: Сергей Р пишет: две неразрешенные _hb_vmProcessSymbolsEx и _dummy Значит, остался в проекте код, который НЕ был откомпилирован обновленным Харбором (в виде OBJ или пользовательской библиотеки). Нужно пересобрать ВСЕ исходники

Сергей Р: Спасибо Григорий, помогло. Дальше буду разбиться почему не показывает файл.

Сергей Р: Григорий, напомни пожалуста какой функцией узнать полный путь к файлу в текущей директории. Досовская dirname() режет длинные имена.

gfilatov: Сергей Р пишет: какой функцией узнать полный путь к файлу в текущей директории Попробуй cPath := DISKNAME()+':\'+Curdir()

Сергей Р: Путь получается такой: C:\DOCUME~1\SERGST~1\0016~1\CF8F~1\007 что не есть хорошо. Тоже самое как и dirname()

gfilatov: Сергей Р пишет: Тоже самое как и dirname() Хорошо Тогда так cCurDir := GetCurrentFolder()

Сергей Р: Спасибо Григорий. Функция работает замечательно. Но у меня получилась какая-то байда. Если делаю сборку через Compile.Bat, то C:\Documents and Settings\sergstack\Paбoчий cтoл а если собираю через xMate, то C:\DOCUME~1\SERGST~1\0016~1 Где-то не хватает каких-то параметров при сборке что ли.



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