>* 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