Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
VFP 9 Report Preview Bug and Workaround
Message
From
16/06/2005 14:03:06
 
General information
Forum:
Visual FoxPro
Category:
Reports & Report designer
Environment versions
Visual FoxPro:
VFP 9
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01024004
Message ID:
01024065
Views:
39
>To Everyone,
>
>I have posted the following information to help anyone who has had problems while trying to Preview reports in VFP 9 with SET REPORTBEHAVIOR 90 that contain more than 4500 to 4800 pages depending on the current number of GDI OBJECT HANDLES allocated in your VFP application. You will also want to patch and rebuild the REPORTOUTPUT.APP application before distributing it with your application.
>
>
>
>* VFP 9 REPORT PREVIEW BUG/LIMITATION USING SET REPORTBEHAVIOR 90
>*
>* THE PROBLEM:
>* ============
>* WHEN PREVIEWING A REPORT WITH MORE THAN 4500 TO 4800 PAGES OR MORE WILL
>* CAUSE VISUAL FOXPRO TO BEGIN PAINTING TO THE DESKTOP INCORRECTLY AND WILL
>* EVENTUALLY CRASH, REPORTING THE FOLLOWING ERROR:
>*
>* ERROR 43: "Not enough memory to complete this operation."
>*
>* NOTE:
>* =====
>* THIS PROBLEM ONLY OCCURS WHILE PREVIEWING REPORTS AND NOT WHILE PRINTING REPORTS
>*
>
>* CAUSE OF CRASH:
>* ===============
>* VISUAL FOXPRO EXCEEDS THE 10,000 GDI OBJECT HANDLE ALLOCATION LIMITATION OF THE
>* OPERATING SYSTEM.
>*
>* BY DEFAULT, WHEN VISUAL FOXPRO 9 RENDERS A REPORT PREVIEW USING THE FOLLOWING COMMANDS:
>*
>* SET REPORTBEHAVIOR 90
>* REPORT FORM Report.FRX TO PRINTER PROMPT PREVIEW
>
>* THE ENTIRE REPORT IS RENDERED INTO MEMORY PAGE BY PAGE AS EMF IMAGES AND EACH PAGE RENDERED
>* ALLOCATES 2 GDI OBJECT HANDLES PER PAGE. THE PROBLEM OCCURS IN THAT THE OPERATING SYSTEM
>* HAS A LIMIT OF 10,000 GDI OBJECT HANDLES PER PROCESS WHEN USING WINDOWS 2000 AND ABOVE.
>* WITH EARLIER VERSIONS OF WINDOWS THIS 10,000 GDI OBJECT HANDLE LIMIT IS SHARED ACROSS PROCESSES.
>*
>* VISUAL FOXPRO 9 DOES NOT CURRENTLY TRAP FOR THIS LIMITATION WHEN RENDERING A REPORT PREVIEW
>* AND WILL CRASH AS STATED ABOVE. HOWEVER, THE CRASH CAN BE AVERTED BY PLACING AN API CALL TO
>* GetGuiResources() INTO THE BEFOREBAND METHOD OF THE REPORTLISTENER CLASS AND CHECKING THE
>* NUMBER OF GDI OBJECT HANDLES IN USE BY THE CURRENT PROCESS AND NOT ALLOWING IT TO EXCEED THE
>* 10,000 HANDLE LIMIT. GetGuiResources(-1,0) RETURNS THE NUMBER OF GDI OBJECT HANDLES IN USE.
>*
>
>* STEPS TO REPRODUCE:
>* ===================
>* TO TEST THIS PROBLEM CREATE A SIMPLE REPORT THAT WILL PRODUCE MORE THAN 5000 PAGES BY CREATING
>* A CURSOR OF 5000 ROWS IN THE INIT OF THE DATAENVIRONMENT WITH A VERY TALL DETAIL BAND SO THAT
>* EACH PAGE WILL CONTAIN A SINGLE DETAIL BAND AND PREVIEW THE REPORT WITH SET REPORTBEHAVIOR 90.
>*
>
>* TO OBSERVE THE ERROR IN PROCESS
>* ===============================
>* OPEN UP TASK MANAGER BEFORE RUNNING THE REPORT AND SELECT THE PROCESSES TAB AND SELECT ADD COLUMN
>* FROM THE VIEW MENU OPTION AND ADD GDI OBJECTS TO THE COLUMNS DISPLAYED. THEN AS YOUR REPORT
>* RUNS YOU WILL BE ABLE TO SEE THE GDI OBJECTS BEING ALLOCATED BY THE VFP9 PROCESS UNTIL IT
>* EVENTUALLY REACHES 10,000 AND BEGINS PAINTING INCORRECTLY ON THE DESKTOP.
>*
>
>* WORKAROUND:
>* ===========
>* ADD THE FOLLOWING CODE TO THE INIT EVENT OF YOUR REPORTLISTENER:
>*
>
>DECLARE LONG GetGuiResources IN USER32 LONG, LONG
>
>*
>* THEN, TO KEEP VFP FROM CRASHING VIOLENTLY DURING A REPORT PREVIEW YOU SHOULD ADD THE CODE LISTED
>* BELOW TO THE BEFOREBAND METHOD AND WARN THE USER THAT THE REPORT PREVIEW WAS TERMINATED EARLY AND
>* THAT ALL PAGES OF THEIR REPORT WERE NOT ABLE TO BE LOADED INTO THE PREVIEW.
>*
>* YOU COULD OFFER YOUR USERS A WAY TO PREVIEW A RANGE OF PAGES TO GET AROUND THIS ISSUE OR USE
>* SET REPORTBEHAVIOR 80 WHICH DOES NOT EXHIBIT THIS ISSUE.
>
>IF GetGuiResources(-1,0) > 9000
>   MESSAGEBOX("Warning! You are about to exceed the Page Limit in the VFP 9 Report Preview!"+CHR(13)+CHR(13)+;
>              "Report Preview halted early. Not all report pages were rendered.",48,;
>              "Visual FoxPro 9 Report Preview Limitation!")
>   NODEFAULT
>   THIS.CancelReport()
>   RETURN
>ENDIF
>
Rich, thanks
Previous
Reply
Map
View

Click here to load this message in the networking platform