Q194514: PRB: Cannot Pass Array Property of Form by Reference to OLE DLL
Article: Q194514
Product(s): Microsoft FoxPro
Version(s): WINDOWS:6.0
Operating System(s):
Keyword(s): kbCOMt kbvfp600
Last Modified: 24-AUG-1999
-------------------------------------------------------------------------------
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 1986-2002.