Mini Kabibi Habibi

Current Path : C:/Users/ITO/Desktop/VF9/program files/microsoft visual foxpro 9/ffc/
Upload File :
Current File : C:/Users/ITO/Desktop/VF9/program files/microsoft visual foxpro 9/ffc/_utility.vct

�gVERSION =   3.00
_utility.h���~*-1
_stringlibPixelsClass1_custom
_stringlib_typelib
_utility.h&��~*-BArial, 1, 9, 6, 15, 12, 15, 3, 0
Arial, 0, 9, 5, 15, 12, 16, 3, 0
_graphbyrecord
_utility.hPixelsClass8
_container_graphbyrecord_graphbyrecord	_arraylibPixelsClass1_custom	_arraylibName = "_arraylib"
customLabel1_xtab	_base.vcx
chkShowLegendlabel>*trimcrlf Trims carriage returns and line feeds from string.
.Height = 23
Width = 24
Name = "_stringlib"
custom	_base.vcx}PROCEDURE Click
THIS.Parent.lAddLegend = THIS.Value
ENDPROC
PROCEDURE Init
THIS.Value = THIS.Parent.lAddLegend
ENDPROC
Top = 248
Left = 19
Height = 17
Width = 90
BackStyle = 0
Caption = "\<Show legend"
TabIndex = 3
Name = "chkShowLegend"
checkbox	_base.vcxlabel1
_utility.hPixelsClass_custom_typelibdHeight = 27
Width = 101
cerrormessage = 
ccomfile = 
ctypelib = 
cclass = 
Name = "_typelib"
custom1�� ���?%��	��U�����&T��CC�)���vfpxtab.prg��)6��YT��C�genxtab����������������	��
�������
��C��
��%�������	:��UONEWXTAB
LCXTABFILETHISCOUTFILELCURSORONLYLCLOSETABLE	LSHOWTHEM	NROWFIELD	NCOLFIELD
NDATAFIELD
LTOTALROWSNTOTALOPTION
LDISPLAYNULLSMAKEXTABLBROWSEAFTERrunxtab,��1�b��aA2�)��PROCEDURE trimcrlf
LPARAMETERS tcString,tlTrimLeft,tlTrimRight
LOCAL lcString

lcString=tcString
IF tlTrimLeft
	DO WHILE LEFT(lcString,1)==CHR(13) OR LEFT(lcString,1)==CHR(10)
		lcString=LTRIM(SUBSTR(lcString,2))
	ENDDO
ENDIF
IF tlTrimRight
	DO WHILE RIGHT(lcString,1)==CHR(13) OR RIGHT(lcString,1)==CHR(10)
		lcString=TRIM(LEFT(lcString,LEN(lcString)-1))
	ENDDO
ENDIF
RETURN lcString

ENDPROC
	autograph	container	_base.vcx1_graphbyrecordautgraph.vcx	Autographcustom	_checkboxsBackStyle = 0
Caption = "\<Type:"
Height = 17
Left = 160
Top = 217
Width = 31
TabIndex = 6
Name = "Label1"
_graphbyrecord_graphbyrecord	chkPlotBycheckboxPixels	_base.vcx	_checkbox_graphbyrecord	_base.vcxClasscboChartTypecombobox_customVERSION =   3.00_xtabcustomA�� ((i�%����UT��������UTHISPARENT
LADDLEGENDVALUET��������UTHISVALUEPARENT
LADDLEGENDClick,��Initj��1a2a14Or)(E�� ,,5�%����UT��������UTHISPARENTLSERIESBYROWVALUET��������UTHISVALUEPARENTLSERIESBYROWClick,��Initl��1a3a18Sx),�PROCEDURE Click
THIS.Parent.lSeriesByRow = THIS.Value

ENDPROC
PROCEDURE Init
THIS.Value = THIS.Parent.lSeriesByRow
ENDPROC
|Top = 248
Left = 160
Height = 17
Width = 84
BackStyle = 0
Caption = "\<Plot by row"
TabIndex = 4
Name = "chkPlotBy"
`Height = 24
Left = 192
Style = 2
TabIndex = 2
Top = 211
Width = 90
Name = "cboChartType"
	_base.vcx	_combobox��� ���%}���U'���
��C�����C�����UTCACTIONTHISPARENTREFRESHGRAPHtablenav,��1q�2[)�fPROCEDURE tablenav
LPARAMETERS tcAction
DODEFAULT(tcAction)
THIS.Parent.RefreshGraph()

ENDPROC
_graphbyrecord_nav4buttons	container
_table.vcx_nav4buttons'OLEClass = Microsoft Graph 2000 Chart
_Top = 7
Left = 12
Height = 184
Width = 279
Visible = .F.
TabIndex = 5
Name = "oleGraph"
_graphbyrecord	_base.vcx_filer
_utility.h&��~*-_fileversion
_utility.hPixelsClass_custom_fileversion�cfilename Name of file to get information.
^aversion[12,0] Array of file version information.
*getversion Retrieves version information for cFileName.
*displayversion Displays version information for cFileName.
*cfilename_access 
Name = "_fileversion"
custom	_base.vcx
_utility.h&��~*-
_utility.hPixelsClass_custom_filer|csearchpath = 
cfileexpression = 
csearchtext = 
lsubfolder = .T.
lignorecase = .T.
lpromptdir = .T.
Name = "_filer"
custom�Top = 206
Left = 7
TabIndex = 1
Name = "_nav4buttons"
cmgNav.Command1.Top = 5
cmgNav.Command1.Left = 33
cmgNav.Command1.Name = "Command1"
cmgNav.Command2.Top = 5
cmgNav.Command2.Left = 60
cmgNav.Command2.Name = "Command2"
cmgNav.BorderStyle = 0
cmgNav.TabIndex = 2
cmgNav.Name = "cmgNav"
cusTableNav.Name = "cusTableNav"
cmdTop.TabIndex = 1
cmdTop.Name = "cmdTop"
cmdBottom.TabIndex = 3
cmdBottom.Name = "cmdBottom"
oleGraph
olecontrol
olecontrolQTop = 252
Left = 252
Height = 17
Width = 24
naction = 0
Name = "Autograph"
�coutfile Name of the output file.
lcursoronly Whether input datasource is cursor.
lclosetable Whether to close source datasource after cross tab is generated.
lshowthem Whether to show thermometer during cross tab generation.
nrowfield Field position in datasource of cross tab rows.
ncolfield Field position in datasource of cross tab columns.
ndatafield Field position in datasource of cross tab data.
ltotalrows Whether to total rows in cross tab output.
ntotaloption Totaling options (0-sum, 1-count, 2-% of total).
ldisplaynulls Whether to display nulls in cross tab output.
lbrowseafter Whether to browse cross tab output after being generated.
*runxtab Generates cross tab.
�*insaitem Inserts and array element.
*delaitem Deletes and array element.
*acolscan Scans an array limited to a particular column.
P�� 77G%��M4�U)����������%�C����N��C�T��C����T��C����
H�g�"����
��|�B�!�C���
CC���	����T������
��������9�T��C�C��F����C����%��C�������C��
������T���
�����
���2�"�T��C�C���F����C��������%��C���������C��
������%��
����!T���
��������
����������(�����!T���
��������
�������UAARRAY	SCONTENTSIROWLSETALLNCOLUMNSI��������&%�C���
�
�
�
��
��<�B��%�C�����d�
J���(�����T��C������C��
����%���������C���������C����������UAARRAYWZIROWNCOLUMNSF���������%�C�
���N��>�
T������%�C�
���L��d�T��-���
T�����+�a���T��C��
��
����
H������
������!��C��
����
�����!�2��T�
���
������%��
���,�B�C��
������?�B��
����UASEARCHSEXPRNCOLUMNLRETROWNPOSinsaitem,��delaitem���acolscan���18�RA2�AQQA�aA�����aA��qAAA2�raAAq��1!A��AA36qq�Aq�A����1A�A�QAA�Q��A2�"��,3�TE)7�� ���2%:lL�U���������
T�����
%����s�++�C��=C�
 �C��=C�
 ��o�T��CC��\A����
%������++�C��RC�
 �C��RC�
 ����T��CC�C�>�=`����	B����UTCSTRING
TLTRIMLEFTTLTRIMRIGHTLCSTRINGtrimcrlf,��1�q���AAA���AA�2�)�	_base.vcx�Width = 302
Height = 270
BorderWidth = 0
cgraphtitle = Record: 
ncharttype = 78
lseriesbyrow = .T.
laddlegend = .T.
cgraphfield = 
ccharttype = 
Name = "_graphbyrecord"
�coutfile = xtabquery
lcursoronly = .T.
lclosetable = .T.
lshowthem = .T.
nrowfield = 1
ncolfield = 2
ndatafield = 3
ntotaloption = 0
lbrowseafter = .T.
Name = "_xtab"
)csearchpath The folder path to begin searching for files.
cfileexpression File skeleton for searching. Can include wildcards such as ? and *.
csearchtext Text string to search for within files.
lsubfolder Whether to search in subfolders for files.
lignorecase Whether to ignore case during search.
lwholewords Whether to search for whole word matches.
ofiles Collection of files returned by Find search.
lpromptdir Whether to prompt the user for search path if none entered.
*find Runs search for files based on criteria.
*csearchpath_access 
�cgraphtitle Caption for record label.
ncharttype Chart type (numeric value).
lseriesbyrow Whether to plot series by column or row.
laddlegend Whether to add a legend.
cgraphfield Field to use for caption.
ccharttype
*setupgraph Initializes graph controls.
*refreshgraph Refreshes graph when record pointer moved.
^adatafields[1,0] Array of data fields to graph.
*lseriesbyrow_assign 
*ncharttype_assign 
*setcharttype Sets the chart type.
*laddlegend_assign 
�PROCEDURE runxtab
LOCAL oNewXtab,lcxtabfile

lcxtabfile = IIF(EMPTY(_GENXTAB),"vfpxtab.prg",_GENXTAB)

oNewXtab=NEWOBJECT('genxtab',lcxtabfile,"",;
THIS.cOutFile,;
THIS.lCursorOnly,;
THIS.lCloseTable,;
THIS.lShowThem,;
THIS.nRowField,;
THIS.nColField,;
THIS.nDataField,;
THIS.lTotalRows,;
THIS.nTotalOption,;
THIS.lDisplayNulls)

oNewXtab.MakeXtab()

IF THIS.lBrowseAfter
	BROWSE NOWAIT NORMAL
ENDIF

ENDPROC
]�� DD�%n�*��U��C�������UTHISPARENTSETCHARTTYPE	LISTINDEX���C�Area������C�3D Area������C�Bar������C�3D Bar������C�Column������C�	3D Column������C�Pie������C�3D Pie������C�Line������C�3D Line��������T�������%�C����N���
T���L���
H�(�����
��L��L�T���Area����
��N��s�T���3D Area����
��9����T���Bar����
��<����T���3D Bar����
��3����T���Column����
��6���T���	3D Column����
����.�T���Pie����
������U�T���3D Pie����
����y�T���Line����
��������T���3D Line���T������UTHISADDITEM	NGETVALUELNCHARTTYPEPARENT
NCHARTTYPEVALUEInteractiveChange,��Initp��1a3Aq1aa�1aAq�1Q�A�11A111111a1A11AAA2Gb)DPROCEDURE InteractiveChange
THIS.Parent.SetChartType(THIS.ListIndex)

ENDPROC
PROCEDURE Init
THIS.AddItem(C_AREA_GRAPH)
THIS.AddItem(C_AREA3D_GRAPH)
THIS.AddItem(C_BAR_GRAPH)
THIS.AddItem(C_BAR3D_GRAPH)
THIS.AddItem(C_COLUMN_GRAPH)
THIS.AddItem(C_COLUMN3D_GRAPH)
THIS.AddItem(C_PIE_GRAPH)
THIS.AddItem(C_PIE3D_GRAPH)
THIS.AddItem(C_LINE_GRAPH)
THIS.AddItem(C_LINE3D_GRAPH)

LOCAL nGetValue,lnChartType
nGetValue = THIS.Parent.nChartType
IF VARTYPE(nGetValue)#"N"
	nGetValue = I_AREA_GRAPH
ENDIF

DO CASE
CASE m.nGetValue= I_AREA_GRAPH	&&Area
	lnChartType = C_AREA_GRAPH
CASE m.nGetValue= I_AREA3D_GRAPH	&&Area 3D
	lnChartType = C_AREA3D_GRAPH
CASE m.nGetValue= I_BAR_GRAPH	&&Bar
	lnChartType = C_BAR_GRAPH
CASE m.nGetValue = I_BAR3D_GRAPH	&&Bar 3D
	lnChartType = C_BAR3D_GRAPH
CASE m.nGetValue = I_COLUMN_GRAPH	&&Column
	lnChartType = C_COLUMN_GRAPH
CASE m.nGetValue = I_COLUMN3D_GRAPH	&&Column 3D
	lnChartType = C_COLUMN3D_GRAPH
CASE m.nGetValue = I_PIE_GRAPH	&&Pie
	lnChartType = C_PIE_GRAPH
CASE m.nGetValue = I_PIE3D_GRAPH	&&Pie 3D
	lnChartType = C_PIE3D_GRAPH
CASE m.nGetValue = I_LINE_GRAPH	&&Line
	lnChartType = C_LINE_GRAPH
CASE m.nGetValue = I_LINE3D_GRAPH	&&Line 3D
	lnChartType = C_LINE3D_GRAPH
ENDCASE

THIS.Value = lnChartType

ENDPROC
v�� ]]s�%�FX�U�����%�C��0����
�����������J���(���T��C������%��
��������C����
��B�a����B�-��U	AVERARRAYNERRORTHIS	CFILENAMEAVERSION����
T�����%�CC����
��O�$T���
Comments: CC�������%�CC����
����:T���
�C�
 C�
 �Company Name: CC�������%�CC����
����>T���
�C�
 C�
 �File Description: CC�������%�CC����
��R�:T���
�C�
 C�
 �File Version: CC�������%�CC����
����;T���
�C�
 C�
 �Internal Name: CC�������%�CC����
���=T���
�C�
 C�
 �Legal Copyright: CC�������%�CC����
��Y�>T���
�C�
 C�
 �Legal Trademarks: CC�������%�CC����
����?T���
�C�
 C�
 �Original Filename: CC�������%�CC�	���
��	�;T���
�C�
 C�
 �Private Build: CC�	������%�CC�
���
��^�:T���
�C�
 C�
 �Product Name: CC�
������%�CC����
����=T���
�C�
 C�
 �Product Version: CC�������%�CC����
���;T���
�C�
 C�
 �Special Build: CC�������%�CC����
��]�6T���
�C�
 C�
 �
Language: CC�������/%�C�
���C�THIS.aVersion[1]b�L����*T���No version information found.���1��C�
��Version information for: ���x��U
CVERSTRINGTHISAVERSION	CFILENAME�;%�C�THIS.cFilenameb�C�	C����
C��0
����T���C���;%�C�THIS.cFilenameb�C�	C����
C��0
����T��������B�����UTHIS	CFILENAME������UTHISAVERSION
getversion,��displayversion���cfilename_access��Init���1�!��11qAAq3s�rAAq�Aq�Aq�Aq�Aq�Aq�Aq�Aq�Aq�Aq�Aq�AqaA��A3���AA�32-R <Gw	ED�	�	P)]	�PROCEDURE getversion
LOCAL aVerArray, nError
IF FILE(THIS.cFileName)
	DIMENSION aVerarray[1]
	DIMENSION THIS.aVersion[15]
	STORE "" TO THIS.aVersion
	nError = AGetFileVersion(aVerArray,THIS.cFileName)
	IF m.nError # 0
		ACOPY(aVerArray,THIS.aVersion)
		RETURN .T.
	ENDIF
ENDIF
RETURN .F.

ENDPROC
PROCEDURE displayversion
*File Version Strings

LOCAL cVerString
cVerString = ""

IF NOT EMPTY(THIS.aVersion(1))
	cVerString =  FILEVER_COMMENT_LOC + ALLT(THIS.aVersion(1))
ENDIF
IF NOT EMPTY(THIS.aVersion(2))
	cVerString = m.cVerString+CRLF+FILEVER_COMPANY_LOC+ ALLT(THIS.aVersion(2))
ENDIF
IF NOT EMPTY(THIS.aVersion(3))
	cVerString =  m.cVerString+CRLF+FILEVER_FILEDESC_LOC+ ALLT(THIS.aVersion(3))
ENDIF
IF NOT EMPTY(THIS.aVersion(4))
	cVerString = m.cVerString+CRLF+FILEVER_FILEVER_LOC+ ALLT(THIS.aVersion(4))
ENDIF
IF NOT EMPTY(THIS.aVersion(5))
	cVerString = m.cVerString+CRLF+FILEVER_INTERNAL_LOC+ ALLT(THIS.aVersion(5))
ENDIF
IF NOT EMPTY(THIS.aVersion(6))
	cVerString = m.cVerString+CRLF+FILEVER_COPYRIGHT_LOC+ ALLT(THIS.aVersion(6))
ENDIF
IF NOT EMPTY(THIS.aVersion(7))
	cVerString = m.cVerString+CRLF+FILEVER_TRADMARK_LOC+ ALLT(THIS.aVersion(7))
ENDIF
IF NOT EMPTY(THIS.aVersion(8))
	cVerString = m.cVerString+CRLF+FILEVER_FILENAME_LOC+ ALLT(THIS.aVersion(8))
ENDIF
IF NOT EMPTY(THIS.aVersion(9))
	cVerString = m.cVerString+CRLF+FILEVER_PRIVATE_LOC+ ALLT(THIS.aVersion(9))
ENDIF
IF NOT EMPTY(THIS.aVersion(10))
	cVerString = m.cVerString+CRLF+FILEVER_PRODUCTNAME_LOC+ ALLT(THIS.aVersion(10))
ENDIF
IF NOT EMPTY(THIS.aVersion(11))
	cVerString = m.cVerString+CRLF+FILEVER_PRODUCTVER_LOC+ ALLT(THIS.aVersion(11))
ENDIF
IF NOT EMPTY(THIS.aVersion(12))
	cVerString = m.cVerString+CRLF+FILEVER_SPECIAL_LOC+ ALLT(THIS.aVersion(12))
ENDIF
IF NOT EMPTY(THIS.aVersion(14))
	cVerString = m.cVerString+CRLF+FILEVER_LANGUAGE_LOC+ ALLT(THIS.aVersion(14))
ENDIF

IF EMPTY(m.cVerString) OR TYPE("THIS.aVersion[1]")="L"
	cVerString = FILEVER_NOVERSION_LOC
ENDIF

MESSAGEBOX(m.cVerString,MSG_FILEVERSION_LOC+THIS.cFileName)

ENDPROC
PROCEDURE cfilename_access
*To do: Modify this routine for the Access method
IF TYPE("THIS.cFilename")#"C" OR EMPTY(THIS.cFilename) OR !FILE(THIS.cFilename)
	THIS.cFilename = GETFILE()
	IF TYPE("THIS.cFilename")#"C" OR EMPTY(THIS.cFilename) OR !FILE(THIS.cFilename)
		THIS.cFilename = ""
	ENDIF
ENDIF
RETURN THIS.cfilename

ENDPROC
PROCEDURE Init
DIMENSION THIS.aVersion[15]

ENDPROC
_PROCEDURE insaitem
* Inserts an array element into an array.
*
* aArray - array name
* sContents - contents to insert
* iRow - row to insert into
* lSetAll - whether to set all elements in row for multi-dime array

LPARAMETER aArray,sContents,iRow,lSetAll
LOCAL nColumns, i

IF VARTYPE(iRow) # "N"
	iRow = ALEN(aArray)
ENDIF

nColumns = ALEN(aArray,2)
DO CASE
CASE iRow<0
	RETURN
CASE ALEN(aArray)=1 AND EMPTY(aArray[1])
	aArray[1]=m.sContents
CASE nColumns = 0
	iRow = MIN(iRow,ALEN(aArray))
	DIMENSION aArray[ALEN(aArray)+1]
	IF iRow # ALEN(aArray)-1
		AINS(aArray,m.iRow+1)	
	ENDIF
	aArray[m.iRow+1]=m.sContents
OTHERWISE
	iRow = MIN(iRow,ALEN(aArray,1))
	DIMENSION aArray[ALEN(aArray,1)+1,nColumns]	
	IF iRow # ALEN(aArray,1)-1
		AINS(aArray,m.iRow+1)
	ENDIF
	IF !lSetAll
		aArray[m.iRow+1,1]=m.sContents
	ELSE
		FOR i = 1 TO nColumns
			aArray[m.iRow+1,i]=m.sContents	
		ENDFOR
	ENDIF
ENDCASE
ENDPROC
PROCEDURE delaitem
* Generic routine to delete an array element. If the array is
* multi-dimensional, then a whole row is deleted.
*
* aArray- array to scan
* wziRow - row to delete
LPARAMETERS aArray,wziRow

LOCAL nColumns
IF ALEN(aArray,1)<m.wziRow OR m.wziRow<0
	RETURN
ENDIF
IF ALEN(aArray,1)=1
	STORE ""  TO aArray
ELSE
	nColumns = ALEN(aArray,2)
	ADEL(aArray,m.wziRow)
	IF nColumns=0
		DIMENSION aArray[ALEN(aArray)-1]
	ELSE
		DIMENSION aArray[ALEN(aArray,1)-1,nColumns]
	ENDIF
ENDIF

ENDPROC
PROCEDURE acolscan
* This function does an ASCAN for a specific row
* aSearch - array to scan
* sExpr - expression to scan
* nColumn - column to scan
* lRetRow - return row (T) or array element (F)
LPARAMETER aSearch,sExpr,nColumn,lRetRow
LOCAL npos
IF VARTYPE(m.nColumn)#'N'
	nColumn = 1
ENDIF
IF VARTYPE(m.lRetRow)#'L'
	lRetRow = .F.
ENDIF

npos = 1
DO WHILE .T.
	npos = ASCAN(aSearch,m.sExpr,m.npos)
	DO CASE
	CASE m.npos=0	&&did not find match
		EXIT
	CASE ASUBSCRIPT(aSearch,m.npos,2)=m.nColumn
		EXIT
	OTHERWISE
		m.npos=m.npos+1
	ENDCASE
ENDDO
IF m.lRetRow
	RETURN ASUBSCRIPT(aSearch,m.npos,1)
ELSE
	RETURN m.npos
ENDIF

ENDPROC
��� ����%f"9��U�����T��C�filer.fileutil�N��#%�C�oFilerb�O�C������e��C�YCould not instantiate the Filer COM object. Check to make sure it is registered properly.�x��B��)T���CC����	�*.*���6��T�������T�������%�C��	�
��.�T��
���	���T�������T��
�����T����T��C�����%�������T��������B��
���UOFILERNFILESFILEEXPRESSIONTHISCFILEEXPRESSION
SEARCHPATHCSEARCHPATH	SUBFOLDER
LSUBFOLDERCSEARCHTEXTSEARCHTEXT1
WHOLEWORDSLWHOLEWORDS
IGNORECASELIGNORECASEOFILESFINDFILESp%�C�����]�%�����2�T���C�3���%�C�����Y�T���CC������B�����UTHISCSEARCHPATH
LPROMPTDIRT����UTHISOFILES���������%�C����������
H�:�;��CC�Q�	FILER.DLL0��p�T��C�Q�	FILER.DLL��&�CC�Q�FILER\�	FILER.DLL0����$T��C�Q�FILER\�	FILER.DLL���C�	FILER.DLL0����T���	FILER.DLL��2�;�G��C�8You need to have FILER.DLL in order to use this utility.�0�x��B��d%�C�MThe Filer COM object is not registered, would you like me to do this for you?�$�x�����"RUN /n REGSVR32 /s &cFilerFile
X����B���UNERRORCMETHODNLINE
CFILERFILEfind,��csearchpath_access���Destroy;��Error^��1 ��1QAA�1121A11�A1A�3"A!AA�3�2�rs���aA�a�qAAB!A�AAA1S|u?!��L#��O)��PROCEDURE find
*!*	Filer PEMS
*!* =================
*!*	SearchPath
*!*	FileExpression
*!*	SubFolder
*!*	SearchText1,SearchText2,SearchText3
*!*	IgnoreCase
*!*	WholeWords
*!*	SearchAnd
*!*	Find
*!*	DoSearch
*!*	Files (collection)

*!*	Files Collection PEMS
*!* =====================
*!*	Item
*!*	Count
*!*	Edit

*!*	File Object PEMS
*!* =================
*!*	Name
*!*	Size
*!*	SizeHigh
*!*	Attr
*!*	DateTime
*!*	LastAccessTime
*!*	LastWriteTime
*!*	AlternateName
*!*	Path
*!*	Edit
*!*	Delete


LOCAL oFiler,nFiles

oFiler = CreateObject(C_FILERCLASS)
IF TYPE("oFiler")#"O" OR ISNULL(oFiler)
	MESSAGEBOX(ERR_NOCLASS_LOC)
	RETURN
ENDIF

oFiler.fileexpression = IIF(EMPTY(THIS.cFileExpression),"*.*",THIS.cFileExpression)
oFiler.searchpath = THIS.cSearchPath
oFiler.subfolder = THIS.lsubfolder

IF !EMPTY(THIS.cSearchText)
	oFiler.SearchText1 = THIS.cSearchText
ENDIF
oFiler.WholeWords = THIS.lWholeWords
oFiler.IgnoreCase = THIS.lIgnoreCase

THIS.oFiles = null
nFiles = oFiler.find(1)

IF nFiles # 0
	THIS.oFiles = oFiler.Files
ENDIF
RETURN m.nFiles

ENDPROC
PROCEDURE csearchpath_access
*To do: Modify this routine for the Access method
IF EMPTY(THIS.cSearchPath)
	IF THIS.lPromptDir
		THIS.cSearchPath = GETDIR()
	ENDIF
	IF EMPTY(THIS.cSearchPath)
		THIS.cSearchPath = FULLPATH(CURDIR())
	ENDIF
ENDIF
RETURN THIS.cSearchPath

ENDPROC
PROCEDURE Destroy
THIS.oFiles = .NULL.
ENDPROC
PROCEDURE Error
LPARAMETERS nError, cMethod, nLine

LOCAL cFilerFile

* Check to make sure library is registered
IF INLIST(nError,1426,1733)
	DO CASE
	CASE FILE(HOME()+C_FILERDLL)
		cFilerFile = HOME()+C_FILERDLL
	CASE FILE(HOME()+C_FILERPATH+C_FILERDLL)
		cFilerFile = HOME()+C_FILERPATH+C_FILERDLL
	CASE FILE(C_FILERDLL)
		cFilerFile = C_FILERDLL
	OTHERWISE
		MESSAGEBOX(ERR_NOFILERDLL_LOC,48)
		RETURN
	ENDCASE
	
	IF MESSAGEBOX(MSG_REGFILERDLL_LOC,36)=6
			RUN /n REGSVR32 /s &cFilerFile
		RETRY
	ELSE
		RETURN	
	ENDIF
ENDIF
ENDPROC
 ��ࡱ�>��	����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	

������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Root Entry���������FP��D���Ole
��������AccessObjSiteData&������������8ChangedProps��������������������	

 !"#$%&'����)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU����������������������������������������������������������������������������������������������������������������������������������������������������������������������������88���
�����FMicrosoft Graph 97GBiff5MSGraph.Chart.8�9�q	��
�AB�""$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_Workbook�����CompObj������������bOlePres000������������(^Ole
����������������("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)1���Arial1���Arial1���Arial=������,##0.00_� 
	���
�A`
J�
�`
J�
��8��8�������������������������������3f�����ff���f�����������������������������̙��̙3f�3���������fff����3f3�f333�3�3f33�333\���R3�&STUWYd((#=
��\�>X�4���3�d3QQQQ��3_4E43QQQQ��3_4E43QQQQ��3_4E4D	$% ��������M 3O&Q4$% ��������M 3O&Q4FAw��
�
3Ow��
�
3 b�#M!���
���O43*#M!	M!	M
���MN43�"
:dd�i��3O�i% ��������M3OQ423	M
���NM44444
���������#�6	�	���
�Y'���������������H�����""")))UUUMMMBBB999�|��PP�������������3f��333f3�3�3�3f3fff�f�f�f�3�f���̙���3�f�������f����333f3�3�3�333333f33�33�33�33f33f3ff3�f3�f3�f3�33�3f�3��3̙3��3�33�3f�3��3��3��33�3f�3��3�3��3f3fff�f�f�f3f33ff3f�3f�3f�3fff3fffff�ff�ff�f3�ff�f��f̙f��f�f3�f��f��f��f�f3�f��f�f�������3������33�f��3���f�3f�f3��f��f��3�3��f�����̙����̙3̙f�f�̙�̙�̙��3��f̙���������3�f�����3�33�f3��3��3��3�f�3f�ff��f��f��f���3��f�����̙������3��f�������������3��f����������3�f���3�33�f3��3��3��3�f�3f�ff��f��f��f���3��f�����̙�����3�f�������3��f��������fff�f��fff��f�f���!___www���������������������������������������������������45'�����	����"Arial�--��"Systemn-'��-���	�Y-'��-���	�Y-'��-���	�U-'��-���	�Y	�"-�� -���
zPC>	�"-����--'��---���	yPC>---'��---���	yPC>	�"-������ -�	�����
QIJB---'��---���	��yPC>---'��---���	��yPC>	�"-���3f� -��3f
cI\B---'��---�3f	��yPC>---'��---�3f	��yPC>	�"-������ -����
uInB---'��---���	��yPC>---'��---���	���Y�-�-�'���Y���	��'�����	��'���� �
�
�O%�@
ob	�U����%�CC���L�0R,����� You must have a cursor selected.��B�-���%�CC������	������(�C.���.%�CC�EVAL(FIELD(m.i))b�CLGDMT������.��%�CC����
�������C������T���C����C�
�/�������C������
����������T��a��T�����T������T������T������T�	�a��T�
�a��T��-��T��a����
��C��
��UITHISADATAFIELDS	AUTOGRAPHLGRAPHRECORDNACTION
LADDLEGENDLSERIESBYROW
NCHARTTYPELSTRIPEXCESSLEGEND	LUSE8TYPE
LSHOWWHENDONE	LKEEPFORMREFRESHGRAPH�%�CC����B�-���T���a����������T�����T�������T��-��
H�r���C��	�
����T�
�a��T��C��	���C���
���T�
�a��>T��C���Record:��Record:� CCO_���6��2��T�
�-���%�C�

��~�U��C�IGraph could not be generated. Try changing Chart Type or Plot By setting.�x���T���T�����T����a��T���-��UTHISFORM
LOCKSCREENTHIS	AUTOGRAPHGRAPHPREVIEW	OGRAPHREFOLEGRAPHOBJECT
LADDEDDATACGRAPHFIELD	LADDTITLECTITLECGRAPHTITLE
MAKEOUTPUTVISIBLE[	��
��%�C�
����L��T�T����
���T�����
���
��C�����UVNEWVALTHISLSERIESBYROW	AUTOGRAPHREFRESHGRAPH[	��
��%�C�
����N��T�T����
���T�����
���
��C�����UVNEWVALTHIS
NCHARTTYPE	AUTOGRAPHREFRESHGRAPH����%�C�
����N��%�B�-�������T���
���
H�P�����
����p�
T���L����
������
T���N����
������
T���9����
������
T���<����
������
T���3����
�����
T���6����
����0�
T�������
����Q�T�������
��	��q�
T�������
��
����T������T������UNINDEXLNCHARTTYPENCHARTVALUETHIS
NCHARTTYPE[	��
��%�C�
����L��T�T����
���T�����
���
��C�����UVNEWVALTHIS
LADDLEGEND	AUTOGRAPHREFRESHGRAPH
��C����UTHIS
SETUPGRAPH
setupgraph,��refreshgraph���lseriesbyrow_assign���ncharttype_assign���setcharttype'��laddlegend_assign��Init���1q�qAca�AAq�A�AA�������A�3�qA��A��1�11����AQA��A�3�q!Q�A2�q!Q�A3qrqA���1�1�1�1�1�1�1�1�1�1�A3�q!Q�A2�1Ps&':P�IA�QH��Zf�m���)�
�PROCEDURE setupgraph
LOCAL i

IF EMPTY(ALIAS())
	WAIT WINDOW C_NOALIAS_LOC TIMEOUT 2
	RETURN .F.
ENDIF

* Check if no THIS.aDataFields array not populated by user.
IF EMPTY(THIS.aDataFields[1])
	FOR i = 2 TO FCOUNT()
		IF ATC(TYPE("EVAL(FIELD(m.i))"),"CLGDMT")#0
			LOOP
		ENDIF
		IF !EMPTY(THIS.aDataFields[1])
			DIMENSION THIS.aDataFields[ALEN(THIS.aDataFields)+1]
		ENDIF
		THIS.aDataFields[ALEN(THIS.aDataFields)] = FIELD(m.i)
	ENDFOR
ENDIF

ACOPY(THIS.aDataFields,THIS.Autograph.aDataFields)

WITH THIS.autograph
	.lGraphRecord = .t.							&& graph just one record
	.nAction = 0								&& preview/display mode
	.lAddlegend = THIS.lAddlegend 				&& data is in rows
	.lSeriesByRow = THIS.lSeriesByRow			&& data is in rows
	.nChartType = THIS.nChartType				&& line chart
	.lStripExcessLegend = .t.					&& if MS Graph adds extra legends, get rid of them
	.lUse8Type = .t.							&& use documented graph types
	.lShowWhenDone = .F.						&& don't display (our form will handle it)
	.lKeepForm = .T.							&& don't reset form (use this one)
ENDWITH

THIS.RefreshGraph()

ENDPROC
PROCEDURE refreshgraph
IF EMPTY(ALIAS())
	RETURN .F.
ENDIF

THISFORM.LockScreen = .T.

WITH THIS.Autograph
	.graphpreview = THISFORM					&& the form
	.oGraphRef = THIS.oleGraph.object			&& and the ole control object
	.lAddedData = .F.
	DO CASE
	CASE !EMPTY(THIS.cGraphField)
		.lAddTitle = .T.
		.cTitle = EVAL(THIS.cGraphField)
	CASE !EMPTY(THIS.cGraphTitle)
		.lAddTitle = .T.
		.cTitle = IIF(THIS.cGraphTitle=C_RECDESC_LOC,;
			C_RECDESC_LOC+" "+TRANS(RECNO()),THIS.cGraphTitle)
	OTHERWISE
		.lAddTitle = .F.
	ENDCASE
	IF !.MakeOutput()
		MESSAGEBOX(ERR_NOGRAPH_LOC)
	ENDIF	
	.graphpreview = null
	.oGraphRef = null
ENDWITH

THIS.OleGraph.Visible = .T.

THISFORM.LockScreen = .F.

ENDPROC
PROCEDURE lseriesbyrow_assign
LPARAMETERS m.vNewVal
IF VARTYPE(m.vNewVal)="L"
	THIS.lseriesbyrow = m.vNewVal
	THIS.AutoGraph.lseriesbyrow = m.vNewVal
	THIS.RefreshGraph()
ENDIF
ENDPROC
PROCEDURE ncharttype_assign
LPARAMETERS m.vNewVal
IF VARTYPE(m.vNewVal)="N"
	THIS.ncharttype = m.vNewVal
	THIS.AutoGraph.ncharttype = m.vNewVal
	THIS.RefreshGraph()
ENDIF

ENDPROC
PROCEDURE setcharttype
LPARAMETER nIndex

IF VARTYPE(m.nIndex)#"N"
	RETURN .F.
ENDIF

LOCAL lnChartType,nChartValue

nChartValue = m.nIndex

DO CASE
CASE m.nChartValue = 1	&&Area
	lnChartType = I_AREA_GRAPH
CASE m.nChartValue = 2	&&Area 3D
	lnChartType = I_AREA3D_GRAPH
CASE m.nChartValue = 3	&&Bar
	lnChartType = I_BAR_GRAPH
CASE m.nChartValue = 4	&&Bar 3D
	lnChartType = I_BAR3D_GRAPH
CASE m.nChartValue = 5	&&Column
	lnChartType = I_COLUMN_GRAPH
CASE m.nChartValue = 6	&&Column 3D
	lnChartType = I_COLUMN3D_GRAPH
CASE m.nChartValue = 7	&&Pie
	lnChartType = I_PIE_GRAPH
CASE m.nChartValue = 8	&&Pie 3D
	lnChartType = I_PIE3D_GRAPH
CASE m.nChartValue = 9	&&Line
	lnChartType = I_LINE_GRAPH
CASE m.nChartValue = 10	&&Line 3D
	lnChartType = I_LINE3D_GRAPH
ENDCASE

THIS.nChartType = lnChartType

ENDPROC
PROCEDURE laddlegend_assign
LPARAMETERS m.vNewVal
IF VARTYPE(m.vNewVal)="L"
	THIS.lAddlegend = m.vNewVal
	THIS.AutoGraph.lAddlegend = m.vNewVal
	THIS.RefreshGraph()
ENDIF
ENDPROC
PROCEDURE Init
THIS.SetupGraph()
ENDPROC
�cerrormessage Error message.
ccomfile Name of COM file being.
lhaderror Whether an error has happened.
otliapp Object reference to type library reader application.
otypelib Object reference to type library.
ctypelib Name of type library.
nclassref Numeric reference to selected class in classes array.
oclass Object reference to class in type library.
lskipalerts Whether to skip alerts.
cclass Name of class.
*alert Displays alert messagebox.
^aints[1,0] Array of interfaces.
*checktliapp Checks and loads type library reader application.
*checktypelib Checks and loads type library from COM server file.
*getclasses Returns array of classes in specified type library.
*checkclass Sets class as current one from a type library.
*getmethods Returns array of methods in specified class of type library.
*getparminfo Returns array of parameter info for a method in a class in specified type library.
^omethods[1,0] Object references array to methods of a class in type library.
*vartypetostring Returns data type (string) from numeric reference.
*checkvariant Checks if a variant data type is used in method for parameter or return type.
*exporttypelib Method to export typelib to file.
*getinvokekind 
��� ||S�
%�sF��UR���%��C�������4�T�������K���C���x���U	TCMESSAGE	STARTMODETHISLSKIPALERTS
CERRORMESSAGEg%�C�����O��`�%T���C�tli.tliapplication�N��%�C�����O��\�B�-����UTHISOTLIAPP���������%�C��
��/�B�-���%�C����C�C��
	��}�%�C�0
��i�B�-���T�������%�C����O��$�T���-��T��C����	��%����C����O����T���-��B�-���T��
�����T��������B�a���%%�C�����C�
C���
	��k�%�C��0
��g�B�-����0%�C��
���O�C��
�fC��f	����B�a���T���-��T��
�a��T��C�������T��
�-��%����C����O��g�T���-��E��C�5File does not appear to contain a valid type library.����B�-���T�������%�������B�-���T��
����UETYPELIBLNCLASSCOUNT	LOTYPELIB	LCTYPELIBTHISCHECKTLIAPPCTYPELIB	LHADERROROTLIAPPINTERFACEINFOFROMOBJECTOTYPELIBPARENTCONTAININGFILE
LIGNOREERRORSTYPELIBINFOFROMFILEALERT	COCLASSESCOUNTu����������%�C���
��=�	B�����%�C����L��c�
T������T�����	�
��%�����e��������������(����a�
%������:T���
����������.C�
����	����2�+T���
������C�
����	����+T���
������C�
����	������	B����U
ACLASSESETYPELIB
LRETURNPROGID	LNCLASSESI
LUSEPROGIDTHISCHECKTYPELIBOTYPELIB	COCLASSESCOUNTNAMEGUID�������������%�C���	
��C�B�-���%�C����C�C��
	����%%�C����N�
C����
����
T������T����
���������(������
H���o�������.T��C��
�
�.C�
���
��
f�������H�"T��CC�
���
���
f��2�o�T��CC�
���
��
f���%�C�f�����T����
��� T���C�
���
����B�a�����B�-���B�C�����O��UECLASS
NCLASSTYPEETYPELIBLNCLASSTYPE	LNCLASSESILCSTRLOCLASSTHISCHECKTYPELIBOTYPELIB	COCLASSESCOUNTNAMEDEFAULTINTERFACE	NCLASSREFOCLASSb�������������%�C����	�

��Q�	B�����
T�����T���	���
��%�����R����������	�����
T����������(����A�
H���A�*��
��C�
��	����	���.���
����#�CC�
��	������A�.��T��C����%�C��
����T���������������	������)T��������C�
��	�����,T��������C�
��	������)T��������C�
��	�����#T�	�����C�
��	������
T������	B����UAMETHODSECLASS
NCLASSTYPEETYPELIBLMETHODSONLYLINCLUDEHIDDENI
LNMEMCOUNTLNMAXARRTHIS
CHECKCLASSOCLASSMEMBERSCOUNTOMETHODS
INVOKEKIND
ATTRIBUTEMASKNAME
RETURNTYPEVARTYPE
HELPSTRINGv���������%�C����O��8�	B�����T�������%�����f���������
T����������(����b�T��C����%�C��
����T���������������&T��������C�
������)T��������C�
�����	��1T��������CC�
����
�������	B����U	APARMINFOOMETHODLNPARMCOUNTILNMAXARR
PARAMETERSCOUNTNAMEVARTYPEINFOVARTYPEFLAGS����
H���������5�B��variant�������S�
B��NULL�������t�B��integer���������
B��long���������B��single���������B��double���������B��currency��������
B��date�������2�B��string�����	��S�B��VARIANT�������t�B��boolean���������B��variant���������B��number���������B��number���������B��number��������B��number�������6�B��integer�������W�B��integer�������u�
B��VOID���������
B��VOID��2���B��variant���UNTYPE�����������
�����T��C��--a���������(�����%�CC�
����������B�-���
�����"T��C�C�
���
��	�������(������%�CC�
����������B�-�������UTCINTERFACELNMCOUNTLNPCOUNTLAMETHSLAPARMSIJTHIS
GETMETHODSGETPARMINFOOMETHODS/���������������	�
���
T�����-%�C�
THIS.ctypelibb�C�	C�
������8T�
��C�Type Libraries: TLB,DLL,EXE�Typelib:����%�C�
���
C�
�0
����	B�����!%�C�
m.lNoViewFileb�L��
�
T�
��-���7%�C�
m.cExportFileb�C�C�
m.cExportFile���e�T�
��C�
����.TXT���T��C�SAFETYv��G.�%�C�
������
<,��
����G` �
G`(��;��4 <<SPACE(0) + "Type Library = ">>  <<THIS.ctypelib>>�
�����T��C��
��������(������G��@ <<SPACE(2)+"Class: "+laClasses[m.i, 1]>>  <<laClasses[m.i, 2]>>����
�
����"T�	�C�
C�
����
��������(��	����.��' <<SPACE(4) + laMethods[m.j, 1] + "(">>�
�����"T��C�C�
��
��
��������(������k��d <<laParms[m.k, 1] + " AS " + THIS.Vartypetostring(laParms[m.k, 2]) + IIF(laParms[m.k, 3]," @","")>>�%���
������", "����;��4<<") AS " +THIS.vartypetostring(laMethods[m.j, 2])>>�Q��J <<SPACE(4) + "Type: "+THIS.Getinvokekind(THIS.oMethods[m.j].InvokeKind)>>�%�CCC�
���
��
����(��! <<SPACE(4) + laMethods[m.j, 3]>>������������G`(�G`�%�C��
������C��
�����SET SAFETY &cOldSafe
%��
�
�C��
	���/��
��:��B��
���UCEXPORTFILELNOVIEWFILECOLDSAFEIJKLCTMPSTR	LNCLASSES	LACLASSES	LNMETHODS	LAMETHODSLAPARMSLNPARMSTHISCTYPELIB
GETCLASSES
GETMETHODSGETPARMINFOOMETHODS.���
H��'������5�B��Unknown�������W�B��Function�������|�B��PropertyGet���������B��PropertyPut���������B��PropertyPutRef���������B��
EventFunction����� ���B��CONST��2�'�B��Unknown���UNKINDIT����T����T����T����T����UTHISOMETHODSOCLASSOTLIAPPOTYPELIBAINTSw�����T���a��2%����C��Y������
�C����S�B��p�B�C������UNERRORCMETHODNLINETHIS	LHADERROR
LIGNOREERRORS	STARTMODEalert,��checktliapp���checktypelib4��
getclasses���
checkclass���
getmethods?	��getparminfoz��vartypetostringX��checkvariant��
exporttypelib���
getinvokekindi��Destroy���Error!��1q���A3�Q�qAA3q�"qA�qAAS����qA1aqAS1qAAqA������QqA1qA3��b�AR�Ab1q����A�AA�3�{bqA�Q�Aaq��!��A1!qAAqAB3����A�a1�q��A�1AA11A���1A�A�3��Q�A21�q11Aa�AA�3q��������������A3q���q�qA�!q�qAAA3�q����A��A�Ar�AQa�Ar���Qqqq�!q��!q��AA���AqAqAbaA���A�3q�AAqa��A2�����3��!A�QA1��C
f�<a	PR�	�
mo�
����p���S��v�8�$4$�$;&}8Y&�&�>�&�'�)|'�PROCEDURE alert
LPARAMETERS tcMessage
IF _VFP.StartMode#0 OR THIS.lSkipAlerts
	THIS.cErrorMessage = tcMessage
ELSE
	MESSAGEBOX(tcMessage,16)
ENDIF

ENDPROC
PROCEDURE checktliapp
IF VARTYPE(THIS.oTLIApp)#"O"
	THIS.oTLIApp = CREATEOBJECT(TLIAPP_PROGID)
	IF VARTYPE(THIS.oTLIApp)#"O"
		RETURN .F.
	ENDIF
ENDIF

ENDPROC
PROCEDURE checktypelib
LPARAMETERS eTypelib

LOCAL lnClassCount, loTypelib, lcTypelib

IF !THIS.CheckTLIApp()
	RETURN .F.
ENDIF

* Check for valid typelib file passed
IF VARTYPE(eTypelib)="C" AND !EMPTY(eTypelib)
	IF !FILE(eTypelib)
		RETURN .F.
	ENDIF
	THIS.cTypelib = eTypelib
ENDIF

* Check if user passed in an IDispath object instead of typelib name
IF VARTYPE(eTypelib)="O"
	THIS.lHadError = .F.
	loTypelib = THIS.oTLIApp.InterfaceInfoFromObject(eTypelib)
	IF THIS.lHadError OR VARTYPE(loTypelib)#"O"
		THIS.lHadError = .F.
		RETURN .F.
	ENDIF
	THIS.oTypelib = loTypelib.Parent
	THIS.cTypelib = loTypelib.Parent.ContainingFile
	RETURN .T.
ENDIF

* Check for valid cTypelib property (possibly set)
IF VARTYPE(THIS.cTypelib )="C" AND !EMPTY(THIS.cTypelib)
	IF !FILE(THIS.cTypelib)
		RETURN .F.
	ENDIF
ENDIF

* Check for valid oTypelib property
IF VARTYPE(THIS.oTypelib)="O" AND UPPER(THIS.oTypelib.ContainingFile)==UPPER(THIS.cTypelib)
	RETURN .T.
ENDIF

* Need to check if valid
THIS.lHadError = .F.
THIS.lignoreerrors = .T.
loTypelib = THIS.oTLIApp.TypeLibInfoFromFile(THIS.cTypelib)
THIS.lignoreerrors = .F.
IF THIS.lHadError OR VARTYPE(loTypelib)#"O"
	THIS.lHadError = .F.
	THIS.ALERT(BADTYPELIB_LOC)
	RETURN .F.
ENDIF
lnClassCount = loTypelib.CoClasses.Count
IF lnClassCount=0
	RETURN .F.
ENDIF

* Successful check, so let's set oTypelib property
THIS.oTypelib = loTypelib

ENDPROC
PROCEDURE getclasses
LPARAMETERS aClasses, eTypelib, lReturnProgID

LOCAL lnClasses, i, lUseProgID

IF !THIS.CheckTypeLib(eTypelib)
	RETURN 0
ENDIF

IF VARTYPE(lReturnProgID)="L"
	lUseProgID = lReturnProgID
ENDIF

lnClasses = THIS.otypelib.CoClasses.Count
IF lnClasses > 0
	DIMENSION aClasses[lnClasses,2]
	FOR i = 1 TO lnClasses
		IF lUseProgID
			aClasses[m.i,1] = THIS.otypelib.Name + "." + THIS.otypelib.CoClasses(m.i).Name
		ELSE
			aClasses[m.i,1] = THIS.otypelib.CoClasses(m.i).Name		
		ENDIF
		aClasses[m.i,2] = THIS.otypelib.CoClasses(m.i).GUID		
	ENDFOR
ENDIF

RETURN lnClasses

ENDPROC
PROCEDURE checkclass
LPARAMETERS eClass, nClassType, eTypelib

* nClassType details:
* 0 - eClass passed in is class name (default)
* 1 - eClass passed in is progid name
* 2 - eClass passed in is interface name
* ex. for a ProgID of "VFPTEST.STOCK", pass in
*   0 - "STOCK"
*   1 - "VFPTEST.STOCK"
*   2 - "ISTOCK"

LOCAL lnClassType,lnClasses,i,lcStr,loClass

IF !THIS.CheckTypeLib(eTypelib)
	RETURN .F.
ENDIF

IF VARTYPE(eClass)="C" AND !EMPTY(eClass)
	IF VARTYPE(nClassType)#"N" OR !BETWEEN(nClassType,0,2)
		lnClassType=0
	ENDIF
	lnClasses = THIS.otypelib.CoClasses.Count
	FOR i = 1 TO lnClasses
		DO CASE
		CASE lnClassType=1
			lcStr = UPPER(THIS.otypelib.Name+"."+THIS.otypelib.CoClasses(m.i).Name)
		CASE lnClassType=2
			lcStr = UPPER(THIS.otypelib.CoClasses(m.i).DefaultInterface.Name)
		OTHERWISE
			lcStr = UPPER(THIS.otypelib.CoClasses(m.i).Name)
		ENDCASE
		IF UPPER(eClass)==lcStr
			THIS.nClassRef = m.i
			THIS.oClass = THIS.otypelib.CoClasses(m.i).DefaultInterface
			RETURN .T.
		ENDIF
	ENDFOR
	RETURN .F.
ENDIF

RETURN VARTYPE(THIS.oClass)="O"

ENDPROC
PROCEDURE getmethods
LPARAMETERS aMethods, eClass, nClassType, etypelib, lMethodsOnly, lIncludeHidden
* nClassType - see CheckClass method
* populates aMethods array:
*  element 1 - name
*  element 2 - return type (numeric)
*  element 3 - help string
* also populates THIS.aMethods array with obj refs

* InvokeKind:
* 0 - Unknown
* 1 - Function
* 2 - PropertyGet
* 4 - PropertyPut
* 8 - PropertyPutRef
* 16 - EventFunction
* 32 - CONST

LOCAL i, lnMemCount, lnMaxArr
IF !THIS.CheckClass(eClass, nClassType, eTypelib)
	RETURN 0
ENDIF
lnMaxArr=0
lnMemCount = THIS.oClass.Members.Count
IF lnMemCount > 0
	DIMENSION aMethods[1,3]
	DIMENSION THIS.oMethods[1]
	aMethods=""
	FOR i = 1 TO lnMemCount
		* Skip hidden/restricted members (e.g., QueryInterface)
		DO CASE
		CASE m.lMethodsOnly AND THIS.oClass.Members(m.i).InvokeKind #1			&& properties
			LOOP
		CASE m.lIncludeHidden
		CASE BITTEST(THIS.oClass.Members(m.i).AttributeMask, 0)  					&& hidden and restricted
			LOOP
		ENDCASE
		lnMaxArr = ALEN(aMethods,1)
		IF !EMPTY(aMethods)
			lnMaxArr = lnMaxArr+1
			DIMENSION aMethods[lnMaxArr,3]
			DIMENSION THIS.oMethods[lnMaxArr]
		ENDIF
		aMethods[lnMaxArr,1] = THIS.oClass.Members(m.i).Name
		aMethods[lnMaxArr,2] = THIS.oClass.Members(m.i).ReturnType.VarType
		aMethods[lnMaxArr,3] = THIS.oClass.Members(m.i).HelpString
		THIS.oMethods[lnMaxArr] = THIS.oClass.Members(m.i)
	ENDFOR
	lnMemCount = lnMaxArr
ENDIF
RETURN lnMemCount

ENDPROC
PROCEDURE getparminfo
LPARAMETERS aParmInfo, oMethod
* populates aParmInfoarray:
*  element 1 - name
*  element 2 - type (numeric)
*  element 3 - byref

LOCAL lnParmCount,i,lnMaxArr
IF VARTYPE(oMethod)#"O"
	RETURN 0
ENDIF

lnParmCount = oMethod.Parameters.Count
IF lnParmCount>0
	DIMENSION aParmInfo[1,3]
	aParmInfo=""
	FOR i = 1 TO lnParmCount
		lnMaxArr = ALEN(aParmInfo,1)
		IF !EMPTY(aParmInfo)
			lnMaxArr = lnMaxArr+1
			DIMENSION aParmInfo[lnMaxArr,3]
		ENDIF
		aParmInfo[lnMaxArr,1] = oMethod.Parameters(m.i).Name
		aParmInfo[lnMaxArr,2] = oMethod.Parameters(m.i).VarTypeInfo.VarType
		aParmInfo[lnMaxArr,3] = (BITAND(oMethod.Parameters(m.i).flags,3)=3)
	ENDFOR
ENDIF
RETURN lnParmCount

ENDPROC
PROCEDURE vartypetostring
LPARAMETERS nType

DO CASE
CASE ntype = 0		&& VT_EMPTY
	RETURN "variant"
CASE ntype = 1		&& VT_NULL
	RETURN "NULL"
CASE ntype = 2		&& VT_I2
	RETURN "integer"
CASE nType = 3		&& VT_I4
	RETURN "long"
CASE nType = 4		&& VT_R4
	RETURN "single"
CASE nType = 5		&& VT_R8
	RETURN "double"
CASE nType = 6		&& VT_CT
	RETURN "currency"
CASE ntype = 7
	RETURN "date"
CASE ntype = 8
	RETURN "string"
CASE ntype = 9		&& VT_DISPATCH
	RETURN "VARIANT"
CASE nType = 11
	RETURN "boolean"
CASE nType = 12		&& VT_VARIANT
	RETURN "variant"
CASE nType = 16 	&& VT_I1
	RETURN "number"
CASE nType = 17 	&& VT_UI1
	RETURN "number"
CASE nType = 18 	&& VT_UI2
	RETURN "number"
CASE nType = 19 	&& VT_UI4
	RETURN "number"
CASE nType = 22		&& VT_INT
	RETURN "integer"
CASE nType = 23		&& VT_UINT
	RETURN "integer"
CASE nType = 24		&& VT_VOID
	RETURN "VOID"
CASE nType = 25		&& VT_HRESULT
	RETURN "VOID"
OTHERWISE
	RETURN "variant"
ENDCASE

ENDPROC
PROCEDURE checkvariant
LPARAMETERS tcInterface
* Checks for Variant return type or parameter type which are not supported in SOAP.
* Used for Web Services only since it doesn't check properties
LOCAL lnMCount, lnPCount, laMeths, laParms, i, j
DIMENSION laMeths[1]
lnMCount = THIS.GetMethods(@laMeths,tcInterface, .F., .F., .T.)
FOR i = 1 TO lnMCount
	* Check for valid return type -- fail for Currency or Variant
	IF INLIST(laMeths[m.i,2],6,12)
		RETURN .F.
	ENDIF
	DIMENSION laParms[1]
	lnPCount = THIS.GetParmInfo(@laParms,THIS.oMethods(m.i))
	FOR j = 1 TO lnPCount
		* Check for valid parameter type
		IF INLIST(laParms[m.j,2],6,12)
			RETURN .F.
		ENDIF
	ENDFOR
ENDFOR

ENDPROC
PROCEDURE exporttypelib
* You can use this method to export the contents of a type library to a text file. 
LPARAMETER cExportFile, lNoViewFile
LOCAL cOldSafe,i,j,k,lcTmpStr
LOCAL lnClasses,laClasses,lnMethods,laMethods,laParms,lnParms
lcTmpStr=""
IF TYPE("THIS.ctypelib")#"C" OR EMPTY(THIS.ctypelib)
	THIS.ctypelib = GETFILE(GETFILE1_LOC,GETFILE2_LOC)
ENDIF

IF EMPTY(THIS.ctypelib) OR !FILE(THIS.ctypelib)
	RETURN ""
ENDIF

IF TYPE("m.lNoViewFile")#"L"
	m.lNoViewFile = .F.
ENDIF

IF TYPE("m.cExportFile")#"C" OR EMPTY("m.cExportFile")
	m.cExportFile = JustStem(THIS.ctypelib) + ".TXT"
ENDIF
cOldSafe = SET("SAFETY")
SET SAFETY OFF

IF WEXIST(m.cExportFile)
	RELEASE WINDOW (m.cExportFile)
ENDIF

SET TEXTMERGE ON NOSHOW
SET TEXTMERGE TO MEMVAR lcTmpStr

* Gather and output Typelib information
\ <<TYPELIBSPACING + TLIB1_LOC>>  <<THIS.ctypelib>>
DIMENSION laClasses[1]
lnClasses=THIS.Getclasses(@laClasses)
FOR i = 1 TO lnClasses
	\ <<TYPEINFOSPACING+TCLASS_LOC+laClasses[m.i, 1]>>  <<laClasses[m.i, 2]>>
	\
	DIMENSION laMethods[1]
	lnMethods=THIS.GetMethods(@laMethods,laClasses[m.i, 1])
	FOR j = 1 TO lnMethods
		\ <<FUNCDESCSPACING + laMethods[m.j, 1] + "(">>
		DIMENSION laParms[1]
		lnParms=THIS.Getparminfo(@laParms,THIS.oMethods[m.j])
		FOR k = 1 TO lnParms
			\\ <<laParms[m.k, 1] + " AS " + THIS.Vartypetostring(laParms[m.k, 2]) + IIF(laParms[m.k, 3]," @","")>>
			IF k < lnParms
				\\", "
			ENDIF
		ENDFOR
		\\<<") AS " +THIS.vartypetostring(laMethods[m.j, 2])>>
		\ <<FUNCDESCSPACING + "Type: "+THIS.Getinvokekind(THIS.oMethods[m.j].InvokeKind)>>
		IF !EMPTY(ALLTRIM(laMethods[m.j, 3]))
			\ <<FUNCDESCSPACING + laMethods[m.j, 3]>>
		ENDIF
		\
	ENDFOR
	\
ENDFOR

SET TEXTMERGE TO
SET TEXTMERGE OFF
IF !EMPTY(lcTmpStr)
	STRTOFILE(lcTmpStr, m.cExportFile)
ENDIF

SET SAFETY &cOldSafe
IF !m.lNoViewFile AND !EMPTY(lcTmpStr)
	MODIFY FILE (m.cExportFile) NOWAIT
ENDIF
RETURN m.cExportFile

ENDPROC
PROCEDURE getinvokekind
LPARAMETERS nKind
DO CASE
CASE nKind= 0
	RETURN "Unknown"
CASE nKind= 1
	RETURN "Function"
CASE nKind= 2
	RETURN "PropertyGet"
CASE nKind= 4
	RETURN "PropertyPut"
CASE nKind= 8
	RETURN "PropertyPutRef"
CASE nKind= 16
	RETURN "EventFunction"
CASE nKind= 32
	RETURN "CONST"
OTHERWISE
	RETURN "Unknown"
ENDCASE
ENDPROC
PROCEDURE Destroy
THIS.omethods = null
THIS.oclass = null
THIS.otliapp = null
THIS.otypelib = null
THIS.aInts = null

ENDPROC
PROCEDURE Error
LPARAMETERS nError, cMethod, nLine
THIS.lhaderror = .T.
IF THIS.lIgnoreErrors OR INLIST(nError,1113, 1426, 2012) OR _VFP.StartMode>0
	RETURN
ELSE
	RETURN DODEFAULT(nError, cMethod, nLine)
ENDIF
ENDPROC