Page 2 of 2
Re: error interno FWH
Posted: Tue Feb 12, 2013 9:24 am
by Antonio Linares
carlos vargas wrote:me parece que ::oWnd : NIL debe se la ultima linea antes del true final.
::oImageList es un objeto que por lo general esta asociado a un hWnd, y pienso en este caso que debe estar usando el oWnd:hWnd , y al ser oWnd ya nil, puede reventar.
Code: Select all
VALID ( ::oWnd:oIcon := nil ,;
::oFont:End() ,;
::oMeta1:End() ,;
::oMeta2:End() ,;
::oDevice:End() ,;
::oHand:End() ,;
If( Empty( ::oImageList ),, (::oImageList:End(), ::oImageList := nil ) ),;
::oWnd := nil ,;
::lExit := .t. ,;
salu2
Carlos,
buena sugerencia, incluida para el próximo build, gracias!
Re: error interno FWH
Posted: Tue Feb 12, 2013 9:34 am
by elvira
Antonio,
¿Y cómo puedo saber cuándo el informe se está mostrando?.
Por ejemplo, en samples\report.prg
Code: Select all
// Testing FiveWin built-in report engine and print preview
#include "FiveWin.ch"
#include "Report.ch"
static oWnd
function Main()
local oBar, oCursorHand
DEFINE WINDOW oWnd ;
TITLE "Testing FiveWin Report-Engine and Print-Preview" ;
MENU BuildMenu()
DEFINE BUTTONBAR oBar _3D SIZE 26, 27 OF oWnd
DEFINE BUTTON OF oBar FLAT TOOLTIP "Generate report" ;
ACTION DoReport() RESOURCE "Report"
DEFINE BUTTON OF oBar FLAT GROUP TOOLTIP "Exit" ;
ACTION oWnd:End() RESOURCE "Exit"
DEFINE CURSOR oCursorHand HAND
AEval( oBar:aControls, { | o | o:oCursor := oCursorHand } )
DEFINE MESSAGE BAR OF oWnd TITLE FWCOPYRIGHT ;
NOINSET DATE CLOCK KEYBOARD
ACTIVATE WINDOW oWnd ;
VALID MsgYesNo( "Want to exit ?" )
return nil
function BuildMenu()
local oMenu
MENU oMenu
MENUITEM "&Generate Report" ACTION DoReport() ;
MESSAGE "Open customers database and generate a report"
MENUITEM "&Exit" ACTION oWnd:End() ;
MESSAGE "Terminate the application and exit"
ENDMENU
return oMenu
function DoReport()
local oRpt
USE Customer
REPORT oRpt PREVIEW
COLUMN TITLE "First" DATA Customer->First
COLUMN TITLE "Last" DATA Customer->Last
COLUMN TITLE "State" DATA Customer->State
END REPORT
ACTIVATE REPORT oRpt
USE
return nil
En este sample, si cierro la WndMain con el Preview abierto casca.
¿Tu cambio arreglaría esto?.
Gracias.
Re: error interno FWH
Posted: Tue Feb 12, 2013 10:16 am
by Antonio Linares
Esta, por ejemplo, sería una forma:
Code: Select all
// Testing FiveWin built-in report engine and print preview
#include "FiveWin.ch"
#include "Report.ch"
static oWnd, lPreview := .F.
function Main()
local oBar, oCursorHand
DEFINE WINDOW oWnd ;
TITLE "Testing FiveWin Report-Engine and Print-Preview" ;
MENU BuildMenu()
DEFINE BUTTONBAR oBar _3D SIZE 26, 27 OF oWnd
DEFINE BUTTON OF oBar FLAT TOOLTIP "Generate report" ;
ACTION DoReport() RESOURCE "Report"
DEFINE BUTTON OF oBar FLAT GROUP TOOLTIP "Exit" ;
ACTION oWnd:End() RESOURCE "Exit"
DEFINE CURSOR oCursorHand HAND
AEval( oBar:aControls, { | o | o:oCursor := oCursorHand } )
DEFINE MESSAGE BAR OF oWnd TITLE FWCOPYRIGHT ;
NOINSET DATE CLOCK KEYBOARD
ACTIVATE WINDOW oWnd ;
VALID ! lPreview .and. MsgYesNo( "Want to exit ?" )
return nil
function BuildMenu()
local oMenu
MENU oMenu
MENUITEM "&Generate Report" ACTION DoReport() ;
MESSAGE "Open customers database and generate a report"
MENUITEM "&Exit" ACTION oWnd:End() ;
MESSAGE "Terminate the application and exit"
ENDMENU
return oMenu
function DoReport()
local oRpt
lPreview = .T.
USE Customer
REPORT oRpt PREVIEW
COLUMN TITLE "First" DATA Customer->First
COLUMN TITLE "Last" DATA Customer->Last
COLUMN TITLE "State" DATA Customer->State
END REPORT
ACTIVATE REPORT oRpt
USE
lPreview = .F.
return nil
Re: error interno FWH
Posted: Tue Feb 12, 2013 10:19 am
by elvira
Antonio,
¿Y no podría modificarse rpreview.prg para que si desaparece oWIndMain se cierre el Preview sin dar el error?.
Error BASE/1004 Message not found: NIL:HWND
Gracias.
Re: error interno FWH
Posted: Tue Feb 12, 2013 10:32 am
by Antonio Linares
Podriamos modificar de forma automática el VALID de la ventana principal, pero imagino que esto puede resultar un problema para ciertas aplicaciones que hagan determinadas cosas en el VALID de la ventana principal.
Vamos a pensarlo y ver si es algo simple o puede complicarse...
Re: error interno FWH
Posted: Tue Feb 12, 2013 11:54 am
by elvira
Antonio,
En Facturaplus lo que hacen es al lanzar el Preview ocultar la ventana principal y cuando se sale volver a mostrarla.
Creo que es muy buena idea.
Cualquier programa hecho con FWH siempre casca cerrando la ventana principal cuando está abierto el preview, por ejemplo el GST Rotor de Apolosoftware.
Un saludo
Re: error interno FWH
Posted: Tue Feb 12, 2013 12:34 pm
by Antonio Linares
Es otra opción, puedes hacerlo asi:
oWnd:Hide()
ejecutas el preview
oWnd:Show()
Re: error interno FWH
Posted: Tue Feb 12, 2013 1:00 pm
by elvira
Antonio,
En rpreview.prg de hecho ya lo tenías antes en parte:
if oDevice:lPrvModal .and. oWndMain != nil
oWndMain:Hide()
Si hago lo de Hide and Show ya no hay forma de que pueda cascar.
Muchas gracias.
Un saludo
Re: error interno FWH
Posted: Tue Feb 12, 2013 2:08 pm
by Antonio Linares
Si, de hecho es para cuando se usa el PREVIEW en modo MODAL:
PRINT oPrn PREVIEW MODAL
si no se especifica se entiende que se quiere que se pueda acceder a todas las ventanas abiertas de la aplicación
Re: error interno FWH
Posted: Fri Feb 22, 2013 11:20 am
by Joaquim Ferrer
elvira wrote:Antonio,
En rpreview.prg de hecho ya lo tenías antes en parte:
if oDevice:lPrvModal .and. oWndMain != nil
oWndMain:Hide()
Si hago lo de Hide and Show ya no hay forma de que pueda cascar.
Muchas gracias.
Un saludo
El problema si lo ocultas con Hide(), queda oculta la ventana principal de la aplicacion, hay que volver a mostrarla.
Tengo estas modificaciones a rpreview por si sirven.
Activate queda así :
Code: Select all
METHOD Activate() CLASS TPreview
::oWnd:bInit := {|| ::Zoom() } // Add by Quim, a gusto del consumidor, muchos preview hay que hacer click para ver datos, asi se evita que el usuario tenga que hacerlo.
ACTIVATE WINDOW ::oWnd MAXIMIZED ;
ON RESIZE ::PaintMeta() ;
ON UP ::VScroll( GO_UP ) ;
ON DOWN ::VScroll( GO_DOWN ) ;
ON PAGEUP ::VScroll( GO_UP, GO_PAGE) ;
ON PAGEDOWN ::VScroll( GO_DOWN, GO_PAGE) ;
ON LEFT ::HScroll( GO_LEFT ) ;
ON RIGHT ::HScroll( GO_RIGHT ) ;
ON PAGELEFT ::HScroll( GO_LEFT, GO_PAGE ) ;
ON PAGERIGHT ::HScroll( GO_RIGHT, GO_PAGE ) ;
VALID ( ::oWnd:oIcon := nil ,;
::oFont:End() ,;
::oMeta1:End() ,;
::oMeta2:End() ,;
::oDevice:End() ,;
::oHand:End() ,;
If( Empty( ::oImageList ),, (::oImageList:End(), ::oImageList := nil ) ),;
::oWnd := nil ,;
::lExit := .t. ,;
If( ::oWndMain != NIL, ::oWndMain:Show(), ), ; // Ad by Quim
.t. )
BuildWindow queda asi :
Code: Select all
METHOD BuildWindow() CLASS TPreview
local oIcon, cTitle := "FiveWin Printing Preview", oCursor, oBar, nCol := 325
local oThis := Self
DEFAULT ::oWndMain := WndMain()
::hOldRes := GetResources()
#ifdef __CLIPPER__
::cResFile := "Preview.dll"
#else
if ! IsWin64()
::cResFile := "Prev32.dll"
else
::cResFile = "Prev64.dll"
endif
#endif
if SetResources( ::cResFile ) < 32
MsgStop( ::cResFile + " not found, imposible to continue",;
"FiveWin Printing Error" )
return nil
endif
::hNewRes := GetResources()
if ::oDevice != nil
cTitle = ::oDevice:cDocument
endif
if ::oWndMain != nil
oIcon = ::oWndMain:oIcon
else
DEFINE ICON oIcon RESOURCE "Print"
endif
if ::oDevice:lPrvModal .and. ::oWndMain != NIL // Add by Quim. En versiones antiguas ya estaba, simplemente lo rescato y renombro variables locales por variables de clase.
::oWndMain:Hide()
endif
Saludos