DOCUMENT:Q194514 24-AUG-1999 [foxpro] TITLE :PRB: Cannot Pass Array Property of Form by Reference to OLE DLL PRODUCT :Microsoft FoxPro PROD/VER:WINDOWS:6.0 OPER/SYS: KEYWORDS:kbCOMt kbvfp600 ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual FoxPro for Windows, version 6.0 ------------------------------------------------------------------------------- SYMPTOMS ======== Trying to pass an array property of a form by reference to a COM server results in the following error: "Alias 'THISFORM' is not found" RESOLUTION ========== There are two methods of working around this limitation: 1. Use the ACOPY() function to copy all the data from the array property to an array variable, then pass the array variable by reference. -or- 2. If having the array be a property is not a necessity, eliminate the array property, and dimension an array variable in the Init of the form. Pass that array by reference to the object. Example 1: Modify the btnOne.Click Method to the following: ***************Start Code Workaround 1**************** PROCEDURE btnOne.CLICK THISFORM.oArrTest=CREATEOBJECT('frmArray.ArrTest') IF TYPE('thisform.oArrTest')#'O' then WAIT WINDOW 'Did not instantiate' RETURN ENDIF COMARRAY(thisform.oArrTest,11) ACOPY(THISFORM.MyArray,aTemp) THISFORM.oArrTest.modarray(@aTemp) DISPLAY MEMORY LIKE aTemp ENDPROC PROCEDURE btnClose.CLICK CLEAR EVENTS RELEASE THISFORM ENDPROC **********End Code Workaround 1******************** Example 2: Replace the Client code with the following: ***************Start Code Workaround 2******************** x=CREATEOBJECT("Test1") x.VISIBLE=.T. x.SHOW READ EVENTS DEFINE CLASS Test1 AS FORM OLEPUBLIC oArrTest=.NULL. ADD OBJECT btnOne AS COMMANDBUTTON WITH TOP = 1, ; CAPTION = 'Test Array' ADD OBJECT btnClose AS COMMANDBUTTON WITH TOP = 25, ; CAPTION = 'Close' PROCEDURE INIT DIMENSION aMyArray(5,1) I=1 FOR I = 1 TO 5 aMyArray(I)='Form' ENDFOR ENDPROC PROCEDURE btnOne.CLICK THISFORM.oArrTest=CREATEOBJECT('frmArray.ArrTest') IF TYPE('thisform.oArrTest')#'O' then WAIT WINDOW 'Did not instantiate' RETURN ENDIF COMARRAY(thisform.oArrTest,11) THISFORM.oArrTest.modarray(@aMyArray) DISPLAY MEMORY LIKE aMyArray ENDPROC PROCEDURE btnClose.CLICK CLEAR EVENTS RELEASE THISFORM ENDPROC ENDDEFINE *************End Code Workaround 2************************* STATUS ====== This behavior is by design. MORE INFORMATION ================ Steps to Reproduce Behavior --------------------------- 1. Place the following Class Definition code in a program file attached to a project called frmArray: ****************Begin Class Definition********* DEFINE CLASS ArrTest AS CUSTOM OLEPUBLIC PROCEDURE modarray PARAMETERS MyArray EXTERNAL ARRAY MyArray FOR I = 1 TO 5 MyArray(I)="COM" ENDFOR ENDPROC ENDDEFINE **************End Class Definition************ 2. Build the project into a COM DLL. 3. Place the following Client Code in a program file and run it: ***************Client Code Start******************* x=CREATEOBJECT("Test1") x.VISIBLE=.T. x.SHOW READ EVENTS DEFINE CLASS Test1 AS FORM OLEPUBLIC DIMENSION MyArray(5) oArrTest=.NULL. ADD OBJECT btnOne AS COMMANDBUTTON WITH TOP = 1, ; CAPTION = 'Test Array' ADD OBJECT btnClose AS COMMANDBUTTON WITH TOP = 25, ; CAPTION = 'Close' PROCEDURE INIT I=1 FOR I = 1 TO 5 MyArray(I)='Form' ENDFOR ENDPROC PROCEDURE btnOne.CLICK THISFORM.oArrTest=CREATEOBJECT('frmArray.ArrTest') IF TYPE('thisform.oArrTest')#'O' then WAIT WINDOW 'Did not instantiate' RETURN ENDIF COMARRAY(thisform.oArrTest,11) THISFORM.oArrTest.modarray(@THISFORM.MyArray) DISPLAY MEMORY LIKE THISFORM.MyArray ENDPROC PROCEDURE btnClose.CLICK CLEAR EVENTS RELEASE THISFORM ENDPROC ENDDEFINE *****************Client Code End************************ 4. When the form appears, press the "btnOne" button, and note the error message. Additional query words: kbVFP600 kbComt ====================================================================== Keywords : kbCOMt kbvfp600 Technology : kbVFPsearch kbAudDeveloper kbVFP600 Version : WINDOWS:6.0 Issue type : kbprb ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 1999.