Initial: flux text FoxBin2Prg (git urmareste .??2 in-arbore, binarele VFP git-ignored)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 10:55:38 +03:00
commit 2f59024385
1271 changed files with 820556 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
CLOSE DATABASES
SET DELETED ON
SET CENTURY on
SET ANSI ON
SET EXACT ON
*!* SET DEFAULT TO "d:\roa_trunk\roastart\locale"
USE locale IN 0 SHARED
*Use test
oGt = Createobje("ugt") && ,"google.prg")
SELECT locale
Scan For Language='English' AND !translated
*!* ?oGt.translate("ro","en",cuvant)
lcPhrase = ALLTRIM(phrase)
IF RIGHT(lcPhrase,1) = '*'
lcPhrase = LEFT(lcPhrase, LEN(lcPhrase) - 1)
ENDIF
lcTranslated = oGt.translate("ro","en",lcPhrase)
IF !EMPTY(lcTranslated)
Replace phrase With lcTranslated , translated WITH .T.
ENDIF
ENDSCAN
Select locale
Browse
Define Class ugt As Custom
* apiUrl = "http://translate.google.com/translate_t?&"+"hl=en&"+"ie=UTF8"
apiUrl = "http://translate.google.com/translate_t?"
*!* apiStartTags = "<"+"div id=result_box dir=ltr>"
apiStartTags = [<div id=result_box dir="ltr">]
apiEndTags = "<"+"/div>"
Function translate(lcFrom,lcTo,lcText)
Local lcHttp As MSXML2.XMLHTTP
Local lcRequest As String
lcRequest = This.apiUrl+"langpair="+This.urlEncode(lcFrom+"|"+lcTo)+"&"+"text="+This.urlEncode(lcText)
lcHttp = Createobject("MSXML2.XMLHTTP")
*!-- lcHttp.open("GET",this.apiUrl,.f.)
lcHttp.Open("GET",lcRequest,.F.)
lcHttp.Send()
*!* DEBUG
*!* SUSPEND
If lcHttp.Status == 200
lcText = Strextract(lcHttp.responseText,This.apiStartTags,This.apiEndTags)
Endif
Return lcText
Endfunc
Function urlEncode
Parameters tcValue, llNoPlus
Local lcResult, lcChar, lnSize, lnX
*** Do it in VFP Code
lcResult=""
For lnX=1 To Len(tcValue)
lcChar = Substr(tcValue,lnX,1)
If Atc(lcChar,"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") > 0
lcResult=lcResult + lcChar
Loop
Endif
If lcChar=" " And !llNoPlus
lcResult = lcResult + "+"
Loop
Endif
*** Convert others to Hex equivalents
lcResult = lcResult + "%" + Right(Transform(Asc(lcChar),"@0"),2)
Endfor
Return lcResult
Endfunc
Enddefine

BIN
utile/GridExtras/adauga.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

BIN
utile/GridExtras/add16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

BIN
utile/GridExtras/cauta.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

View File

@@ -0,0 +1 @@
RESOURCE=OFF

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

BIN
utile/GridExtras/excel.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
utile/GridExtras/exit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

BIN
utile/GridExtras/find.BMP Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,712 @@
********************************
*!* Simple Sample Usage
********************************
*!* DIMENSION aWrkSht(1), aCols(1)
*!* m.lcXlsFile = GETFILE("Excel:XLS,XLSX,XLSB,XLSM")
*!* IF FILE(m.lcXlsFile)
*!* CLEAR
*!* ?AWorkSheets(@aWrkSht,m.lcXlsFile,.T.)
*!* ?AWorkSheetColumns(@aCols,m.lcXlsFile,"Sheet1")
*!* AppendFromExcel(m.lcXlsFile, "Sheet1", "MyTable", "column1,column2,column3", "Recnum Is Not Null", "field1,field2,field3", "field1 > 14000")
*!* SELECT MyTable
*!* GO TOP IN "MyTable"
*!* BROWSE LAST NOWAIT
*!* ENDIF
*!* CopyToExcel("C:\Test.xlsx", "Sheet1", "MyTable") && try xls, xlsb, and xlsm as well
**********************************
FUNCTION AppendFromExcel(tcXLSFile, tcSheet, tvWorkarea, tcExcelFieldList, tcExcelWhereExpr, tcTableFieldList, tcTableForExpr, tlNoHeaderRow)
**********************************
* PARAMETER Information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tcSheet := a string specifying the name of a worksheet within the excel workbook (can also be a range Sheet1$A1:C20 for instance)
* tvWorkarea [optional] := the Alias, Work Area, or File Name of the table you want the worksheet result set appended to (default is currently selected Alias)
* tcExcelFieldList [optional] := a comma delimited list of columns you want from the worksheet (default is '*' - all columns)
* tcExcelWhereExpr [optional] := a valid SQL Where clause to be used when querying the worksheet (default is '1=1')
* tcTableFieldList [optional] := a comma delimited list of fields you want the worksheet result set inserted into (default is '*' - all fields)
* tcTableForExpr [optional] := a valid VFP Where clause to be used when querying the worksheet result set (cursor) (default is '.T.')
* tlNoHeaderRow [optional] := pass .T. if the worksheet does not contain a header row, .F. is the default which specifies that a header row does exist
*
* RETURN Information
* returns numeric, the number of records inserted into tvWorkArea
*
* Provider Information
* the default provider being used in the SQLStringConnect function can be downloaded and installed from:
* http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en
**********************************
LOCAL lnSelect, laErr[1], laTableFields[1], laExcelFields[1], lnFieldCounter, ;
lcSQLAlias, lnResult, lcInsertValues, lcFieldList, lcNvlFieldList, ;
lcFieldType, lcExcelFieldType, lcNvlFieldName, lcTempAlias, loExc, lnReturn, ;
lcHeaderRow, llOpenedtvWorkArea
m.lnSelect = SELECT(0)
m.lnReturn = 0
IF NOT FILE(m.tcXLSFile)
ERROR 1, m.tcXLSFile
ENDIF
IF !USED(m.tvWorkarea) AND TYPE("m.tvWorkArea") = "C" AND FILE(DEFAULTEXT(m.tvWorkarea,"DBF"))
SELECT 0
USE (DEFAULTEXT(m.tvWorkarea,"DBF")) SHARED AGAIN
m.tvWorkarea = ALIAS()
m.llOpenedtvWorkArea = .T.
ELSE
IF !USED(m.tvWorkarea)
m.tvWorkarea = ALIAS()
ENDIF
ENDIF
IF TYPE("m.tvWorkArea") = "N"
m.tvWorkArea = ALIAS(m.tvWorkArea)
ENDIF
m.tcSheet = ALLTRIM(EVL(m.tcSheet,"Sheet1$"))
IF AT("$",m.tcSheet) = 0
m.tcSheet = m.tcSheet + "$"
ENDIF
m.tcExcelFieldList = EVL(m.tcExcelFieldList,"*")
m.tcExcelWhereExpr = EVL(m.tcExcelWhereExpr,"1=1")
m.tcTableFieldList = EVL(m.tcTableFieldList,"*")
m.tcTableForExpr = EVL(m.tcTableForExpr,".T.")
m.lcSQLAlias = SYS(2015)
m.lcTempAlias = SYS(2015)
m.lnSQL = 0
m.lcHeaderRow = IIF(EMPTY(m.tlNoHeaderRow), "Yes", "No")
TRY
SELECT (m.tvWorkarea)
m.lnSQL = SQLSTRINGCONNECT([Provider=Microsoft.ACE.OLEDB.12.0;Data Source="] + m.tcXLSFile + [";Extended Properties="Excel 12.0 Xml;HDR=] + m.lcHeaderRow + [;";])
*!* Alternate using DSN that comes with Office install (MSDASQL = OLEDB wrapper for ODBC)
*!* m.lnSQL = SQLSTRINGCONNECT("Provider=MSDASQL.1;" ;
*!* +"Persist Security Info=False;" ;
*!* +"DSN=Excel Files;" ;
*!* +"DBQ="+FULLPATH(m.tcXLSFile)+";" ;
*!* +"DriverId=790;" ;
*!* +"MaxBufferSize=2048;" ;
*!* +"PageTimeout=5;")
*!* Try a few other drivers that may be on the user's machine
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
IF m.lnSQL < 0 AND UPPER(ALLTRIM(JUSTEXT(m.tcXLSFile))) == "XLS" && can we try using the older driver?
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
ENDIF
IF m.lnSQL < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
ENDIF
m.lnResult = SQLEXEC(m.lnSQL,[SELECT ] + m.tcExcelFieldList + [ FROM "] + m.tcSheet + [" Where ] + m.tcExcelWhereExpr, m.lcSQLAlias)
IF m.lnResult < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
IF USED(m.lcSQLAlias)
m.lcFieldList = ""
m.lcNvlFieldList = ""
m.lnTotalExcelFields = AFIELDS(m.laExcelFields, m.lcSQLAlias)
SELECT &tcTableFieldList FROM (m.tvWorkarea) WHERE .F. INTO CURSOR (m.lcTempAlias)
FOR m.lnFieldCounter = 1 TO MIN(AFIELDS(m.laTableFields, m.lcTempAlias), m.lnTotalExcelFields)
m.lcFieldList = m.lcFieldList + IIF(!EMPTY(m.lcFieldList),",","")+m.laTableFields[m.lnFieldCounter,1]
m.lcFieldType = CHRTRAN(m.laTableFields[m.lnFieldCounter,2],"NIFYD","BBBBT")
m.lcExcelFieldType = CHRTRAN(m.laExcelFields[m.lnFieldCounter,2],"CVNIFYD","MMBBBBT")
m.lcNvlFieldName = m.laExcelFields[m.lnFieldCounter,1]
IF !m.laTableFields[m.lnFieldCounter,5]
m.lcNvlFieldName = [NVL(]+m.lcNvlFieldName+[,]+;
ICASE(m.lcExcelFieldType="B", "0", ;
m.lcExcelFieldType="M", "''", ;
m.lcExcelFieldType="T", "{//}", ;
m.lcExcelFieldType="L", ".F.", ;
"''")+[)]
ENDIF
IF INLIST(m.lcFieldType, "C", "V")
m.lcNvlFieldName = [CAST(]+m.lcNvlFieldName+[ AS ]+m.lcFieldType+[(] + TRANSFORM(m.laTableFields[m.lnFieldCounter,3]) + [))]
ELSE
m.lcNvlFieldName = [CAST(]+m.lcNvlFieldName+[ AS ]+m.lcFieldType+[)]
ENDIF
m.lcNvlFieldList = m.lcNvlFieldList + IIF(!EMPTY(m.lcNvlFieldList),",","") + m.lcNvlFieldName
ENDFOR
INSERT INTO (m.tvWorkarea) (&lcFieldList) SELECT &lcNvlFieldList FROM (m.lcSQLAlias) WHERE &tcTableForExpr
m.lnReturn = _TALLY
ENDIF
CATCH TO m.loExc
*!* MESSAGEBOX(m.loExc.MESSAGE + " : " + TRANSFORM(m.loExc.LINENO))
FINALLY
IF m.llOpenedtvWorkArea
USE IN SELECT(m.tvWorkArea)
ENDIF
IF m.lnSQL > 0
SQLDISCONNECT(m.lnSQL)
ENDIF
USE IN SELECT(m.lcTempAlias)
USE IN SELECT(m.lcSQLAlias)
SELECT (m.lnSelect)
ENDTRY
RETURN m.lnReturn
ENDFUNC
**********************************
FUNCTION AWorkSheets(taArray, tcXLSFile, tlAllTables)
**********************************
* PARAMETER Information
* taArray := an array sent in by reference to fill with Worksheet/Table information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tlAllTables := if .T., array will contain information regarding all tables in workbook; .F. returns only worksheets
*
* RETURN Information
* returns numeric, the number of tables found in the workbook
**********************************
LOCAL lnSQL, laErr[1], lcSQLAlias, lnResult, lnReturn, loExc
m.lnReturn = 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+"DBQ="+FULLPATH(m.tcXLSFile)+";")
*!* Alternate using DSN that comes with Office install (MSDASQL = OLEDB wrapper for ODBC)
*!* m.lnSQL = SQLSTRINGCONNECT("Provider=MSDASQL.1;" ;
*!* +"Persist Security Info=False;" ;
*!* +"DSN=Excel Files;" ;
*!* +"DBQ="+FULLPATH(m.tcXLSFile)+";" ;
*!* +"DriverId=790;" ;
*!* +"MaxBufferSize=2048;" ;
*!* +"PageTimeout=5;")
*!* Try a few other drivers that may be on the user's machine
IF m.lnSQL < 0
IF UPPER(ALLTRIM(JUSTEXT(m.tcXLSFile))) == "XLS" && can we try using the older driver?
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
ELSE
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
IF m.lnSQL < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
ENDIF
m.lcSQLAlias = SYS(2015)
m.lnResult = SQLTABLES(m.lnSQL,"VIEW,TABLE,SYSTEM TABLE",m.lcSQLAlias)
IF m.lnSQL > 0
SQLDISCONNECT(m.lnSQL)
ENDIF
IF m.lnResult < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
IF USED(m.lcSQLAlias)
TRY
IF tlAllTables
SELECT CAST(ALLTRIM(table_name) AS V(100)), ;
CAST(ALLTRIM(table_type) AS V(12)) ;
FROM (m.lcSQLAlias) ;
INTO ARRAY taArray
ELSE
SELECT CAST(ALLTRIM(table_name) AS V(100)), ;
CAST(ALLTRIM(table_type) AS V(12)) ;
FROM (m.lcSQLAlias) ;
WHERE table_type = "SYSTEM TABLE" ;
INTO ARRAY taArray
ENDIF
m.lnReturn = _TALLY
CATCH TO m.loExc
THROW
FINALLY
*!* USE IN SELECT(m.lcSQLAlias)
ENDTRY
ENDIF
RETURN m.lnReturn
ENDFUNC
**********************************
FUNCTION AWorkSheetColumns(taArray, tcXLSFile, tcSheet)
**********************************
* PARAMETER Information
* taArray := an array sent in by reference to fill with the specified worksheet's column information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tcSheet := a string specifying the worksheet or table to use when retrieving column information
*
* RETURN Information
* returns numeric, the number of columns found in the worksheet/table
**********************************
LOCAL lnSQL, laErr[1], lnResult, lnReturn, lcSQLAlias, loExc
m.lnReturn = 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+"DBQ="+FULLPATH(m.tcXLSFile)+";")
*!* Alternate using DSN that comes with Office install (MSDASQL = OLEDB wrapper for ODBC)
*!* m.lnSQL = SQLSTRINGCONNECT("Provider=MSDASQL.1;" ;
*!* +"Persist Security Info=False;" ;
*!* +"DSN=Excel Files;" ;
*!* +"DBQ="+FULLPATH(m.tcXLSFile)+";" ;
*!* +"DriverId=790;" ;
*!* +"MaxBufferSize=2048;" ;
*!* +"PageTimeout=5;")
*!* Try a few other drivers that may be on the user's machine
IF m.lnSQL < 0
IF UPPER(ALLTRIM(JUSTEXT(m.tcXLSFile))) == "XLS" && can we try using the older driver?
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
ELSE
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
IF m.lnSQL < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
ENDIF
m.lcSQLAlias = SYS(2015)
m.lnResult = SQLEXEC(m.lnSQL,[SELECT * FROM "] + m.tcSheet + [$" Where 1=0], m.lcSQLAlias)
IF m.lnSQL > 0
SQLDISCONNECT(m.lnSQL)
ENDIF
IF m.lnResult < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
IF USED(m.lcSQLAlias)
TRY
m.lnReturn = AFIELDS(m.taArray, m.lcSQLAlias)
CATCH TO m.loExc
THROW
FINALLY
USE IN SELECT(m.lcSQLAlias)
ENDTRY
ENDIF
RETURN m.lnReturn
ENDFUNC
***********************************
FUNCTION CopyToExcel(tcXLSFile, tcSheet, tvWorkArea, tcExcelFieldList, tcTableFieldList, tcTableForExpr)
***********************************
* PARAMETER Information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tcSheet := a string specifying the name of the worksheet to create within the excel workbook
* tvWorkarea [optional] := the Alias, Work Area, or File Name of the table you want to be copied to the worksheet (default is currently selected Alias)
* tcExcelFieldList [optional] := a comma delimited list of columns you want to create in the worksheet (default is '*' - columns will match table field list)
* tcTableFieldList [optional] := a comma delimited list of fields you want this function to copy from tvWorkArea
* tcTableForExpr [optional] := a valid VFP Where/For clause to be used when querying tvWorkArea for data to be copied to the worksheet
*
* RETURN Information
* returns numeric, the number of records inserted into the worksheet
*
* Provider Information
* the default provider being used in the SQLStringConnect function can be downloaded and installed from:
* http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en
**********************************
#DEFINE adOpenStatic 3
#DEFINE adOpenKeyset 1
#DEFINE adLockOptimistic 3
#DEFINE adUseClient 3
#DEFINE adUseServer 2
#DEFINE adCmdText 0x0001
LOCAL loConnection as ADODB.Connection, lcCreateTableCommand, llOpenedtvWorkArea, loExc as Exception, ;
lnReturn, lnResult, lnFieldCounter, lnSQL, loCursorAdapter as CursorAdapter, ;
lcFieldName, lcFieldType, lcSelectFields, lcUpdateNameListFields, lcUpdatableFieldList, ;
loRecordSet as ADODB.Recordset, lcConversionFunc, lcVFPFieldName, laTableFields[1], laErr[1]
m.lnSelect = SELECT(0)
m.lnReturn = 0
m.llOpenedtvWorkArea = .F.
IF !USED(m.tvWorkarea) AND TYPE("m.tvWorkArea") = "C" AND FILE(DEFAULTEXT(m.tvWorkarea,"DBF"))
SELECT 0
USE (DEFAULTEXT(m.tvWorkarea,"DBF")) SHARED AGAIN
m.tvWorkarea = ALIAS()
m.llOpenedtvWorkArea = .T.
ELSE
IF !USED(m.tvWorkarea)
m.tvWorkarea = ALIAS()
ENDIF
ENDIF
IF TYPE("m.tvWorkArea") = "N"
m.tvWorkArea = ALIAS(m.tvWorkArea)
ENDIF
m.tcSheet = ALLTRIM(EVL(m.tcSheet,"Sheet1$"))
IF AT("$",m.tcSheet) = 0
m.tcSheet = m.tcSheet + "$"
ENDIF
m.tcExcelFieldList = EVL(m.tcExcelFieldList,"")
m.tcTableFieldList = EVL(m.tcTableFieldList,"*")
m.tcTableForExpr = EVL(m.tcTableForExpr,".T.")
m.lnSQL = 0
m.lcTempAlias = SYS(2015)
TRY
CreateExcelTemplate(m.tcXLSFile)
IF !FILE(m.tcXLSFile)
m.lnReturn
ENDIF
m.loConnection = CreateObject ( "ADODB.Connection")
*!* This is the only provider/driver that appears to work without showing Select Data Source dialog
*!* or throwing a weird error about the excel Database being readonly.
m.loConnection.ConnectionString = [Provider=Microsoft.ACE.OLEDB.12.0;Data Source="] + m.tcXLSFile + [";Extended Properties="Excel 12.0 Xml;HDR=Yes;";]
m.loConnection.Open()
m.loConnection.Execute("DROP TABLE [Sheet1$]")
SELECT &tcTableFieldList FROM (m.tvWorkarea) WHERE &tcTableForExpr INTO CURSOR (m.lcTempAlias) NOFILTER
GO TOP IN (m.lcTempAlias)
m.lnReturn = RECCOUNT(m.lcTempAlias)
m.lcCreateTableCommand = ""
m.lcSelectFields = ""
m.lcUpdateNameListFields = ""
m.lcUpdatableFieldList = ""
m.lcConversionFunc = ""
FOR m.lnFieldCounter = 1 TO AFIELDS(m.laTableFields, m.lcTempAlias)
m.lcVFPFieldName = m.laTableFields(m.lnFieldCounter, 1)
m.lcFieldName = ALLTRIM(GETWORDNUM(m.tcExcelFieldList, m.lnFieldCounter, ","))
IF EMPTY(m.lcFieldName)
m.lcFieldName = m.laTableFields(m.lnFieldCounter, 1)
ENDIF
m.lcSelectFields = m.lcSelectFields + "[" + m.lcFieldName + "] " + " AS " + m.lcVFPFieldName
m.lcUpdateNameListFields = m.lcUpdateNameListFields + m.lcVFPFieldName + " [" + m.tcSheet + "].[" + m.lcFieldName + "]"
m.lcUpdatableFieldList = m.lcUpdatableFieldList + m.lcVFPFieldName
m.lcCreateTableCommand = m.lcCreateTableCommand + "[" + m.lcFieldName + "] "
m.lcFieldType = m.laTableFields(m.lnFieldCounter, 2)
m.lcCreateTableCommand = m.lcCreateTableCommand + ;
ICASE(m.lcFieldType = 'C', 'Char(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ')', ;
m.lcFieldType = 'Y', 'Currency', ;
m.lcFieldType = 'D', 'Date', ;
m.lcFieldType = 'T', 'DateTime', ;
m.lcFieldType = 'B', 'Double', ;
m.lcFieldType = 'F', 'Double', ;
m.lcFieldType = 'G', 'Binary', ;
m.lcFieldType = 'I', 'Integer', ;
m.lcFieldType = 'L', 'Logical', ;
m.lcFieldType = 'M', 'Text', ;
m.lcFieldType = 'N', 'Numeric(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ',' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 4)) + ')', ;
m.lcFieldType = 'Q', 'Binary', ;
m.lcFieldType = 'V', 'VarChar(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ')', ;
m.lcFieldType = 'W', 'Blob', ;
'Char(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ')')
IF INLIST(m.lcFieldType,"T","D")
m.lcConversionFunc = m.lcConversionFunc + IIF(!EMPTY(m.lcConversionFunc), ", ", "") + m.lcVFPFieldName + " EmptyFieldToNull"
ENDIF
IF m.lnFieldCounter != ALEN(m.laTableFields,1)
m.lcCreateTableCommand = m.lcCreateTableCommand + ','
m.lcSelectFields = m.lcSelectFields + ','
m.lcUpdateNameListFields = m.lcUpdateNameListFields + ','
m.lcUpdatableFieldList = m.lcUpdatableFieldList + ','
ENDIF
ENDFOR
IF !EMPTY(m.lcCreateTableCommand)
IF m.tcSheet != [Sheet1$]
m.tcSheet = STRTRAN(m.tcSheet,"$","")
ENDIF
m.lcCreateTableCommand = "CREATE TABLE [" + m.tcSheet + "](" + m.lcCreateTableCommand + ")"
m.loConnection.Errors.Clear()
m.loConnection.Execute(m.lcCreateTableCommand)
IF m.loConnection.Errors.Count>0
ERROR m.loConnection.Errors(0).Description
ENDIF
m.loRecordSet = CreateObject("ADODB.Recordset")
With m.loRecordSet
.ActiveConnection = m.loConnection
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
ENDWITH
m.loCursorAdapter = CREATEOBJECT("CursorAdapter")
m.loCursorAdapter.Alias = SYS(2015)
m.loCursorAdapter.DataSourceType = "ADO"
m.loCursorAdapter.DataSource = m.loRecordSet
m.loCursorAdapter.SelectCmd = "Select " + m.lcSelectFields + " From [" + m.tcSheet + "]"
IF m.loCursorAdapter.CursorFill(.F.,.T.)
m.loCursorAdapter.Tables = "[" + m.tcSheet + "]"
m.loCursorAdapter.BufferModeOverride = 3 && faster than 5 when dealing with larger record sets
m.loCursorAdapter.UpdateNameList = m.lcUpdateNameListFields
m.loCursorAdapter.UpdatableFieldList = m.lcUpdatableFieldList
IF !EMPTY(m.lcConversionFunc)
m.loCursorAdapter.ConversionFunc = m.lcConversionFunc
ENDIF
INSERT INTO (m.loCursorAdapter.Alias) SELECT * FROM (m.lcTempAlias)
m.lnReturn = TABLEUPDATE(.T.,.T.,m.loCursorAdapter.Alias)
ELSE
AERROR(m.laErr)
ERROR m.laErr(2)
ENDIF
ENDIF
m.loConnection.Close()
CATCH TO m.loExc
SET STEP ON
m.lnReturn = 0
FINALLY
m.loCursorAdapter = Null
m.loConnection = Null
RELEASE loCursorAdapter, loConnection
IF m.llOpenedtvWorkArea
USE IN SELECT(m.tvWorkarea)
ENDIF
USE IN SELECT(m.lcTempAlias)
SELECT (m.lnSelect)
ENDTRY
RETURN m.lnReturn
ENDFUNC
***********************************
FUNCTION CopyToExcelSimple(tcXLSFile, tcSheet, tvWorkArea, tcExcelFieldList, tcTableFieldList, tcTableForExpr)
***********************************
* PARAMETER Information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tcSheet := a string specifying the name of the worksheet to create within the excel workbook
* tvWorkarea [optional] := the Alias, Work Area, or File Name of the table you want to be copied to the worksheet (default is currently selected Alias)
* tcExcelFieldList [optional] := a comma delimited list of columns you want to create in the worksheet (default is '*' - columns will match table field list)
* tcTableFieldList [optional] := a comma delimited list of fields you want this function to copy from tvWorkArea
* tcTableForExpr [optional] := a valid VFP Where/For clause to be used when querying tvWorkArea for data to be copied to the worksheet
*
* RETURN Information
* returns numeric, the number of records inserted into the worksheet
*
**********************************
LOCAL llOpenedtvWorkArea, loExc as Exception, ;
lnReturn, lnResult, lnFieldCounter, lnSQL, ;
lcFieldName, lcFieldType, lcSelectFields, ;
laErr[1]
m.lnSelect = SELECT(0)
m.lnReturn = 0
m.llOpenedtvWorkArea = .F.
IF !USED(m.tvWorkarea) AND TYPE("m.tvWorkArea") = "C" AND FILE(DEFAULTEXT(m.tvWorkarea,"DBF"))
SELECT 0
USE (DEFAULTEXT(m.tvWorkarea,"DBF")) SHARED AGAIN
m.tvWorkarea = ALIAS()
m.llOpenedtvWorkArea = .T.
ELSE
IF !USED(m.tvWorkarea)
m.tvWorkarea = ALIAS()
ENDIF
ENDIF
IF TYPE("m.tvWorkArea") = "N"
m.tvWorkArea = ALIAS(m.tvWorkArea)
ENDIF
m.tcSheet = ALLTRIM(EVL(m.tcSheet,"Sheet1$"))
IF AT("$",m.tcSheet) = 0
m.tcSheet = m.tcSheet + "$"
ENDIF
m.tcExcelFieldList = EVL(m.tcExcelFieldList,"")
m.tcTableFieldList = EVL(m.tcTableFieldList,"*")
m.tcTableForExpr = EVL(m.tcTableForExpr,".T.")
m.lnSQL = 0
m.lcTempAlias = SYS(2015)
TRY
SELECT &tcTableFieldList FROM (m.tvWorkarea) WHERE &tcTableForExpr INTO CURSOR (m.lcTempAlias) NOFILTER
COPY TO (m.tcXLSFile) TYPE XL5
CATCH TO m.loExc
SET STEP ON
m.lnReturn = 0
FINALLY
IF m.llOpenedtvWorkArea
USE IN SELECT(m.tvWorkarea)
ENDIF
USE IN SELECT(m.lcTempAlias)
SELECT (m.lnSelect)
ENDTRY
RETURN m.lnReturn
ENDFUNC
*******************
FUNCTION EmptyFieldToNull(tdFieldValue)
*******************
RETURN EVL(m.tdFieldValue,NULL)
ENDFUNC
*******************
FUNCTION CreateExcelTemplate(tcExcelFile)
*******************
LOCAL lcExcelFileExtension, lcFileBinary
m.llReturn = .F.
IF FILE(m.tcExcelFile)
m.llReturn = .T.
ELSE
m.lcExcelFileExtension = UPPER(JUSTEXT(m.tcExcelFile))
DO case
CASE m.lcExcelFileExtension = "XLSX"
m.lcFileBinary = 0h504B030414000600080000002100CC7EE6A14E010000080400001300DF015B436F6E74656E745F54797065735D2E786D6C20A2DB0128A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000AC93CB4EC3301045F748FC83E52D8ADDB2400835ED82C712BA281F60EC4963D52F79DCD2FE3D938422814A455536B1226BEE9D39733D996DBD631BC86863A8F9588C3883A0A3B16159F3D7C55375CB1916158C723140CD77807C36BDBC982C7609905175C09AB7A5A43B2951B7E0158A9820D04D13B357857EF35226A5576A09F27A34BA913A8602A154A5D3E0D3C90B3590AD013657B93C2B4F3E72EB64213518BE63417A9CDD0F859D77CD554ACE6A55A873B909E6876B159BC66A3051AF3D79895EECAA5391BF1A62D939C0B3AD306550065B80E29D1844F7CE0FD0A8B52BEC714B0406E8191C9E36DA274C
m.lcFileBinary = m.lcFileBinary + 0h4195FDF8D8DA84471C8EB33BCEE43DE6D55B8CABFFA6D2D1115ED9B0EFFB5008687BF31C134ADAF5D90D4087DC80A91249422E16BE981DF2A60076B3F76B44D91FE7A7F07B34BEF4FFC440C70CA743D867A5AB3E30B9ECDFF1F4030000FFFF0300504B030414000600080000002100B5553023F50000004C0200000B00CE015F72656C732F2E72656C7320A2CA0128A0000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C92CF4EC3300CC6EF48BC43E4FBEA6E4808A1A5BB4C48BB21541EC024EE1FB58DA32440F7F68403824A63DBD1F6E7CF3F5BDEEEE669541F1C622F4EC3BA2841B133627BD76A78AD9F560FA06222676914C71A8E1C6157DDDE6C5F78A4949B62D7FBA8B28B8B1ABA94FC2362341D4F140BF1EC72A5913051CA6168D19319A865DC94E53D86BF1E502D3CD5C16A08077B07AA3EFA3CF9B2B7344D6F782FE67D62974E8C409E
m.lcFileBinary = m.lcFileBinary + 0h133BCB76E543660BA9CFDBA89A42CB498315F39CD311C9FB2263039E26DA5C4FF4FFB63871224B89D048E0F33CDF8A7340EBEB812E9F68A9F8BDCE3CE2A784E14D64F861C1C50F545F000000FFFF0300504B0304140006000800000021008D87DA70E00000002D0200001A000801786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C7320A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC91CB6AC3301045F785FE83987D3D760AA594C8D99442B6C5FD00218F1FC496846692D67F5FE182DD404836D908AE06DD73246D773FE3A04E14B9F74E4391E5A0C8595FF7AED5F0557D3CBD826231AE368377A46122865DF9F8B0FDA4C1483AC45D1F58A516C71A3A91F086C8B6
m.lcFileBinary = m.lcFileBinary + 0hA3D170E603B934697C1C8DA4185B0CC61E4C4BB8C9F3178CFF3BA03CEB54FB5A43DCD7CFA0AA2924F2ED6EDF34BDA5776F8F2339B98040966948175095892D8986BF9C2547C0CBF8CD3DF1929E8556FA1C715E8B6B0EC53D1DBE7D3C704724ABC7B2C5384F16193CFBE4F2170000FFFF0300504B030414000600080000002100A460FAFF52010000270200000F000000786C2F776F726B626F6F6B2E786D6C8C915D6FC2201486EF97EC3F10EE272DA9CE185B93655BE6CD6232A7D7AC9C5A228506A8D57FBF534CE776B72BCE073CE7BC2FCBD5B9D1E404CE2B6B729A4E124AC094562A73C8E9E7F6F5614E890FC248A1AD819C5EC0D355717FB7ECAD3B7E
m.lcFileBinary = m.lcFileBinary + 0h597B2408303EA77508ED82315FD6D0083FB12D18EC54D6352260EA0ECCB70E84F435406834E34932638D50865E090BF71F86AD2A55C2B32DBB064CB8421C6811707D5FABD6D36259290DBBAB2222DAF65D34B8F75953A2850F2F52059039CD30B53DFC29B8AE7DEA941EBAD3644A59F12372E3085203B88D5327515ED0294A2454A2D3618B82C77958E719E7B3E1ED60CE4E41EF6F982125E7BD32D2F639E5199A7D19B31427923EB6F64A861A51D9FC567B0375A8434EE7499A0C74F60B1F2DC531F12426EAFD186CC625636D8D9230760B85815BCB3412C667A5D0250A1C8E78914F1F7954CFC63F2EBE010000FFFF0300504B0304140006000800000021
m.lcFileBinary = m.lcFileBinary + 0h00A083C4AEA3010000640300000D000000786C2F7374796C65732E786D6CA453C16ADC3010BD17F20F42F746BB0B0D6DB19D436121909440B6D0AB6CC95EC16864A4F1B2EED767643BDEDD530EBD584F4F336F9E66E4E2F1EC419C6C4C2E6029B7F71B292C36C138EC4AF9E7B0FFFA5D8A441A8D8680B694A34DF2B1BAFB52241AC1BE1DAD25C112984A7924EA7F2A959AA3F53ADD87DE229FB4217A4DBC8D9D4A7DB4DAA49CE441ED369B07E5B54359156D404AA2090312BB5888AA48FFC44903335BA9AAA20910A2209667231383DADB39E29706574797C35AED1D8C33BDCBC4E46889F30E43CCA4CA259725719203580DECB20126AAA2D74436E29E3762
m.lcFileBinary = m.lcFileBinary + 0hC187B1E7F2C8DD9865A6B84FA2BBA8C7EDEEDB55829A0A56451DA2E1EE5F5F7DA6AA026C4B6C34BAEE98570A3D7FEB40143C03E37417500343F591B100BE4E6301DEF284FEB637DAE756E0E0F79E9E4C2979D6B9091F902FB2C0596FDE64FD6BB559FBBF65C5B9BDD567C52BDB37A6D7F222CFBB94BFF39302B94A887A70400E6F05A7EBB3A6395F5AB0C913205DF3CBCDCD59AB70278C6DF50074580F4B79C12FD6B8C1FF58A35EDD29D02451CA0B7ECE93DA3E4C534EEBEF51BD030000FFFF0300504B030414000600080000002100E9A625B882060000531B000013000000786C2F7468656D652F7468656D65312E786D6CEC594F6FDB3614BF0FD87720
m.lcFileBinary = m.lcFileBinary + 0h746F6D27B61B07758AD8B19BAD4D1BC46E871E6999965853A240D2497D1BDAE38001C3BA619701BBED306C2BD002BB749F265B87AD03FA15F6484AB218CB4BD2061BD6D58744227F7CFFDFE32375F5DA8388A1432224E571DBAB5DAE7A88C43E1FD338687B7786FD4B1B1E920AC763CC784CDADE9C48EFDAD6FBEF5DC59B2A241141B03E969BB8ED854A259B958AF46118CBCB3C2131CC4DB888B082571154C6021F01DD8855D6AAD56625C234F6508C23207B7B32A13E41434DD2DBCA88F718BCC64AEA019F8981264D9C15063B9ED63442CE659709748859DB033E637E34240F948718960A26DA5ED5FCBCCAD6D50ADE4C1731B5626D615DDFFCD275E982
m.lcFileBinary = m.lcFileBinary + 0hF174CDF014C128675AEBD75B577672FA06C0D432AED7EB757BB59C9E0160DF074DAD2C459AF5FE46AD93D12C80ECE332ED6EB551ADBBF802FDF525995B9D4EA7D14A65B1440DC83ED697F01BD5667D7BCDC11B90C53796F0F5CE76B7DB74F00664F1CD257CFF4AAB5977F10614321A4F97D0DAA1FD7E4A3D874C38DB2D856F007CA39AC2172888863CBA348B098FD5AA588BF07D2EFA00D04086158D919A2764827D88E22E8E468262CD006F125C98B143BE5C1AD2BC90F4054D54DBFB30C190110B7AAF9E7FFFEAF953F4EAF993E387CF8E1FFE74FCE8D1F1C31F2D2D67E12E8E83E2C297DF7EF6E7D71FA33F9E7EF3F2F117E57859C4FFFAC327BFFCFC79
m.lcFileBinary = m.lcFileBinary + 0h3910326821D18B2F9FFCF6ECC98BAF3EFDFDBBC725F06D814745F8904644A25BE4081DF0087433867125272371BE15C3105367050E817609E99E0A1DE0AD396665B80E718D775740F128035E9FDD77641D8462A66809E71B61E400F738671D2E4A0D7043F32A5878388B8372E66256C41D607C58C6BB8B63C7B5BD590255330B4AC7F6DD903862EE331C2B1C909828A4E7F8949012EDEE51EAD8758FFA824B3E51E81E451D4C4B4D32A4232790168B7669047E9997E90CAE766CB3771775382BD37A871CBA484808CC4A841F12E698F13A9E291C95911CE288150D7E13ABB04CC8C15CF8455C4F2AF074401847BD3191B26CCD6D01FA169C7E0343BD2A75FB
m.lcFileBinary = m.lcFileBinary + 0h1E9B472E52283A2DA37913735E44EEF06937C45152861DD0382C623F905308518CF6B92A83EF713743F43BF801C72BDD7D9712C7DDA717823B3470445A04889E9909ED4B28D44EFD8D68FC77C59851A8C63606DE15E3B6B70D5B53594AEC9E28C1AB70FFC1C2BB8367F13E81585FDE78DED5DD7775D77BEBEBEEAA5C3E6BB55D1458A8BDBA79B07DB1E992A3954DF28432365073466E4AD3274BD82CC67D18D4EBCC0191E487A62484C7B4B83BB84060B30609AE3EA22A1C8438811EBBE66922814C490712255CC2D9CE0C97D2D678E8D3953D1936F499C1D60389D51E1FDBE1753D9C1D0D723266CB09CCF93363B4AE099C95D9FA959428A8FD3ACC6A5AA8
m.lcFileBinary = m.lcFileBinary + 0h3373AB19D14CA973B8E52A830F975583C1DC9AD08520E85DC0CA4D38A26BD67036C18C8CB5DDED069CB9C578E1225D24433C26A98FB4DECB3EAA192765B1622E0320764A7CA4CF79A758ADC0ADA5C9BE01B7B338A9C8AEBE825DE6BD37F15216C10B2FE9BC3D918E2C2E26278BD151DB6B35D61A1EF271D2F62670AC85C72801AF4BDDF86116C0DD90AF840DFB5393D964F9C29BAD4C3137096A705361EDBEA4B053071221D50E96A10D0D339586008B35272BFF5A03CC7A510AD8487F0D29D6372018FE3529C08EAE6BC964427C5574766144DBCEBEA6A594CF141183707C84466C260E30B85F872AE833A6126E274C45D02F7095A6AD6DA6DCE29C265DF1
m.lcFileBinary = m.lcFileBinary + 0h02CBE0EC38664988D372AB5334CB640B37799CCB60DE0AE2816EA5B21BE5CEAF8A49F90B52A518C6FF3355F47E02D705EB63ED011F6E7205463A5FDB1E172AE450859290FA7D018D83A91D102D701D0BD31054709F6CFE0B72A8FFDB9CB3344C5AC3A94F1DD000090AFB910A0521FB50964CF49D42AC96EE5D96244B0999882A882B132BF6881C1236D435B0A9F7760F8510EAA69AA465C0E04EC69FFB9E66D028D04D4E31DF9C1A92EFBD3607FEE9CEC7263328E5D661D3D064F6CF452CD955ED7AB33CDB7B8B8AE889459B55CFB2029815B682569AF6AF29C239B75A5BB196345E6B64C28117973586C1BC214AE0D207E93FB0FF51E133FB71426FA8437E
m.lcFileBinary = m.lcFileBinary + 0h00B515C1B7064D0CC206A2FA926D3C902E907670048D931DB4C1A44959D3A6AD93B65AB6595F70A79BF33D616C2DD959FC7D4E63E7CD99CBCEC9C58B34766A61C7D6766CA5A9C1B32753148626D941C638C67CD52A7E78E2A3FBE0E81DB8E29F31254D30C1672581A1F51C983C80E4B71CCDD2ADBF000000FFFF0300504B030414000600080000002100075F38D31E010000C701000018000000786C2F776F726B7368656574732F7368656574312E786D6C8C514D6BC3300CBD0FF61F8CEE8BD38D6EA324298352B6C360ECEBEE2472626A5BC156D7EDDFCF496819F4B29B3EDE7BD2938AF5B7B3E20B4334E44B58643908F40DB5C677257CBC6FAFEE4144
m.lcFileBinary = m.lcFileBinary + 0h56BE55963C96F08311D6D5E54571A0B08B3D228BA4E063093DF3B09232363D3A15331AD0A78EA6E014A73474320E01553B919C95D7797E2B9D321E668555F88F06696D1ADC50B377E87916096815A7FD636F860855D19AD41B0D8980BA848705C8AA98C67E1A3CC43FB16055BFA1C586B14DEE418CAE6AA2DD087C4AA57CA4CA33EE7672F512448B5AED2DBFD2E1114DD77312599EA66D14AB441F5487CF2A74C6476151274C9EDD8108337E8A9986A9BA04511333B963D6A783613A4C9EDD80D0447C4CC6B54E2FA87E010000FFFF0300504B030414000600080000002100A6A453EB3E0100005102000011000801646F6350726F70732F636F72652E786D
m.lcFileBinary = m.lcFileBinary + 0h6C20A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000007C92516BC3201485DF07FB0FC1F7449342DB4992C236FAB4C260191B7B13BD6D65D188BAA5FDF733499BA65006BE78CFB9DF3D5ECC57075547BF609D6C7481D284A008346F84D4BB02BD57EB788922E79916AC6E3414E8080EADCAFBBB9C1BCA1B0BAFB63160BD0417059276949B02EDBD371463C7F7A0984B82430771DB58C57CB8DA1D368C7FB31DE08C903956E099609EE10E189B91884E48C147A4F9B1750F101C430D0AB477384D527CF17AB0CADD6CE8958953497F34E14DA7B853B6E08338BA0F4E8EC6B66D9376D6C708F953FCB97979EB9F1A4BDDED8A032A73C129B7C07C63CB1C4F2F617135737E1376BC95201E8F41
m.lcFileBinary = m.lcFileBinary + 0hBF5113BC8F3B40404421001DE29E958FD9D373B54665B7C3983CC4E9BC2284F6E7AB1B79D5DF051A0AEA34F87FE2B223924595113A5BD02C9B10CF8021F7F52728FF000000FFFF0300504B03041400060008000000210027388BC4880100001103000010000801646F6350726F70732F6170702E786D6C20A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C92C16EDB300C86EF03F60E86EE8D9C601886405651A41D7AD8B00049BBB326D3B150591244D648F6F4A36DA471BA9DA613C99FF8F58994BA3D76BEE821A38BA112CB45290A0836D62E1C2AF1B4FF7AF345144826D4C6C7009538018A5BFDF183DAE6982093032CD82260255AA2B496126D0B9DC105CB819526E6CE10A7F9
m.lcFileBinary = m.lcFileBinary + 0h2063D3380BF7D1BE761048AECAF2B3842341A8A1BE496F8662725CF7F4BFA675B4031F3EEF4F8981B5BA4BC93B6B885FA9BF3B9B23C6868A87A305AFE45C544CB703FB9A1D9D74A9E43C553B6B3C6CD85837C623287929A84730C3D0B6C665D4AAA7750F96622ED0FDE6B1AD44F1CB200C3895E84D762610630D6D5332C63E2165FD33E6176C010895E486A93886F3DE79EC3EE9E5D8C0C175E3603081B0708DB877E4017F345B93E91FC4CB39F1C830F14E38BB816FBA73CE373E996F7AE7BD895D32E1C4C25BF4CD85177C4AFB786F08CEE3BC2EAA5D6B32D4BC81B37E29A8479E64F683C9A635E100F5B9E76F6158FEF3F4C3F572B528F98C3B3FD794BC
m.lcFileBinary = m.lcFileBinary + 0hFC65FD070000FFFF0300504B01022D0014000600080000002100CC7EE6A14E010000080400001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D0014000600080000002100B5553023F50000004C0200000B000000000000000000000000005E0300005F72656C732F2E72656C73504B01022D00140006000800000021008D87DA70E00000002D0200001A000000000000000000000000004A060000786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C73504B01022D0014000600080000002100A460FAFF52010000270200000F000000000000000000000000006A080000786C2F776F
m.lcFileBinary = m.lcFileBinary + 0h726B626F6F6B2E786D6C504B01022D0014000600080000002100A083C4AEA3010000640300000D00000000000000000000000000E9090000786C2F7374796C65732E786D6C504B01022D0014000600080000002100E9A625B882060000531B00001300000000000000000000000000B70B0000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100075F38D31E010000C701000018000000000000000000000000006A120000786C2F776F726B7368656574732F7368656574312E786D6C504B01022D0014000600080000002100A6A453EB3E010000510200001100000000000000000000000000BE130000646F635072
m.lcFileBinary = m.lcFileBinary + 0h6F70732F636F72652E786D6C504B01022D001400060008000000210027388BC48801000011030000100000000000000000000000000033160000646F6350726F70732F6170702E786D6C504B050600000000090009003E020000F11800000000
CASE m.lcExcelFileExtension = "XLSB"
m.lcFileBinary = 0h504B030414000600080000002100558086C16D010000020400001300DD015B436F6E74656E745F54797065735D2E786D6C20A2D90128A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000A453CD4BC33014BF0BFE0F255769B2791091B53BE8042FBAC3C47396BEAE616912F2B2D9FEF7BEB6ACA0EC83E1A5A16D7E9F2F99CD9BDA247B08A89DCDD8944F580256B942DB4DC63E57AFE9234B304A5B48E32C64AC0564F3FCF666B66A3D6042688B19AB62F44F42A0AAA096C89D074B7F4A176A19E9356C84976A2B3720EE279307A19C8D60631A3B0E96CF5EA0943B139345439F07276B6D59F23CECEBA43226BD375AC94846C5DE16BCC6141A058663051039016468792D55700B2BD706688B241691CF3E2860D005244B19E2BBAC894D344644720BC373CAC9EF05C1DFA95257965A41E1D4AEA62CBC27BBEB
m.lcFileBinary = m.lcFileBinary + 0h584E0B7EBBB0EDDDA2E89769E7FA82EA1873047702471A0B60F002D79F047E980927645F2B56DAE321C21185F3159D894E252D83F3286886FF2E1ABA435240917AA28410358C9E4FCC796C0EC5704ADE08DF5C553EE17AD0179E192FC6D6005E33D301718A72AC4DB900D7F776186F873E5296E86F70FE030000FFFF0300504B0304140006000800000021004382E3C5F70000004C0200000B00CE015F72656C732F2E72656C7320A2CA0128A000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C92CF4EC3300CC6EF48BC43E4FBEA6E4808A1B5BB20A4DD102A0FE0256E1BB58DA32440F7F66427A834B61DFDEFF3CF9FBCDDCDD3A8BE38442BAE8275518262A7C558D755F0D1BCAE9E40C544CED0288E2B3872845D7D7FB77DE791521E8ABDF5516515172BE853F2CF8851F73C512CC4B3CB9556C2442987A1434F7AA08E7153968F18FE6A40BD
m.lcFileBinary = m.lcFileBinary + 0hD0547B5341D89B0750CDD1E7CDD7B5A56DADE617D19F13BB746605F29CD819362B1F325B48365FA31A0A1DA70A8CE8B79C8E48DE17191BF03CD1E676A2FFAFC58913194A845A025FE639755C025ADF0E74DDA265C7AF3BF388DF128683C8501CAC3B99838B1FA87F000000FFFF0300504B03041400060008000000210006332055E50000002D0200001A000801786C2F5F72656C732F776F726B626F6F6B2E62696E2E72656C7320A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC91C16AC3301044EF85FE83D87BBD760AA594C8B98442AEC1FD00555EDB22B624B4DB36FEFB0A97360DA4F4928B60B468DEEC68BD394EA37AA7C42E780D555182226F43EB7CAFE1A579BE7B04C562
m.lcFileBinary = m.lcFileBinary + 0h7C6BC6E049C34C0C9BFAF666BDA7D1487EC4838BACB28B670D83487C42643BD064B808917C9E74214D46B24C3D46630FA6275C95E503A6DF1E509F79AA5DAB21EDDA7B50CD1C33F97FEFD075CED236D8B789BC5C4020CB3CE6055463524FA2E14B17AFCE035EC6AFAE89975C0B9DE88BC4E5AC8ADCD35F19AA6B66F808E9C003919C72FC5C312E93EABB103CFBE4FA130000FFFF0300504B030414000600080000002100A76734B792000000C00000000F000000786C2F776F726B626F6F6B2E62696E6A66646860346040034C407E05430E0323903681922C60B62983018329C34C461E0DA0B0D35390020686764686798CB21F80AC4C20BE6AC9C0E025CF
m.lcFileBinary = m.lcFileBinary + 0hC0100132050A2A3A1819FA1919E630AA800440BA40C615317832A4301832B001D9C10C190CA9405802E44F606498CB2825FB9A11AC320528FB67E5C74BBE4901F6209D590CB31819196603710B2303000000FFFF0300504B030414000600080000002100F98F44D4E0000000CA0100000D000000786C2F7374796C65732E62696EA4904F4B424114C57FBEB9E8F6B9EB1BB410FF1104EE8C5CA608F60514438522100DFA16ADEAC3E52E15FCB3D255923CCFBC47E2D26860CE9C7BCF993B73EF7BC097590AC85D4E846F9E0690F127444146784B9B470674180AA7C6A7993CE46BDEE3AA1E89DC8D402B8EFE00F95A56EEFF569918B3A491C295CAA58E1F38
m.lcFileBinary = m.lcFileBinary + 0h8FCD8D4D72BD189EB61086B03516BFDAB1AC88D796C62AD14A175ED36B515A6783670DEB291EDCDAF876E6D59DE3C7353DCB6ADF4BED68B00FB418F11AB3BAA2AE863CD6DD4AEC6A2A7A51B5D189EB4EB91E7DE5CA5CB3777C041C000000FFFF0300504B030414000600080000002100E9A625B882060000531B000013000000786C2F7468656D652F7468656D65312E786D6CEC594F6FDB3614BF0FD87720746F6D27B61B07758AD8B19BAD4D1BC46E871E6999965853A240D2497D1BDAE38001C3BA619701BBED306C2BD002BB749F265B87AD03FA15F6484AB218CB4BD2061BD6D58744227F7CFFDFE32375F5DA8388A1432224E571DBAB5DAE7A88C43E
m.lcFileBinary = m.lcFileBinary + 0h1FD338687B7786FD4B1B1E920AC763CC784CDADE9C48EFDAD6FBEF5DC59B2A241141B03E969BB8ED854A259B958AF46118CBCB3C2131CC4DB888B082571154C6021F01DD8855D6AAD56625C234F6508C23207B7B32A13E41434DD2DBCA88F718BCC64AEA019F8981264D9C15063B9ED63442CE659709748859DB033E637E34240F948718960A26DA5ED5FCBCCAD6D50ADE4C1731B5626D615DDFFCD275E982F174CDF014C128675AEBD75B577672FA06C0D432AED7EB757BB59C9E0160DF074DAD2C459AF5FE46AD93D12C80ECE332ED6EB551ADBBF802FDF525995B9D4EA7D14A65B1440DC83ED697F01BD5667D7BCDC11B90C53796F0F5CE76B7DB74F006
m.lcFileBinary = m.lcFileBinary + 0h64F1CD257CFF4AAB5977F10614321A4F97D0DAA1FD7E4A3D874C38DB2D856F007CA39AC2172888863CBA348B098FD5AA588BF07D2EFA00D04086158D919A2764827D88E22E8E468262CD006F125C98B143BE5C1AD2BC90F4054D54DBFB30C190110B7AAF9E7FFFEAF953F4EAF993E387CF8E1FFE74FCE8D1F1C31F2D2D67E12E8E83E2C297DF7EF6E7D71FA33F9E7EF3F2F117E57859C4FFFAC327BFFCFC793910326821D18B2F9FFCF6ECC98BAF3EFDFDBBC725F06D814745F8904644A25BE4081DF0087433867125272371BE15C3105367050E817609E99E0A1DE0AD396665B80E718D775740F128035E9FDD77641D8462A66809E71B61E400F738671D2E
m.lcFileBinary = m.lcFileBinary + 0h4A0D7043F32A5878388B8372E66256C41D607C58C6BB8B63C7B5BD590255330B4AC7F6DD903862EE331C2B1C909828A4E7F8949012EDEE51EAD8758FFA824B3E51E81E451D4C4B4D32A4232790168B7669047E9997E90CAE766CB3771775382BD37A871CBA484808CC4A841F12E698F13A9E291C95911CE288150D7E13ABB04CC8C15CF8455C4F2AF074401847BD3191B26CCD6D01FA169C7E0343BD2A75FB1E9B472E52283A2DA37913735E44EEF06937C45152861DD0382C623F905308518CF6B92A83EF713743F43BF801C72BDD7D9712C7DDA717823B3470445A04889E9909ED4B28D44EFD8D68FC77C59851A8C63606DE15E3B6B70D5B53594AEC9E28
m.lcFileBinary = m.lcFileBinary + 0hC1AB70FFC1C2BB8367F13E81585FDE78DED5DD7775D77BEBEBEEAA5C3E6BB55D1458A8BDBA79B07DB1E992A3954DF28432365073466E4AD3274BD82CC67D18D4EBCC0191E487A62484C7B4B83BB84060B30609AE3EA22A1C8438811EBBE66922814C490712255CC2D9CE0C97D2D678E8D3953D1936F499C1D60389D51E1FDBE1753D9C1D0D723266CB09CCF93363B4AE099C95D9FA959428A8FD3ACC6A5AA83373AB19D14CA973B8E52A830F975583C1DC9AD08520E85DC0CA4D38A26BD67036C18C8CB5DDED069CB9C578E1225D24433C26A98FB4DECB3EAA192765B1622E0320764A7CA4CF79A758ADC0ADA5C9BE01B7B338A9C8AEBE825DE6BD37F15216
m.lcFileBinary = m.lcFileBinary + 0hC10B2FE9BC3D918E2C2E26278BD151DB6B35D61A1EF271D2F62670AC85C72801AF4BDDF86116C0DD90AF840DFB5393D964F9C29BAD4C3137096A705361EDBEA4B053071221D50E96A10D0D339586008B35272BFF5A03CC7A510AD8487F0D29D6372018FE3529C08EAE6BC964427C5574766144DBCEBEA6A594CF141183707C84466C260E30B85F872AE833A6126E274C45D02F7095A6AD6DA6DCE29C265DF102CBE0EC38664988D372AB5334CB640B37799CCB60DE0AE2816EA5B21BE5CEAF8A49F90B52A518C6FF3355F47E02D705EB63ED011F6E7205463A5FDB1E172AE450859290FA7D018D83A91D102D701D0BD31054709F6CFE0B72A8FFDB9CB3344C
m.lcFileBinary = m.lcFileBinary + 0h5AC3A94F1DD000090AFB910A0521FB50964CF49D42AC96EE5D96244B0999882A882B132BF6881C1236D435B0A9F7760F8510EAA69AA465C0E04EC69FFB9E66D028D04D4E31DF9C1A92EFBD3607FEE9CEC7263328E5D661D3D064F6CF452CD955ED7AB33CDB7B8B8AE889459B55CFB2029815B682569AF6AF29C239B75A5BB196345E6B64C28117973586C1BC214AE0D207E93FB0FF51E133FB71426FA8437E00B515C1B7064D0CC206A2FA926D3C902E907670048D931DB4C1A44959D3A6AD93B65AB6595F70A79BF33D616C2DD959FC7D4E63E7CD99CBCEC9C58B34766A61C7D6766CA5A9C1B32753148626D941C638C67CD52A7E78E2A3FBE0E81DB8E29F
m.lcFileBinary = m.lcFileBinary + 0h31254D30C1672581A1F51C983C80E4B71CCDD2ADBF000000FFFF0300504B030414000600080000002100A1512698C10000001C01000023000000786C2F776F726B7368656574732F5F72656C732F7368656574312E62696E2E72656C736CCFC16AC3300C06E0FBA0EF60745F9CF430C68853D861906BE91E40B395C434968D654AF2F6F56DEDD8F197F83FA1FEB48555DD288B8F6CA06B5A50C4363ACFB381EFCBD7EB3B2829C80ED7C864602781D37078E9CFB462A925597C12551516034B29E9436BB10B05942626E2BA99620E586ACCB34E68AF38933EB6ED9BCE8F060C4FA61A9D813CBA0ED4654FF5F21F3B789BA3C4A93436061DA7C9DBFF54BDAD9F
m.lcFileBinary = m.lcFileBinary + 0h9E31EF233BDAAA8579A662E0E777D83535801E7AFDF4D370070000FFFF0300504B030414000600080000002100A273D38D810000001601000018000000786C2F776F726B7368656574732F7368656574312E62696E6A646498CC287E928589C181010CFE430188338551002C8644B432327432CADD61461202EB4C411298C1A882220F946244928631BB1819DA18199E32F3806CE460D001AB99C8C8308991613A8B134415480C9B5E9819301A5D0D887F97994980E10EB3411A183CB387D1103D2FEC61B431185CB687D14D8C0C00000000FFFF0300504B0304140006000800000021001E06781015000000200000001E000000786C2F776F726B73686565
m.lcFileBinary = m.lcFileBinary + 0h74732F62696E617279496E646578312E62696ED29260000205108106A632310011000000FFFF0300504B0304140006000800000021004B7C9F083E0100005102000011000801646F6350726F70732F636F72652E786D6C20A2040128A0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007C925F4BC33014C5DF05BF43C97B9B74835943DB81CA9E1C085614DF4272D7159B3F24D16EDFDEB4DD6A0743C84BEE39F7774F2EC9D707D9463F605DA35581D284A00814D7A2517581DEAA4D9CA1C879A6046BB582021DC1A175797B937343B9B6F062B501EB1B7051202947B929D0DE7B4331767C0F92B92438541077DA4AE6C3D5D6D830FEC56AC00B42565882678279867B606C26223A21059F90E6DBB6
m.lcFileBinary = m.lcFileBinary + 0h0340700C2D4850DEE13449F19FD78395EE6AC3A0CC9CB2F14713DE748A3B670B3E8A93FBE09AC9D8755DD22D8718217F8A3FB6CFAFC353E346F5BBE280CA5C70CA2D30AF6D99E3F9252CAE65CE6FC38E770D888763D0AFD4041FE28E1010510840C7B867E57DF9F8546D50D9EF3026F771BAAA08A1C3F9EC475EF4F781C6823C0DFE9F98F54472572D085D66946433E21930E6BEFC04E52F000000FFFF0300504B0304140006000800000021006F7E771280010000FE02000010000801646F6350726F70732F6170702E786D6C20A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C92416BE3301085EF85FD0F46F7464E589625C82AA569E9614B0349B367551EC7228A64345393F4D7
m.lcFileBinary = m.lcFileBinary + 0h776C93C6D9EDA93A8DE63D9E3E8DA46E0E7B9FB590D0C55088E9241719041B4B17B68578593F5CFF16199209A5F13140218E80E246FFB852CB141B48E400338E0858889AA8994B89B686BDC109CB81952AA6BD21DEA6AD8C55E52C2CA27DDB432039CBF35F120E04A184F2BAF90C1443E2BCA5EF8696D1767CB8591F1B06D6EAB669BCB386F896FAC9D914315694DD1F2C7825C7A262BA15D8B7E4E8A87325C75BB5B2C6C31D07EBCA780425CF0DF508A61BDAD2B8845AB5346FC1524C19BA771EDB4C64AF06A1C329446B92338118ABB30D9BBEF60D52D27F63DA610D40A8241B86665F8EBDE3DAFDD4D3DEC0C5A5B10B184058B8445C3BF280CFD5D224FA
m.lcFileBinary = m.lcFileBinary + 0h82783A26EE1906DE0167D5F10D678EF9FA2BF349FF64FF7161872FCD3A2E0CC16976974DB5AA4D8292C77DD2CF0DF5C8634BBE0BB9AB4DD84279F2FC2F742FBD19BEB39ECE2639AFFE814F3D25CF1F577F000000FFFF0300504B01022D0014000600080000002100558086C16D010000020400001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D00140006000800000021004382E3C5F70000004C0200000B000000000000000000000000007B0300005F72656C732F2E72656C73504B01022D001400060008000000210006332055E50000002D0200001A00000000000000000000000000690600
m.lcFileBinary = m.lcFileBinary + 0h00786C2F5F72656C732F776F726B626F6F6B2E62696E2E72656C73504B01022D0014000600080000002100A76734B792000000C00000000F000000000000000000000000008E080000786C2F776F726B626F6F6B2E62696E504B01022D0014000600080000002100F98F44D4E0000000CA0100000D000000000000000000000000004D090000786C2F7374796C65732E62696E504B01022D0014000600080000002100E9A625B882060000531B00001300000000000000000000000000580A0000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100A1512698C10000001C01000023000000000000000000000000000B
m.lcFileBinary = m.lcFileBinary + 0h110000786C2F776F726B7368656574732F5F72656C732F7368656574312E62696E2E72656C73504B01022D0014000600080000002100A273D38D810000001601000018000000000000000000000000000D120000786C2F776F726B7368656574732F7368656574312E62696E504B01022D00140006000800000021001E06781015000000200000001E00000000000000000000000000C4120000786C2F776F726B7368656574732F62696E617279496E646578312E62696E504B01022D00140006000800000021004B7C9F083E01000051020000110000000000000000000000000015130000646F6350726F70732F636F72652E786D6C504B01022D001400
m.lcFileBinary = m.lcFileBinary + 0h06000800000021006F7E771280010000FE02000010000000000000000000000000008A150000646F6350726F70732F6170702E786D6C504B0506000000000B000B00DB020000401800000000
CASE m.lcExcelFileExtension = "XLSM"
m.lcFileBinary = 0h504B03041400060008000000210038088E4F60010000F20300001300DB015B436F6E74656E745F54797065735D2E786D6C20A2D70128A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000A4934D6EC2301085F7957A87C8DB2A31745155158105A5CB96053D80B127C4C27FF2181A6EDF495290401481D838B2A279DFBC37E3D1A4B126DB4244ED5DC986C58065E0A457DAAD4AF6BDF8C85F59864938258C7750B21D209B8C1F1F468B5D00CCA8DA61C9EA94C21BE7286BB0020B1FC0D19FCA472B125DE38A0721D76205FC793078E1D2BB042EE5A9D560E3D1173510B5826C2E62FA149638BC313C911AF4E7B0203D964DFBC2965D321182D15224EA9C6F9D3AA1E6BEAAB404E5E5C612ABE8C49E5A15FE2F10D3CE00DE8DC2104128AC019235452FBA27BF4325362665B38612E8438F60F0366B7F611654D9D9C7
m.lcFileBinary = m.lcFileBinary + 0h5A07BC40B89CDDE54C7E7C5C2FBD5F5F918AC51C1A0964B9B55E5821A39F39B134A0E8A2DDBEC373E3A639CDA30FC869AA57A08E37EC74D6D086AB40E5812421260D8774CEB169D55A975DD7C8BBCFFDFB76BC0407FDAB32903EC2ED21ECB7A2AD3EE39C772F76FC0B0000FFFF0300504B030414000600080000002100B5553023F50000004C0200000B00CE015F72656C732F2E72656C7320A2CA0128A000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C92CF4EC3300CC6EF48BC43E4FBEA6E4808A1A5BB4C48BB21541EC024EE1FB58DA32440F7F68403824A63DBD1F6E7CF3F5BDEEEE669541F1C622F4EC3BA2841B133627BD76A78AD9F560FA06222676914C71A8E1C6157DDDE6C5F78A4949B62D7FBA8B28B8B1ABA94FC2362341D4F140BF1EC72A5913051CA6168D19319A865DC94E53D86BF1E502D3CD5C16A08077B07AA3EFA3CF9B2
m.lcFileBinary = m.lcFileBinary + 0hB7344D6F782FE67D62974E8C409E133BCB76E543660BA9CFDBA89A42CB498315F39CD311C9FB2263039E26DA5C4FF4FFB63871224B89D048E0F33CDF8A7340EBEB812E9F68A9F8BDCE3CE2A784E14D64F861C1C50F545F000000FFFF0300504B0304140006000800000021008D87DA70E00000002D0200001A000801786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C7320A2040128A0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC91CB6AC3301045F785FE83987D3D760AA594C8D99442B6C5FD00218F1FC496846692D67F5FE182DD404836D908AE06DD73246D773FE3A04E14B9F74E4391E5A0C8595FF7AED5F0557D3CBD826231AE368377A46122865DF9F8B0FDA4C1483A
m.lcFileBinary = m.lcFileBinary + 0hC45D1F58A516C71A3A91F086C8B6A3D170E603B934697C1C8DA4185B0CC61E4C4BB8C9F3178CFF3BA03CEB54FB5A43DCD7CFA0AA2924F2ED6EDF34BDA5776F8F2339B98040966948175095892D8986BF9C2547C0CBF8CD3DF1929E8556FA1C715E8B6B0EC53D1DBE7D3C704724ABC7B2C5384F16193CFBE4F2170000FFFF0300504B030414000600080000002100A460FAFF52010000270200000F000000786C2F776F726B626F6F6B2E786D6C8C915D6FC2201486EF97EC3F10EE272DA9CE185B93655BE6CD6232A7D7AC9C5A228506A8D57FBF534CE776B72BCE073CE7BC2FCBD5B9D1E404CE2B6B729A4E124AC094562A73C8E9E7F6F5614E890FC248A1
m.lcFileBinary = m.lcFileBinary + 0hAD819C5EC0D355717FB7ECAD3B7E597B2408303EA77508ED82315FD6D0083FB12D18EC54D6352260EA0ECCB70E84F435406834E34932638D50865E090BF71F86AD2A55C2B32DBB064CB8421C6811707D5FABD6D36259290DBBAB2222DAF65D34B8F75953A2850F2F52059039CD30B53DFC29B8AE7DEA941EBAD3644A59F12372E3085203B88D5327515ED0294A2454A2D3618B82C77958E719E7B3E1ED60CE4E41EF6F982125E7BD32D2F639E5199A7D19B31427923EB6F64A861A51D9FC567B0375A8434EE7499A0C74F60B1F2DC531F12426EAFD186CC625636D8D9230760B85815BCB3412C667A5D0250A1C8E78914F1F7954CFC63F2EBE010000FFFF03
m.lcFileBinary = m.lcFileBinary + 0h00504B030414000600080000002100A083C4AEA3010000640300000D000000786C2F7374796C65732E786D6CA453C16ADC3010BD17F20F42F746BB0B0D6DB19D436121909440B6D0AB6CC95EC16864A4F1B2EED767643BDEDD530EBD584F4F336F9E66E4E2F1EC419C6C4C2E6029B7F71B292C36C138EC4AF9E7B0FFFA5D8A441A8D8680B694A34DF2B1BAFB52241AC1BE1DAD25C112984A7924EA7F2A959AA3F53ADD87DE229FB4217A4DBC8D9D4A7DB4DAA49CE441ED369B07E5B54359156D404AA2090312BB5888AA48FFC44903335BA9AAA20910A2209667231383DADB39E29706574797C35AED1D8C33BDCBC4E46889F30E43CCA4CA25972571920358
m.lcFileBinary = m.lcFileBinary + 0h0DECB20126AAA2D74436E29E3762C187B1E7F2C8DD9865A6B84FA2BBA8C7EDEEDB55829A0A56451DA2E1EE5F5F7DA6AA026C4B6C34BAEE98570A3D7FEB40143C03E37417500343F591B100BE4E6301DEF284FEB637DAE756E0E0F79E9E4C2979D6B9091F902FB2C0596FDE64FD6BB559FBBF65C5B9BDD567C52BDB37A6D7F222CFBB94BFF39302B94A887A70400E6F05A7EBB3A6395F5AB0C913205DF3CBCDCD59AB70278C6DF50074580F4B79C12FD6B8C1FF58A35EDD29D02451CA0B7ECE93DA3E4C534EEBEF51BD030000FFFF0300504B030414000600080000002100E9A625B882060000531B000013000000786C2F7468656D652F7468656D65312E78
m.lcFileBinary = m.lcFileBinary + 0h6D6CEC594F6FDB3614BF0FD87720746F6D27B61B07758AD8B19BAD4D1BC46E871E6999965853A240D2497D1BDAE38001C3BA619701BBED306C2BD002BB749F265B87AD03FA15F6484AB218CB4BD2061BD6D58744227F7CFFDFE32375F5DA8388A1432224E571DBAB5DAE7A88C43E1FD338687B7786FD4B1B1E920AC763CC784CDADE9C48EFDAD6FBEF5DC59B2A241141B03E969BB8ED854A259B958AF46118CBCB3C2131CC4DB888B082571154C6021F01DD8855D6AAD56625C234F6508C23207B7B32A13E41434DD2DBCA88F718BCC64AEA019F8981264D9C15063B9ED63442CE659709748859DB033E637E34240F948718960A26DA5ED5FCBCCAD6D50ADE
m.lcFileBinary = m.lcFileBinary + 0h4C1731B5626D615DDFFCD275E982F174CDF014C128675AEBD75B577672FA06C0D432AED7EB757BB59C9E0160DF074DAD2C459AF5FE46AD93D12C80ECE332ED6EB551ADBBF802FDF525995B9D4EA7D14A65B1440DC83ED697F01BD5667D7BCDC11B90C53796F0F5CE76B7DB74F00664F1CD257CFF4AAB5977F10614321A4F97D0DAA1FD7E4A3D874C38DB2D856F007CA39AC2172888863CBA348B098FD5AA588BF07D2EFA00D04086158D919A2764827D88E22E8E468262CD006F125C98B143BE5C1AD2BC90F4054D54DBFB30C190110B7AAF9E7FFFEAF953F4EAF993E387CF8E1FFE74FCE8D1F1C31F2D2D67E12E8E83E2C297DF7EF6E7D71FA33F9E7EF3F2
m.lcFileBinary = m.lcFileBinary + 0hF117E57859C4FFFAC327BFFCFC793910326821D18B2F9FFCF6ECC98BAF3EFDFDBBC725F06D814745F8904644A25BE4081DF0087433867125272371BE15C3105367050E817609E99E0A1DE0AD396665B80E718D775740F128035E9FDD77641D8462A66809E71B61E400F738671D2E4A0D7043F32A5878388B8372E66256C41D607C58C6BB8B63C7B5BD590255330B4AC7F6DD903862EE331C2B1C909828A4E7F8949012EDEE51EAD8758FFA824B3E51E81E451D4C4B4D32A4232790168B7669047E9997E90CAE766CB3771775382BD37A871CBA484808CC4A841F12E698F13A9E291C95911CE288150D7E13ABB04CC8C15CF8455C4F2AF074401847BD3191B2
m.lcFileBinary = m.lcFileBinary + 0h6CCD6D01FA169C7E0343BD2A75FB1E9B472E52283A2DA37913735E44EEF06937C45152861DD0382C623F905308518CF6B92A83EF713743F43BF801C72BDD7D9712C7DDA717823B3470445A04889E9909ED4B28D44EFD8D68FC77C59851A8C63606DE15E3B6B70D5B53594AEC9E28C1AB70FFC1C2BB8367F13E81585FDE78DED5DD7775D77BEBEBEEAA5C3E6BB55D1458A8BDBA79B07DB1E992A3954DF28432365073466E4AD3274BD82CC67D18D4EBCC0191E487A62484C7B4B83BB84060B30609AE3EA22A1C8438811EBBE66922814C490712255CC2D9CE0C97D2D678E8D3953D1936F499C1D60389D51E1FDBE1753D9C1D0D723266CB09CCF93363B4AE09
m.lcFileBinary = m.lcFileBinary + 0h9C95D9FA959428A8FD3ACC6A5AA83373AB19D14CA973B8E52A830F975583C1DC9AD08520E85DC0CA4D38A26BD67036C18C8CB5DDED069CB9C578E1225D24433C26A98FB4DECB3EAA192765B1622E0320764A7CA4CF79A758ADC0ADA5C9BE01B7B338A9C8AEBE825DE6BD37F15216C10B2FE9BC3D918E2C2E26278BD151DB6B35D61A1EF271D2F62670AC85C72801AF4BDDF86116C0DD90AF840DFB5393D964F9C29BAD4C3137096A705361EDBEA4B053071221D50E96A10D0D339586008B35272BFF5A03CC7A510AD8487F0D29D6372018FE3529C08EAE6BC964427C5574766144DBCEBEA6A594CF141183707C84466C260E30B85F872AE833A6126E274C45
m.lcFileBinary = m.lcFileBinary + 0hD02F7095A6AD6DA6DCE29C265DF102CBE0EC38664988D372AB5334CB640B37799CCB60DE0AE2816EA5B21BE5CEAF8A49F90B52A518C6FF3355F47E02D705EB63ED011F6E7205463A5FDB1E172AE450859290FA7D018D83A91D102D701D0BD31054709F6CFE0B72A8FFDB9CB3344C5AC3A94F1DD000090AFB910A0521FB50964CF49D42AC96EE5D96244B0999882A882B132BF6881C1236D435B0A9F7760F8510EAA69AA465C0E04EC69FFB9E66D028D04D4E31DF9C1A92EFBD3607FEE9CEC7263328E5D661D3D064F6CF452CD955ED7AB33CDB7B8B8AE889459B55CFB2029815B682569AF6AF29C239B75A5BB196345E6B64C28117973586C1BC214AE0D207
m.lcFileBinary = m.lcFileBinary + 0hE93FB0FF51E133FB71426FA8437E00B515C1B7064D0CC206A2FA926D3C902E907670048D931DB4C1A44959D3A6AD93B65AB6595F70A79BF33D616C2DD959FC7D4E63E7CD99CBCEC9C58B34766A61C7D6766CA5A9C1B32753148626D941C638C67CD52A7E78E2A3FBE0E81DB8E29F31254D30C1672581A1F51C983C80E4B71CCDD2ADBF000000FFFF0300504B030414000600080000002100075F38D31E010000C701000018000000786C2F776F726B7368656574732F7368656574312E786D6C8C514D6BC3300CBD0FF61F8CEE8BD38D6EA324298352B6C360ECEBEE2472626A5BC156D7EDDFCF496819F4B29B3EDE7BD2938AF5B7B3E20B4334E44B586439
m.lcFileBinary = m.lcFileBinary + 0h08F40DB5C677257CBC6FAFEE414456BE55963C96F08311D6D5E54571A0B08B3D228BA4E063093DF3B09232363D3A15331AD0A78EA6E014A73474320E01553B919C95D7797E2B9D321E668555F88F06696D1ADC50B377E87916096815A7FD636F860855D19AD41B0D8980BA848705C8AA98C67E1A3CC43FB16055BFA1C586B14DEE418CAE6AA2DD087C4AA57CA4CA33EE7672F512448B5AED2DBFD2E1114DD77312599EA66D14AB441F5487CF2A74C6476151274C9EDD8108337E8A9986A9BA04511333B963D6A783613A4C9EDD80D0447C4CC6B54E2FA87E010000FFFF0300504B0304140006000800000021000ACFE8CF3F0100005102000011000801646F
m.lcFileBinary = m.lcFileBinary + 0h6350726F70732F636F72652E786D6C20A2040128A0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000007C92CB6AC3301045F785FE83D1DE969C904785ED405BB26AA0509794EE8434494CAD07925A277F5FD94E5C0742411BCDBD73E66A50B63ACA3AFA01EB2AAD7294260445A0B81695DAE7E8BD5CC74B1439CF9460B55690A31338B42AEEEF326E28D7165EAD36607D052E0A24E52837393A786F28C68E1F40329704870AE24E5BC97CB8DA3D368C7FB13DE00921732CC133C13CC32D303603119D91820F48F36DEB0E2038861A2428EF709AA4F8CFEBC14A77B3A153464E59F993096F3AC71DB305EFC5C17D74D5606C9A2669A65D8C903FC51F9B97B7EEA971A5DA5D7140452638E51698D7B6C8F0
m.lcFileBinary = m.lcFileBinary + 0hF812165733E73761C7BB0AC4E329E8376A8277717B08882804A07DDC8BB29D3E3D976B54B43B8CC9439CCE4B4268773EDB9157FD6DA0BE20CF83FF272E5B2259941342A70B3A9B8D8817409FFBFA1314BF000000FFFF0300504B0304140006000800000021006F7E771280010000FE02000010000801646F6350726F70732F6170702E786D6C20A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C92416BE3301085EF85FD0F46F7464E589625C82AA569E9614B0349B367551EC7228A64345393F4D7776C93C6D9EDA93A8DE63D9E3E8DA46E0E7B9FB590D0C55088E9241719041B4B17B68578593F5CFF16199209A5F13140218E80E246FFB852CB141B48E400338E0858889AA8994B
m.lcFileBinary = m.lcFileBinary + 0h89B686BDC109CB81952AA6BD21DEA6AD8C55E52C2CA27DDB432039CBF35F120E04A184F2BAF90C1443E2BCA5EF8696D1767CB8591F1B06D6EAB669BCB386F896FAC9D914315694DD1F2C7825C7A262BA15D8B7E4E8A87325C75BB5B2C6C31D07EBCA780425CF0DF508A61BDAD2B8845AB5346FC1524C19BA771EDB4C64AF06A1C329446B92338118ABB30D9BBEF60D52D27F63DA610D40A8241B86665F8EBDE3DAFDD4D3DEC0C5A5B10B184058B8445C3BF280CFD5D224FA82783A26EE1906DE0167D5F10D678EF9FA2BF349FF64FF7161872FCD3A2E0CC16976974DB5AA4D8292C77DD2CF0DF5C8634BBE0BB9AB4DD84279F2FC2F742FBD19BEB39ECE2639
m.lcFileBinary = m.lcFileBinary + 0hAFFE814F3D25CF1F577F000000FFFF0300504B01022D001400060008000000210038088E4F60010000F20300001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D0014000600080000002100B5553023F50000004C0200000B000000000000000000000000006C0300005F72656C732F2E72656C73504B01022D00140006000800000021008D87DA70E00000002D0200001A0000000000000000000000000058060000786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C73504B01022D0014000600080000002100A460FAFF52010000270200000F000000000000000000000000007808
m.lcFileBinary = m.lcFileBinary + 0h0000786C2F776F726B626F6F6B2E786D6C504B01022D0014000600080000002100A083C4AEA3010000640300000D00000000000000000000000000F7090000786C2F7374796C65732E786D6C504B01022D0014000600080000002100E9A625B882060000531B00001300000000000000000000000000C50B0000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100075F38D31E010000C7010000180000000000000000000000000078120000786C2F776F726B7368656574732F7368656574312E786D6C504B01022D00140006000800000021000ACFE8CF3F010000510200001100000000000000000000000000CC13
m.lcFileBinary = m.lcFileBinary + 0h0000646F6350726F70732F636F72652E786D6C504B01022D00140006000800000021006F7E771280010000FE020000100000000000000000000000000042160000646F6350726F70732F6170702E786D6C504B050600000000090009003E020000F81800000000
OTHERWISE && XLS
m.lcFileBinary = 0hD0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000000000000010000000100000000000000001000001A00000001000000FEFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFDFFFFFF1C000000030000000400000005000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F00000010000000110000001200000013000000140000001500000016000000170000001800000019000000FEFFFFFFFEFFFFFF1D000000FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFF52006F006F007400200045006E00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500FFFFFFFFFFFFFFFF020000002008020000000000C00000000000004600000000000000000000000030C843AA2911C9011B000000800200000000000057006F0072006B0062006F006F006B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200020104000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000002000000892F00
m.lcFileBinary = m.lcFileBinary + 0h00000000000500530075006D006D0061007200790049006E0066006F0072006D006100740069006F006E000000000000000000000000000000000000000000000000000000280002010100000003000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000C800000000000000050044006F00630075006D0065006E007400530075006D006D0061007200790049006E0066006F0072006D006100740069006F006E000000000000000000000038000201FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000004000000E000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000908100000060500A91FCD07C100010006040000E1000200B004C10002000000E20000005C0070000200002020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202042000200B004610102000000C00100003D01020001009C0002001000190002000000120002000000130002000000AF0102000000BC01020000003D001200F0006900D5394A1F380000000000010058024000020000008D00020000002200020000
m.lcFileBinary = m.lcFileBinary + 0h000E0002000100B70102000000DA000200000031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00680101003800BC020000000200AA0701430061006D00620072006900610031001E002C0101003800BC020000000200AA0701430061006C00690062007200
m.lcFileBinary = m.lcFileBinary + 0h690031001E00040101003800BC020000000200AA0701430061006C00690062007200690031001E00DC0001003800BC020000000200AA0701430061006C00690062007200690031001E00DC000000110090010000000200AA0701430061006C00690062007200690031001E00DC000000140090010000000200AA0701430061006C00690062007200690031001E00DC0000003C0090010000000200AA0701430061006C00690062007200690031001E00DC0000003E0090010000000200AA0701430061006C00690062007200690031001E00DC0001003F00BC020000000200AA0701430061006C00690062007200690031001E00DC0001003400BC02000000
m.lcFileBinary = m.lcFileBinary + 0h0200AA0701430061006C00690062007200690031001E00DC000000340090010000000200AA0701430061006C00690062007200690031001E00DC0001000900BC020000000200AA0701430061006C00690062007200690031001E00DC0000000A0090010000000200AA0701430061006C00690062007200690031001E00DC000200170090010000000200AA0701430061006C00690062007200690031001E00DC0001000800BC020000000200AA0701430061006C00690062007200690031001E00DC000000090090010000000200AA0701430061006C0069006200720069001E041C000500170000222422232C2323305F293B5C28222422232C2323305C29
m.lcFileBinary = m.lcFileBinary + 0h1E04210006001C0000222422232C2323305F293B5B5265645D5C28222422232C2323305C291E04220007001D0000222422232C2323302E30305F293B5C28222422232C2323302E30305C291E0427000800220000222422232C2323302E30305F293B5B5265645D5C28222422232C2323302E30305C291E0437002A003200005F282224222A20232C2323305F293B5F282224222A205C28232C2323305C293B5F282224222A20222D225F293B5F28405F291E042E0029002900005F282A20232C2323305F293B5F282A205C28232C2323305C293B5F282A20222D225F293B5F28405F291E043F002C003A00005F282224222A20232C2323302E30305F293B5F
m.lcFileBinary = m.lcFileBinary + 0h282224222A205C28232C2323302E30305C293B5F282224222A20222D223F3F5F293B5F28405F291E0436002B003100005F282A20232C2323302E30305F293B5F282A205C28232C2323302E30305C293B5F282A20222D223F3F5F293B5F28405F29E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF20000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E0001400000000000100200000000000000000000002C020E000140005000000F5FF200000B400000000000000049F20E000140005
m.lcFileBinary = m.lcFileBinary + 0h000000F5FF200000B40000000000000004AD20E000140005000000F5FF200000B40000000000000004AA20E000140005000000F5FF200000B40000000000000004AE20E000140005000000F5FF200000B400000000000000049B20E000140005000000F5FF200000B40000000000000004AF20E000140005000000F5FF200000B40000000000000004AC20E000140005000000F5FF200000B400000000000000049D20E000140005000000F5FF200000B400000000000000048B20E000140005000000F5FF200000B40000000000000004AE20E000140005000000F5FF200000B40000000000000004AC20E000140005000000F5FF200000B4000000000000
m.lcFileBinary = m.lcFileBinary + 0h0004B320E000140015000000F5FF200000B400000000000000049E20E000140015000000F5FF200000B400000000000000049D20E000140015000000F5FF200000B400000000000000048B20E000140015000000F5FF200000B40000000000000004A420E000140015000000F5FF200000B40000000000000004B120E000140015000000F5FF200000B40000000000000004B420E000140015000000F5FF200000B40000000000000004BE20E000140015000000F5FF200000B400000000000000048A20E000140015000000F5FF200000B40000000000000004B920E000140015000000F5FF200000B40000000000000004A420E000140015000000F5FF20
m.lcFileBinary = m.lcFileBinary + 0h0000B40000000000000004B120E000140015000000F5FF200000B40000000000000004B520E00014000B000000F5FF200000B40000000000000004AD20E00014000F000000F5FF200000941111970B970B00049620E000140011000000F5FF200000946666BF1FBF1F0004B720E000140005002B00F5FF200000F80000000000000000C020E000140005002900F5FF200000F80000000000000000C020E000140005002C00F5FF200000F80000000000000000C020E000140005002A00F5FF200000F80000000000000000C020E000140013000000F5FF200000F40000000000000000C020E00014000A000000F5FF200000B40000000000000004AA20E000
m.lcFileBinary = m.lcFileBinary + 0h140007000000F5FF200000D400500000001F0000C020E000140008000000F5FF200000D400500000000B0000C020E000140009000000F5FF200000D400200000000F0000C020E000140009000000F5FF200000F40000000000000000C020E00014000D000000F5FF200000941111970B970B0004AF20E000140010000000F5FF200000D400600000001A0000C020E00014000C000000F5FF200000B40000000000000004AB20E000140005000000F5FF2000009C1111160B160B00049A20E00014000E000000F5FF200000941111BF1FBF1F00049620E000140005000900F5FF200000F80000000000000000C020E000140006000000F5FF200000F4000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000C020E000140014000000F5FF200000D4006100003E1F0000C020E000140012000000F5FF200000F40000000000000000C0207C0814007C080000000000000000000000003E00DED9EE787D082D007D080000000000000000000000000000000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000100000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000200000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000300000002000D00140003
m.lcFileBinary = m.lcFileBinary + 0h0000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000400000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000500000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000600000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000700000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000800000002000D001400030000000100000030305C
m.lcFileBinary = m.lcFileBinary + 0h293B5F282A0E000500027D082D007D080000000000000000000000000900000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000A00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000B00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000C00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000D00000002000D001400030000000100000030305C293B5F282A0E00050002
m.lcFileBinary = m.lcFileBinary + 0h7D082D007D080000000000000000000000000E00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000F00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000002B00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000002C00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000002D00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D0800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000002E00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000003A00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000003B00000002000D001400030000000300000030305C293B5F282A0E000500017D0841007D080000000000000000000000003100000003000D001400030000000300000030305C293B5F282A0E000500020800140003000000040000003B5F28405F2920207D0841007D080000000000000000000000003200000003000D001400030000000300000030305C293B5F282A0E00050002
m.lcFileBinary = m.lcFileBinary + 0h080014000300FF3F040000003B5F28405F2920207D0841007D080000000000000000000000003300000003000D001400030000000300000030305C293B5F282A0E000500020800140003003233040000003B5F28405F2920207D082D007D080000000000000000000000003400000002000D001400030000000300000030305C293B5F282A0E000500027D0841007D080000000000000000000000003000000003000D00140002000000006100FF30305C293B5F282A0E000500020400140002000000C6EFCEFF3B5F28405F2920207D0841007D080000000000000000000000002800000003000D001400020000009C0006FF30305C293B5F282A0E000500
m.lcFileBinary = m.lcFileBinary + 0h020400140002000000FFC7CEFF3B5F28405F2920207D0841007D080000000000000000000000003700000003000D001400020000009C6500FF30305C293B5F282A0E000500020400140002000000FFEB9CFF3B5F28405F2920207D0891007D080000000000000000000000003500000007000D001400020000003F3F76FF30305C293B5F282A0E000500020400140002000000FFCC99FF3B5F28405F29202007001400020000007F7F7FFF202020202020202008001400020000007F7F7FFF202020202020202009001400020000007F7F7FFF00000000000000000A001400020000007F7F7FFF00000000000000007D0891007D0800000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00003900000007000D001400020000003F3F3FFF30305C293B5F282A0E000500020400140002000000F2F2F2FF3B5F28405F29202007001400020000003F3F3FFF202020202020202008001400020000003F3F3FFF202020202020202009001400020000003F3F3FFF00000000000000000A001400020000003F3F3FFF00000000000000007D0891007D080000000000000000000000002900000007000D00140002000000FA7D00FF30305C293B5F282A0E000500020400140002000000F2F2F2FF3B5F28405F29202007001400020000007F7F7FFF202020202020202008001400020000007F7F7FFF202020202020202009001400020000007F7F7FFF00
m.lcFileBinary = m.lcFileBinary + 0h000000000000000A001400020000007F7F7FFF00000000000000007D0841007D080000000000000000000000003600000003000D00140002000000FA7D00FF30305C293B5F282A0E000500020800140002000000FF8001FF3B5F28405F2920207D0891007D080000000000000000000000002A00000007000D001400030000000000000030305C293B5F282A0E000500020400140002000000A5A5A5FF3B5F28405F29202007001400020000003F3F3FFF202020202020202008001400020000003F3F3FFF202020202020202009001400020000003F3F3FFF00000000000000000A001400020000003F3F3FFF00000000000000007D082D007D0800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000003D00000002000D00140002000000FF0000FF30305C293B5F282A0E000500027D0891007D080000000000000000000000003800000007000D001400030000000100000030305C293B5F282A0E000500020400140002000000FFFFCCFF3B5F28405F2920200700140002000000B2B2B2FF20202020202020200800140002000000B2B2B2FF20202020202020200900140002000000B2B2B2FF00000000000000000A00140002000000B2B2B2FF00000000000000007D082D007D080000000000000000000000002F00000002000D001400020000007F7F7FFF30305C293B5F282A0E000500027D0855007D08000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h3C00000004000D001400030000000100000030305C293B5F282A0E000500020700140003000000040000003B5F28405F29202008001400030000000400000020202020202020207D0841007D080000000000000000000000002200000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000040000003B5F28405F2920207D0841007D080000000000000000000000001000000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566040000003B5F28405F2920207D0841007D080000000000000000000000001600000003000D001400030000000100000030305C293B5F282A0E00
m.lcFileBinary = m.lcFileBinary + 0h050002040014000300CC4C040000003B5F28405F2920207D0841007D080000000000000000000000001C00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233040000003B5F28405F2920207D0841007D080000000000000000000000002300000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000050000003B5F28405F2920207D0841007D080000000000000000000000001100000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566050000003B5F28405F2920207D0841007D080000000000000000000000001700000003000D
m.lcFileBinary = m.lcFileBinary + 0h001400030000000100000030305C293B5F282A0E00050002040014000300CC4C050000003B5F28405F2920207D0841007D080000000000000000000000001D00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233050000003B5F28405F2920207D0841007D080000000000000000000000002400000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000060000003B5F28405F2920207D0841007D080000000000000000000000001200000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566060000003B5F28405F2920207D084100
m.lcFileBinary = m.lcFileBinary + 0h7D080000000000000000000000001800000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C060000003B5F28405F2920207D0841007D080000000000000000000000001E00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233060000003B5F28405F2920207D0841007D080000000000000000000000002500000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000070000003B5F28405F2920207D0841007D080000000000000000000000001300000003000D001400030000000100000030305C293B5F282A0E00050002040014
m.lcFileBinary = m.lcFileBinary + 0h0003006566070000003B5F28405F2920207D0841007D080000000000000000000000001900000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C070000003B5F28405F2920207D0841007D080000000000000000000000001F00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233070000003B5F28405F2920207D0841007D080000000000000000000000002600000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000080000003B5F28405F2920207D0841007D080000000000000000000000001400000003000D001400030000
m.lcFileBinary = m.lcFileBinary + 0h000100000030305C293B5F282A0E000500020400140003006566080000003B5F28405F2920207D0841007D080000000000000000000000001A00000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C080000003B5F28405F2920207D0841007D080000000000000000000000002000000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233080000003B5F28405F2920207D0841007D080000000000000000000000002700000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000090000003B5F28405F2920207D0841007D0800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000001500000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566090000003B5F28405F2920207D0841007D080000000000000000000000001B00000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C090000003B5F28405F2920207D0841007D080000000000000000000000002100000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233090000003B5F28405F2920209302120010000D0000323025202D20416363656E743192084D0092080000000000000000000001041EFF0D0032003000250020002D0020004100
m.lcFileBinary = m.lcFileBinary + 0h6300630065006E00740031000000030001000C0007046566DBE5F1FF05000C0007010000000000FF25000500029302120011000D0000323025202D20416363656E743292084D00920800000000000000000000010422FF0D0032003000250020002D00200041006300630065006E00740032000000030001000C0007056566F2DDDCFF05000C0007010000000000FF25000500029302120012000D0000323025202D20416363656E743392084D00920800000000000000000000010426FF0D0032003000250020002D00200041006300630065006E00740033000000030001000C0007066566EAF1DDFF05000C0007010000000000FF250005000293021200
m.lcFileBinary = m.lcFileBinary + 0h13000D0000323025202D20416363656E743492084D0092080000000000000000000001042AFF0D0032003000250020002D00200041006300630065006E00740034000000030001000C0007076566E5E0ECFF05000C0007010000000000FF25000500029302120014000D0000323025202D20416363656E743592084D0092080000000000000000000001042EFF0D0032003000250020002D00200041006300630065006E00740035000000030001000C0007086566DBEEF3FF05000C0007010000000000FF25000500029302120015000D0000323025202D20416363656E743692084D00920800000000000000000000010432FF0D0032003000250020002D
m.lcFileBinary = m.lcFileBinary + 0h00200041006300630065006E00740036000000030001000C0007096566FDE9D9FF05000C0007010000000000FF25000500029302120016000D0000343025202D20416363656E743192084D0092080000000000000000000001041FFF0D0034003000250020002D00200041006300630065006E00740031000000030001000C000704CC4CB8CCE4FF05000C0007010000000000FF25000500029302120017000D0000343025202D20416363656E743292084D00920800000000000000000000010423FF0D0034003000250020002D00200041006300630065006E00740032000000030001000C000705CC4CE6B9B8FF05000C0007010000000000FF25000500
m.lcFileBinary = m.lcFileBinary + 0h029302120018000D0000343025202D20416363656E743392084D00920800000000000000000000010427FF0D0034003000250020002D00200041006300630065006E00740033000000030001000C000706CC4CD7E4BCFF05000C0007010000000000FF25000500029302120019000D0000343025202D20416363656E743492084D0092080000000000000000000001042BFF0D0034003000250020002D00200041006300630065006E00740034000000030001000C000707CC4CCCC0DAFF05000C0007010000000000FF2500050002930212001A000D0000343025202D20416363656E743592084D0092080000000000000000000001042FFF0D0034003000
m.lcFileBinary = m.lcFileBinary + 0h250020002D00200041006300630065006E00740035000000030001000C000708CC4CB6DDE8FF05000C0007010000000000FF2500050002930212001B000D0000343025202D20416363656E743692084D00920800000000000000000000010433FF0D0034003000250020002D00200041006300630065006E00740036000000030001000C000709CC4CFCD5B4FF05000C0007010000000000FF2500050002930212001C000D0000363025202D20416363656E743192084D00920800000000000000000000010420FF0D0036003000250020002D00200041006300630065006E00740031000000030001000C000704323395B3D7FF05000C0007000000FFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFF2500050002930212001D000D0000363025202D20416363656E743292084D00920800000000000000000000010424FF0D0036003000250020002D00200041006300630065006E00740032000000030001000C0007053233D99795FF05000C0007000000FFFFFFFF2500050002930212001E000D0000363025202D20416363656E743392084D00920800000000000000000000010428FF0D0036003000250020002D00200041006300630065006E00740033000000030001000C0007063233C2D69AFF05000C0007000000FFFFFFFF2500050002930212001F000D0000363025202D20416363656E743492084D0092080000000000000000000001042CFF0D
m.lcFileBinary = m.lcFileBinary + 0h0036003000250020002D00200041006300630065006E00740034000000030001000C0007073233B2A1C7FF05000C0007000000FFFFFFFF25000500029302120020000D0000363025202D20416363656E743592084D00920800000000000000000000010430FF0D0036003000250020002D00200041006300630065006E00740035000000030001000C000708323393CDDDFF05000C0007000000FFFFFFFF25000500029302120021000D0000363025202D20416363656E743692084D00920800000000000000000000010434FF0D0036003000250020002D00200041006300630065006E00740036000000030001000C0007093233FAC090FF05000C000700
m.lcFileBinary = m.lcFileBinary + 0h0000FFFFFFFF250005000293020C002200070000416363656E74319208410092080000000000000000000001041DFF070041006300630065006E00740031000000030001000C00070400004F81BDFF05000C0007000000FFFFFFFF250005000293020C002300070000416363656E743292084100920800000000000000000000010421FF070041006300630065006E00740032000000030001000C0007050000C0504DFF05000C0007000000FFFFFFFF250005000293020C002400070000416363656E743392084100920800000000000000000000010425FF070041006300630065006E00740033000000030001000C00070600009BBB59FF05000C000700
m.lcFileBinary = m.lcFileBinary + 0h0000FFFFFFFF250005000293020C002500070000416363656E743492084100920800000000000000000000010429FF070041006300630065006E00740034000000030001000C00070700008064A2FF05000C0007000000FFFFFFFF250005000293020C002600070000416363656E74359208410092080000000000000000000001042DFF070041006300630065006E00740035000000030001000C00070800004BACC6FF05000C0007000000FFFFFFFF250005000293020C002700070000416363656E743692084100920800000000000000000000010431FF070041006300630065006E00740036000000030001000C0007090000F79646FF05000C000700
m.lcFileBinary = m.lcFileBinary + 0h0000FFFFFFFF25000500029302080028000300004261649208390092080000000000000000000001011BFF03004200610064000000030001000C0005FF0000FFC7CEFF05000C0005FF00009C0006FF25000500029302100029000B000043616C63756C6174696F6E92088100920800000000000000000000010216FF0B00430061006C00630075006C006100740069006F006E000000070001000C0005FF0000F2F2F2FF05000C0005FF0000FA7D00FF250005000206000E0005FF00007F7F7FFF010007000E0005FF00007F7F7FFF010008000E0005FF00007F7F7FFF010009000E0005FF00007F7F7FFF010093020F002A000A0000436865636B2043656C
m.lcFileBinary = m.lcFileBinary + 0h6C92087F00920800000000000000000000010217FF0A0043006800650063006B002000430065006C006C000000070001000C0005FF0000A5A5A5FF05000C0007000000FFFFFFFF250005000206000E0005FF00003F3F3FFF060007000E0005FF00003F3F3FFF060008000E0005FF00003F3F3FFF060009000E0005FF00003F3F3FFF0600930204002B8003FF92082000920800000000000000000000010503FF050043006F006D006D00610000000000930204002C8006FF92082800920800000000000000000000010506FF090043006F006D006D00610020005B0030005D0000000000930204002D8004FF92082600920800000000000000000000010504
m.lcFileBinary = m.lcFileBinary + 0hFF0800430075007200720065006E006300790000000000930204002E8007FF92082E00920800000000000000000000010507FF0C00430075007200720065006E006300790020005B0030005D0000000000930215002F001000004578706C616E61746F7279205465787492084700920800000000000000000000010235FF10004500780070006C0061006E00610074006F0072007900200054006500780074000000020005000C0005FF00007F7F7FFF2500050002930209003000040000476F6F6492083B0092080000000000000000000001011AFF040047006F006F0064000000030001000C0005FF0000C6EFCEFF05000C0005FF0000006100FF250005
m.lcFileBinary = m.lcFileBinary + 0h000293020E00310009000048656164696E67203192084700920800000000000000000000010310FF0900480065006100640069006E006700200031000000030005000C00070300001F497DFF250005000207000E00070400004F81BDFF050093020E00320009000048656164696E67203292084700920800000000000000000000010311FF0900480065006100640069006E006700200032000000030005000C00070300001F497DFF250005000207000E000704FF3FA8C0DEFF050093020E00330009000048656164696E67203392084700920800000000000000000000010312FF0900480065006100640069006E006700200033000000030005000C0007
m.lcFileBinary = m.lcFileBinary + 0h0300001F497DFF250005000207000E000704323395B3D7FF020093020E00340009000048656164696E67203492083900920800000000000000000000010313FF0900480065006100640069006E006700200034000000020005000C00070300001F497DFF250005000293020A003500050000496E70757492087500920800000000000000000000010214FF050049006E007000750074000000070001000C0005FF0000FFCC99FF05000C0005FF00003F3F76FF250005000206000E0005FF00007F7F7FFF010007000E0005FF00007F7F7FFF010008000E0005FF00007F7F7FFF010009000E0005FF00007F7F7FFF01009302100036000B00004C696E6B6564
m.lcFileBinary = m.lcFileBinary + 0h2043656C6C92084B00920800000000000000000000010218FF0B004C0069006E006B00650064002000430065006C006C000000030005000C0005FF0000FA7D00FF250005000207000E0005FF0000FF8001FF060093020C0037000700004E65757472616C9208410092080000000000000000000001011CFF07004E00650075007400720061006C000000030001000C0005FF0000FFEB9CFF05000C0005FF00009C6500FF250005000293020400008000FF92083300920800000000000000000000010100FF06004E006F0072006D0061006C000000020005000C0007010000000000FF25000500029302090038000400004E6F746592086200920800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000001020AFF04004E006F00740065000000050001000C0005FF0000FFFFCCFF06000E0005FF0000B2B2B2FF010007000E0005FF0000B2B2B2FF010008000E0005FF0000B2B2B2FF010009000E0005FF0000B2B2B2FF010093020B0039000600004F757470757492087700920800000000000000000000010215FF06004F00750074007000750074000000070001000C0005FF0000F2F2F2FF05000C0005FF00003F3F3FFF250005000206000E0005FF00003F3F3FFF010007000E0005FF00003F3F3FFF010008000E0005FF00003F3F3FFF010009000E0005FF00003F3F3FFF0100930204003A8005FF9208240092080000000000000000000001
m.lcFileBinary = m.lcFileBinary + 0h0505FF0700500065007200630065006E0074000000000093020A003B000500005469746C659208310092080000000000000000000001030FFF05005400690074006C0065000000020005000C00070300001F497DFF250005000193020A003C00050000546F74616C92084D00920800000000000000000000010319FF050054006F00740061006C000000040005000C0007010000000000FF250005000206000E00070400004F81BDFF010007000E00070400004F81BDFF0600930211003D000C00005761726E696E67205465787492083F0092080000000000000000000001020BFF0C005700610072006E0069006E00670020005400650078007400000002
m.lcFileBinary = m.lcFileBinary + 0h0005000C0005FF0000FF0000FF25000500028E0858008E080000000000000000000090000000110011005400610062006C0065005300740079006C0065004D0065006400690075006D0039005000690076006F0074005300740079006C0065004C0069006700680074003100360060010200000085000E00032E0000000006005368656574319A0818009A0800000000000000000000010000000000000001000000A3081000A30800000000000000000000000000008C00040001000100C1010800C10100001DEB0100FC0008000000000000000000FF00020008006308160063080000000000000000000016000000040000000200960810009608000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000042E501009B0810009B0800000000000000000000010000008C0810008C0800000000000000000000000000000A0000000908100000061000A91FCD07C1000100060400000B021000000000000000000000000000152F00000D00020001000C00020064000F000200010011000200000010000800FCA9F1D24D62503F5F00020001002A00020000002B00020000008200020001008000080000000000000000002502040000002C0181000200C104140000001500000083000200000084000200000026000800666666666666E63F27000800666666666666E63F28000800000000000000E83F29000800000000000000E83FA10022000000
m.lcFileBinary = m.lcFileBinary + 0h2C01010001000100040042E50100333333333333D33F333333333333D33F74009C0826009C0800000000000000000000000000000000000000000000000000003C33000000000000000055000200080000020E0000000000000000000000000000003E021200B606000000004000000000000000000000008B0810008B0800000000000000000000000002001D000F0003000000000000010000000000000067081700670800000000000000000000020001FFFFFFFF034400000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000200000003000000FEFFFFFF050000000600000007000000FEFFFFFF09000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF0000060002000000000000000000000000000000000001000000E0859FF2F94F6810AB9108002B27B3D930000000980000000700000001000000400000000400000048000000080000005400000012000000600000000C000000780000000D00000084000000130000009000000002000000E40400001E00000004000000000000001E00000004000000000000001E000000100000004D6963726F736F667420457863656C004000000000C07C0D23D9C601400000000086FCA92911C90103000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FEFF000006000200000000000000000000000000000000000100000002D5CDD59C2E1B10939708002B2CF9AE30000000B000000008000000010000004800000017000000500000000B000000580000001000000060000000130000006800000016000000700000000D000000780000000C0000008B00000002000000E40400000300000000000C000B000000000000000B000000000000000B000000000000000B000000000000001E1000000100000007000000536865657431000C100000020000001E0000
m.lcFileBinary = m.lcFileBinary + 0h000B000000576F726B73686565747300030000000100000000000000000000000000000000000000000000000000000000000000000000000000010043006F006D0070004F0062006A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000200FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000800000072000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100FEFF030A0000FFFFFFFF2008020000000000C000000000000046260000004D6963726F736F6674204F666669636520457863656C203230303320576F726B736865657400060000004269666638000E000000457863656C2E53686565742E3800F439B271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
ENDCASE
IF !EMPTY(m.lcFileBinary)
IF STRTOFILE(m.lcFileBinary, m.tcExcelFile, 0) > 0
m.llReturn = .T.
ENDIF
ENDIF
ENDIF
RETURN m.llReturn
ENDFUNC

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

105
utile/GridExtras/sample.pj2 Normal file
View File

@@ -0,0 +1,105 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="sample.pjx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
LPARAMETERS tcDir
lcCurdir = SYS(5)+CURDIR()
CD ( EVL( tcDir, JUSTPATH( SYS(16) ) ) )
*<DevInfo>
_Author = ""
_Company = ""
_Address = ""
_City = ""
_State = ""
_PostalCode = ""
_Country = ""
*--
_Comments = ""
_CompanyName = ""
_FileDescription = ""
_LegalCopyright = ""
_LegalTrademark = ""
_ProductName = ""
_MajorVer = ""
_MinorVer = ""
_Revision = ""
_LanguageID = ""
_AutoIncrement = "0"
*</DevInfo>
*<BuildProj>
*<.HomeDir = 'd:\roa\roahotelconfig\comun\gridextras' />
FOR EACH loProject IN _VFP.Projects FOXOBJECT
loProject.Close()
ENDFOR
STRTOFILE( '', '__newproject.f2b' )
BUILD PROJECT sample.pjx FROM '__newproject.f2b'
FOR EACH loProject IN _VFP.Projects FOXOBJECT
loProject.Close()
ENDFOR
MODIFY PROJECT 'sample.pjx' NOWAIT NOSHOW NOPROJECTHOOK
loProject = _VFP.Projects('sample.pjx')
WITH loProject.FILES
.ADD('add16.png') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('addfilter16.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('ascendingsort12.bmp') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('clearfilter16.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('close16.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('delete16.png') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('descendingsort12.bmp') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('excel.jpg') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('excel24.jpg') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('exit.png') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('filter12.bmp') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('gridextras.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('gridextrasprocs.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('gridfunctions16.bmp') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('nosort12.bmp') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('sample.scx') && *< FileMetadata: Type="K" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('search16.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('showfilters16.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('table_sql_view.png') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('table_sql_view16.png') && *< FileMetadata: Type="x" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
*</BuildProj>
.ITEM('__newproject.f2b').Remove()
*<FileComments>
*</FileComments>
*<ExcludedFiles>
*</ExcludedFiles>
*<TextFiles>
*</TextFiles>
ENDWITH
WITH loProject
*<ProjectProperties>
.SetMain("sample.scx")
.Debug = .T.
.Encrypted = .F.
*<.CmntStyle = 1 />
*<.NoLogo = .F. />
*<.SaveCode = .T. />
*<.User = '' />
.ProjectHookLibrary = ''
.ProjectHookClass = ''
*</ProjectProperties>
ENDWITH
_VFP.Projects('sample.pjx').Close()
*ERASE '__newproject.f2b'
CD (lcCurdir)
RETURN

View File

@@ -0,0 +1,70 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="sample.scx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS dataenvironment AS dataenvironment
*< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" />
*<PropValue>
DataSource = .NULL.
Height = 0
Left = 0
Name = "Dataenvironment"
Top = 0
Width = 0
*</PropValue>
ENDDEFINE
DEFINE CLASS form1 AS form
*< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Grid1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Gridextra1" UniqueID="" Timestamp="" />
*<PropValue>
AutoCenter = .T.
Caption = "GridExtras Sample"
DoCreate = .T.
Height = 480
Name = "Form1"
Width = 669
WindowType = 1
*</PropValue>
ADD OBJECT 'Grid1' AS grid WITH ;
Anchor = 15, ;
Height = 480, ;
HighlightBackColor = 255,255,128, ;
HighlightForeColor = 0,0,0, ;
HighlightStyle = 2, ;
Left = 0, ;
Name = "Grid1", ;
Top = 0, ;
Width = 669
*< END OBJECT: BaseClass="grid" />
ADD OBJECT 'Gridextra1' AS gridextra WITH ;
Height = 17, ;
Left = 102, ;
Name = "Gridextra1", ;
Top = 73, ;
Width = 28
*< END OBJECT: ClassLib="gridextras.vcx" BaseClass="custom" />
PROCEDURE Destroy
USE IN SELECT("customers")
ENDPROC
PROCEDURE Init
thisform.gridextra1.setup()
ENDPROC
PROCEDURE Load
USE (HOME(2) + "Northwind\customers.dbf") IN 0 SHARED
ENDPROC
ENDDEFINE

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

BIN
utile/GridExtras/sterge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 792 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1,70 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="gridtreeview.scx" CPID="1250" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS dataenvironment AS dataenvironment
*< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" />
*<PropValue>
DataSource = .NULL.
Height = 0
Left = 0
Name = "Dataenvironment"
Top = 0
Width = 0
*</PropValue>
ENDDEFINE
DEFINE CLASS form1 AS form
*< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Gridtreeview1" UniqueID="" Timestamp="" />
*<PropValue>
Caption = "Form1"
DoCreate = .T.
Name = "Form1"
*</PropValue>
ADD OBJECT 'Gridtreeview1' AS gridtreeview WITH ;
Anchor = 15, ;
cexplicatie = info, ;
cid = id, ;
cseparator = \, ;
Height = 228, ;
Left = 24, ;
Name = "Gridtreeview1", ;
Panel = 1, ;
RecordSource = "cInfo", ;
Top = 12, ;
Width = 320, ;
ColumnTV.ControlSource = "", ;
ColumnTV.Header1.Name = "Header1", ;
ColumnTV.Name = "ColumnTV", ;
ColumnTV.Text1.Name = "Text1", ;
ColumnTV.Width = 296
*< END OBJECT: ClassLib="gridtreeview.vcx" BaseClass="grid" />
PROCEDURE Load
lcDir = JUSTPATH(SYS(16,0))
lcDir = SUBSTR(lcDir, AT(':', lcDir)-1)
SET DEFAULT TO (lcDir)
SET CLASSLIB TO gridtreeview.vcx ADDITIVE
USE IN (SELECT('cInfo'))
CREATE CURSOR cinfo(id i, info c(100))
INSERT INTO cinfo (id, info) VALUES (1,'Nod 1')
INSERT INTO cinfo (id, info) VALUES (2,'Nod 1\1')
INSERT INTO cinfo (id, info) VALUES (3,'Nod 1\2')
INSERT INTO cinfo (id, info) VALUES (4,'Nod 1\1\x')
INSERT INTO cinfo (id, info) VALUES (5,'Nod 1\2\x')
GO TOP
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,374 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="gridtreeview.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS element AS _container OF "..\..\clase\_baza.vcx"
*< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="imagine1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="imagine2" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="explicatie" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="nivel" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
*m: do_aranjeaza && Aranjeaza obiectele din container in functie de nivel.
*m: nodeclick
*p: cexplicatie && Numele campului care contine explicatia.
*p: nexplicatie
*p: nimagine1
*p: nimagine2
*p: ntip && 0 - nod neterminal, 1 - nod terminal
*p: _memberdata && XML Metadata for customizable properties
*</DefinedPropArrayMethod>
*<PropValue>
Anchor = 10
BorderWidth = 0
cexplicatie =
Height = 24
Name = "element"
nexplicatie = 0
nimagine1 = 0
nimagine2 = 0
ntip = 0
Width = 400
_memberdata = <VFPData>
<memberdata name="cexplicatie" type="Property" favorites="True"/>
<memberdata name="nexplicatie" type="Property" favorites="True"/>
<memberdata name="nimagine1" type="Property" favorites="True"/>
<memberdata name="nimagine2" type="Property" favorites="True"/>
<memberdata name="ntip" type="Property" favorites="True"/>
</VFPData>
*</PropValue>
ADD OBJECT 'explicatie' AS _txbase WITH ;
Anchor = 10, ;
BackStyle = 0, ;
BorderStyle = 0, ;
DisabledBackColor = 255,255,255, ;
DisabledForeColor = 0,0,0, ;
Enabled = .F., ;
FontBold = .T., ;
Height = 21, ;
Left = 33, ;
Name = "explicatie", ;
ReadOnly = .T., ;
SpecialEffect = 1, ;
Top = 0, ;
Width = 375
*< END OBJECT: ClassLib="..\..\clase\_tx_base.vcx" BaseClass="textbox" />
ADD OBJECT 'imagine1' AS _image WITH ;
BackStyle = 0, ;
Left = 1, ;
Name = "imagine1", ;
Top = 2, ;
Visible = .F., ;
Width = 17
*< END OBJECT: ClassLib="..\..\clase\_baza.vcx" BaseClass="image" />
ADD OBJECT 'imagine2' AS _image WITH ;
BackStyle = 0, ;
Left = 18, ;
Name = "imagine2", ;
Top = 2, ;
Width = 17
*< END OBJECT: ClassLib="..\..\clase\_baza.vcx" BaseClass="image" />
ADD OBJECT 'nivel' AS _txbase WITH ;
Alignment = 3, ;
Anchor = 10, ;
ControlSource = "nivel", ;
Enabled = .F., ;
Height = 21, ;
Left = 352, ;
Name = "nivel", ;
ReadOnly = .T., ;
SpecialEffect = 1, ;
Top = 0, ;
Value = 1, ;
Visible = .F., ;
Width = 48
*< END OBJECT: ClassLib="..\..\clase\_tx_base.vcx" BaseClass="textbox" />
PROCEDURE DblClick
This.nodeClick()
ENDPROC
PROCEDURE do_aranjeaza && Aranjeaza obiectele din container in functie de nivel.
lnNivel = This.nivel.Value
This.imagine1.Left = This.nimagine1 + 15 * lnNivel
This.imagine2.Left = This.nimagine2 + 15 * lnNivel
This.explicatie.Left = This.nexplicatie + 15 * lnNivel
ENDPROC
PROCEDURE Init
Lparameters tnTip,tcExplicatie
*!* tnTip
*!* 0 - frunza
*!* 1 - inchis
*!* 2 - deschis
Local lnTip
lnTip = Nvl(tnTip,0)
With This
.ntip = lnTip
.cExplicatie = Iif(Empty(Nvl(tcExplicatie,[])),[explicatie],tcExplicatie)
Do Case
Case .ntip = 2
.imagine1.Picture = [GTV_MINUS.bmp]
.imagine1.Visible = .T.
.imagine2.Picture = [GTV_DESCHIS.bmp]
Case .ntip = 1
.imagine1.Picture = [GTV_PLUS.bmp]
.imagine1.Visible = .T.
.imagine2.Picture = [GTV_INCHIS.bmp]
Otherwise
.imagine2.Picture = [GTV_FRUNZA.bmp]
Endcase
.nimagine1 = .imagine1.Left
.nimagine2 = .imagine2.Left
.nexplicatie = .explicatie.Left
.explicatie.ControlSource = .cExplicatie
Endwith
ENDPROC
PROCEDURE nodeclick
If This.ntip <> 0
This.Parent.Parent.nodeclick()
Endif
ENDPROC
PROCEDURE explicatie.DblClick
This.Parent.nodeClick
ENDPROC
PROCEDURE imagine1.MouseDown
Lparameters nButton, nShift, nXCoord, nYCoord
If nButton=1
This.Parent.nodeClick
Endif
ENDPROC
PROCEDURE imagine2.DblClick
This.Parent.nodeClick
ENDPROC
PROCEDURE nivel.DblClick
This.Parent.nodeclick()
ENDPROC
ENDDEFINE
DEFINE CLASS gridtreeview AS _grdbase OF "..\..\clase\_grd_base.vcx"
*< CLASSDATA: Baseclass="grid" Timestamp="" Scale="Pixels" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="ColumnTV.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="ColumnTV.Text1" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
*m: do_initializeaza
*m: dynamic
*m: nodeclick
*p: cexplicatie && Denumirea campului care contine explicatia.
*p: cid && Denumirea campului care contine id-ul.
*p: crgbbackcolor
*p: cseparator && Caracterul / caracterele folosite ca separator pentru campul tata.
*p: ldeschise && .T. daca toate ramurile sunt deschise, .F. daca sunt inchise
*p: nrecno
*p: _memberdata && XML Metadata for customizable properties
*</DefinedPropArrayMethod>
*<PropValue>
AllowHeaderSizing = .F.
AllowRowSizing = .F.
cexplicatie =
cid =
ColumnCount = 1
crgbbackcolor = 255,255,255
cseparator =
DeleteMark = .F.
FontName = "Arial Narrow"
GridLineColor = 128,128,128
Highlight = .F.
HighlightStyle = 1
Name = "gridtreeview"
nrecno = 0
RecordMark = .F.
_memberdata = <VFPData>
<memberdata name="cexplicatie" type="Property" favorites="True"/>
<memberdata name="cid" type="Property" favorites="True"/>
<memberdata name="cseparator" type="Property" favorites="True"/>
</VFPData>
Column1.FontName = "Arial Narrow"
Column1.Name = "ColumnTV"
Column1.ReadOnly = .T.
Column1.Sparse = .F.
Column1.Width = 150
*</PropValue>
ADD OBJECT 'ColumnTV.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Header1", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'ColumnTV.Text1' AS textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
PROCEDURE AfterRowColChange
Lparameters nColIndex
If Inlist(This.RowColChange,0,1,3)
This.nRecno=Recno(This.RecordSource)
This.Refresh
Endif
ENDPROC
PROCEDURE Destroy
lcCursor = This.RecordSource
If Used(lcCursor)
Select (lcCursor)
Set Filter To
Endif
ENDPROC
PROCEDURE do_initializeaza
*!* daca tlGridSalvat = .F., atunci salvarea se face aici
*!* daca tlGridSalvat = .T., atunci salvarea a fost facuta deja, iar tcCursor trebuie sa aiba o valoare
Lparameters tlGridSalvat,tcCursor
*!* Campuri obligatorii in cursor :
*!* id ( in this.cid )
*!* cheie ( in this.cexplicatie )
*!* nivel
*!* cale ( toata calea de la primul nod pana la tatal nodului actual separate prin this.cseparator )
*!* tip ( 0 = nod , 1 = frunza )
_Screen.LockScreen = .T.
If !tlGridSalvat
lcCursor = This.RecordSource
Else
lcCursor = tcCursor
Endif
lcColoanaExplicatie = [a.]+This.cexplicatie
lcSeparator = This.cseparator
If !tlGridSalvat
save_grid_tag(This)
Endif
Select Alltrim(Nvl(a.cale,''))+lcSeparator As crtordine,a.*,Iif(a.tip=1,"X",Iif(This.ldeschise,"D","N")) As deschis,;
IIF(This.ldeschise,.T.,Iif(a.nivel=1,.T.,.F.)) As vizibil From (lcCursor) a Order By 1 ;
INTO Cursor (lcCursor) Readwrite
Select (lcCursor)
Set Filter To vizibil
Go Top
If !tlGridSalvat
restore_grid_tag(This)
Endif
With This.columntv
.DynamicCurrentControl = ["tip"+ALLTRIM(CHRTRAN(]+lcCursor+[.deschis,"DNX","di"))]
.DynamicBackColor=[this.dynamic()]
Endwith
_Screen.LockScreen = .F.
ENDPROC
PROCEDURE dynamic
With Evaluate("this.columnTV."+ Evaluate(This.columnTV.DynamicCurrentControl))
.do_aranjeaza()
lcRgb = This.Objects(2).DynamicBackColor
*!* If Recno(This.RecordSource)=This.nRecno
*!* lcRgb = [RGB(]+Alltrim(This.crgbbackcolor)+[)]
*!* Else
*!* lcRgb = [Rgb(255,255,255)]
*!* Endif
*!* With .explicatie
*!* .BackColor = &lcRgb
*!* .Refresh()
*!* Endwith
Endwith
Return &lcRgb
ENDPROC
PROCEDURE Init
lcCursor = This.RecordSource
With This.ColumnTv
If Vartype(.text1)="O"
.RemoveObject("text1")
Endif
.AddObject("tip","element",0,This.cexplicatie)
.AddObject("tipi","element",1,This.cexplicatie)
.AddObject("tipd","element",2,This.cexplicatie)
Endwith
ENDPROC
PROCEDURE nodeclick
Local lnTip,lcCheie,lnNivel,lnNivelStop,lnNivelPrec, lnNivelMaxim
lnNivelMaxim = 50
Dimension laVizibil(lnNivelMaxim)
lcColoanaID = This.cid
*!* lcColoanaCheie = This.cexplicatie
*!* lcSeparator = This.cseparator
lnNivelStop = lnNivelMaxim
Select (This.RecordSource)
If !Empty(deschis)
Thisform.LockScreen = .T.
lnId = &lcColoanaID
*!* lcCheie = Lower(Alltrim(cale)+Alltrim(&lcColoanaCheie)+ALLTRIM(lcSeparator)+[*])
lcCheie = LOWER(ALLTRIM(crtordine)+[*])
If deschis = "D"
Replace deschis With "N"
Replace vizibil With .F. For Like(lcCheie,Lower(cale))
Else
Set Filter To
Replace deschis With "D"
laVizibil(nivel+1) = .T.
lnNivelPrec = nivel
Skip
Scan Rest For Like(lcCheie,Lower(cale))
If nivel <= lnNivelStop
lnNivelStop = lnNivelMaxim
If lnNivelPrec > nivel
For i = nivel + 1 To lnNivelPrec
laVizibil(i) = .F.
Endfor
Else
lnNivelPrec = nivel
Endif
Replace vizibil With laVizibil(nivel)
If Alltrim(deschis) = "D"
laVizibil(nivel+1) = .T.
Endif
If Alltrim(deschis) = "N"
lnNivelStop = nivel
Endif
Endif
Endscan
Endif
Set Filter To vizibil
Locate For &lcColoanaID = lnId
This.columnTV.DynamicCurrentControl=This.columnTV.DynamicCurrentControl
This.Refresh
Thisform.LockScreen = .F.
Endif
Release laVizibil
ENDPROC
ENDDEFINE

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,39 @@
[Enero]
Days=01
Day01Tips=D<EFBFBD>a de mi programa
[Febrero]
Days=14
Day14Tips=D<EFBFBD>a de la amistad
[Abril]
Days=17,18
Day17Tips=
Day18Tips=
[Mayo]
Days=01
Day01Tips=
[Julio]
Days=28,29
Day28Tips=Fiestas patrias
Day29Tips=Desfile militar
[Agosto]
Days=30
Day30Tips=Santa Rosa de Lima
[Octubre]
Days=08
Day08Tips=8 Octubre
[Noviembre]
Days=01
Day01Tips=
[Diciembre]
Days=08,25
Day08Tips=Dia de San Guchito
Day25Tips=Navidad!!! ... Nacimiento del ni<6E>o Jes<65>s

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,10 @@
nControls = ASelObj(aObjects)
If nControls = 0
nControls = ASelObj(aObjects, 1)
EndIf
oObject = aObjects(1)
If oObject.Class = "_sbrstatusbar"
Set Classlib To (oObject.ClassLibrary)
oPageProperty = Createobject("_pgeProperty", oObject)
oPageProperty.Show()
EndIf

Binary file not shown.

View File

@@ -0,0 +1,241 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="frmcalendar.scx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS dataenvironment AS dataenvironment
*< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" />
*<PropValue>
DataSource = .NULL.
Height = 0
Left = 0
Name = "Dataenvironment"
Top = 0
Width = 0
*</PropValue>
ENDDEFINE
DEFINE CLASS form1 AS form
*< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Calendar" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="btnOk" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="btnCancel" UniqueID="" Timestamp="" />
*<PropValue>
AutoCenter = .T.
BorderStyle = 2
Caption = "Calendario"
DoCreate = .T.
Height = 200
Icon = calendar.ico
MaxButton = .F.
MinButton = .F.
Name = "Form1"
ShowTips = .T.
Width = 194
*</PropValue>
ADD OBJECT 'btnCancel' AS commandbutton WITH ;
Cancel = .T., ;
Caption = "\<Cancelar", ;
FontName = "MS Sans Serif", ;
Height = 23, ;
Left = 124, ;
Name = "btnCancel", ;
TabIndex = 3, ;
Top = 174, ;
Width = 67
*< END OBJECT: BaseClass="commandbutton" />
ADD OBJECT 'btnOk' AS commandbutton WITH ;
Caption = "\<Aceptar", ;
FontName = "MS Sans Serif", ;
Height = 23, ;
Left = 55, ;
Name = "btnOk", ;
TabIndex = 2, ;
Top = 174, ;
Width = 67
*< END OBJECT: BaseClass="commandbutton" />
ADD OBJECT 'Calendar' AS _calendar WITH ;
date = (Date()), ;
extradayforecolor = sys:15, ;
Height = 172, ;
Left = 1, ;
Name = "Calendar", ;
saturdayforecolor = sys:18, ;
selecteddaybackcolor = sys:13, ;
selecteddayforecolor = sys:14, ;
showholidaytips = .T., ;
Top = -1, ;
Width = 192, ;
shpTitleBar.Name = "shpTitleBar", ;
cusFuncs.Name = "cusFuncs", ;
btnButton_1.btnButton.Name = "btnButton", ;
btnButton_1.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_1.Name = "btnButton_1", ;
btnButton_2.btnButton.Name = "btnButton", ;
btnButton_2.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_2.Name = "btnButton_2", ;
btnButton_3.btnButton.Name = "btnButton", ;
btnButton_3.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_3.Name = "btnButton_3", ;
btnButton_4.btnButton.Name = "btnButton", ;
btnButton_4.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_4.Name = "btnButton_4", ;
btnButton_5.btnButton.Name = "btnButton", ;
btnButton_5.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_5.Name = "btnButton_5", ;
btnButton_6.btnButton.Name = "btnButton", ;
btnButton_6.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_6.Name = "btnButton_6", ;
btnButton_7.btnButton.Name = "btnButton", ;
btnButton_7.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_7.Name = "btnButton_7", ;
btnButton_8.btnButton.Name = "btnButton", ;
btnButton_8.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_8.Name = "btnButton_8", ;
btnButton_9.btnButton.Name = "btnButton", ;
btnButton_9.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_9.Name = "btnButton_9", ;
btnButton_10.btnButton.Name = "btnButton", ;
btnButton_10.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_10.Name = "btnButton_10", ;
btnButton_11.btnButton.Name = "btnButton", ;
btnButton_11.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_11.Name = "btnButton_11", ;
btnButton_12.btnButton.Name = "btnButton", ;
btnButton_12.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_12.Name = "btnButton_12", ;
btnButton_13.btnButton.Name = "btnButton", ;
btnButton_13.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_13.Name = "btnButton_13", ;
btnButton_14.btnButton.Name = "btnButton", ;
btnButton_14.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_14.Name = "btnButton_14", ;
btnButton_15.btnButton.Name = "btnButton", ;
btnButton_15.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_15.Name = "btnButton_15", ;
btnButton_16.btnButton.Name = "btnButton", ;
btnButton_16.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_16.Name = "btnButton_16", ;
btnButton_17.btnButton.Name = "btnButton", ;
btnButton_17.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_17.Name = "btnButton_17", ;
btnButton_18.btnButton.Name = "btnButton", ;
btnButton_18.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_18.Name = "btnButton_18", ;
btnButton_19.btnButton.Name = "btnButton", ;
btnButton_19.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_19.Name = "btnButton_19", ;
btnButton_20.btnButton.Name = "btnButton", ;
btnButton_20.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_20.Name = "btnButton_20", ;
btnButton_21.btnButton.Name = "btnButton", ;
btnButton_21.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_21.Name = "btnButton_21", ;
btnButton_22.btnButton.Name = "btnButton", ;
btnButton_22.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_22.Name = "btnButton_22", ;
btnButton_23.btnButton.Name = "btnButton", ;
btnButton_23.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_23.Name = "btnButton_23", ;
btnButton_24.btnButton.Name = "btnButton", ;
btnButton_24.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_24.Name = "btnButton_24", ;
btnButton_25.btnButton.Name = "btnButton", ;
btnButton_25.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_25.Name = "btnButton_25", ;
btnButton_26.btnButton.Name = "btnButton", ;
btnButton_26.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_26.Name = "btnButton_26", ;
btnButton_27.btnButton.Name = "btnButton", ;
btnButton_27.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_27.Name = "btnButton_27", ;
btnButton_28.btnButton.Name = "btnButton", ;
btnButton_28.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_28.Name = "btnButton_28", ;
btnButton_29.btnButton.Name = "btnButton", ;
btnButton_29.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_29.Name = "btnButton_29", ;
btnButton_30.btnButton.Name = "btnButton", ;
btnButton_30.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_30.Name = "btnButton_30", ;
btnButton_31.btnButton.Name = "btnButton", ;
btnButton_31.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_31.Name = "btnButton_31", ;
btnButton_32.btnButton.Name = "btnButton", ;
btnButton_32.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_32.Name = "btnButton_32", ;
btnButton_33.btnButton.Name = "btnButton", ;
btnButton_33.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_33.Name = "btnButton_33", ;
btnButton_34.btnButton.Name = "btnButton", ;
btnButton_34.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_34.Name = "btnButton_34", ;
btnButton_35.btnButton.Name = "btnButton", ;
btnButton_35.LBLBUTTON.Name = "LBLBUTTON", ;
btnButton_35.Name = "btnButton_35", ;
btnButton_36.btnButton.Name = "btnButton", ;
btnButton_36.lblButton.Name = "lblButton", ;
btnButton_36.Name = "btnButton_36", ;
btnButton_37.btnButton.Name = "btnButton", ;
btnButton_37.lblButton.Name = "lblButton", ;
btnButton_37.Name = "btnButton_37", ;
btnButton_38.btnButton.Name = "btnButton", ;
btnButton_38.lblButton.Name = "lblButton", ;
btnButton_38.Name = "btnButton_38", ;
btnButton_39.btnButton.Name = "btnButton", ;
btnButton_39.lblButton.Name = "lblButton", ;
btnButton_39.Name = "btnButton_39", ;
btnButton_40.btnButton.Name = "btnButton", ;
btnButton_40.lblButton.Name = "lblButton", ;
btnButton_40.Name = "btnButton_40", ;
btnButton_41.btnButton.Name = "btnButton", ;
btnButton_41.lblButton.Name = "lblButton", ;
btnButton_41.Name = "btnButton_41", ;
btnButton_42.btnButton.Name = "btnButton", ;
btnButton_42.lblButton.Name = "lblButton", ;
btnButton_42.Name = "btnButton_42", ;
spnYear.Name = "spnYear", ;
CBOMONTH.Name = "CBOMONTH", ;
lblTitleDay1.Name = "lblTitleDay1", ;
lblTitleDay2.Name = "lblTitleDay2", ;
lblTitleDay3.Name = "lblTitleDay3", ;
lblTitleDay4.Name = "lblTitleDay4", ;
lblTitleDay5.Name = "lblTitleDay5", ;
lblTitleDay6.Name = "lblTitleDay6", ;
lblTitleDay7.Name = "lblTitleDay7", ;
btnNext.Name = "btnNext", ;
btnPrevious.Name = "btnPrevious", ;
shpTodaybar.Name = "shpTodaybar", ;
Label7.Name = "Label7", ;
lblToday.Name = "lblToday", ;
btnToday.Name = "btnToday"
*< END OBJECT: ClassLib="_lproperty.vcx" BaseClass="container" />
PROCEDURE Init
*This.Calendar.Date = Gomonth(Date(), 5)
ENDPROC
PROCEDURE Load
Set Talk off
Set Century Off
ENDPROC
PROCEDURE btnCancel.Click
ThisForm.Release()
ENDPROC
PROCEDURE btnOk.Click
sFecha = Dtoc(ThisForm.Calendar.Date)
MessageBox(sFecha)
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,101 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="frmexample.scx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS dataenvironment AS dataenvironment
*< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Cursor1" UniqueID="" Timestamp="" />
*<PropValue>
DataSource = .NULL.
Height = 200
Left = 1
Name = "Dataenvironment"
Top = 220
Width = 520
*</PropValue>
ADD OBJECT 'Cursor1' AS cursor WITH ;
Alias = "lproperty", ;
CursorSource = lproperty.dbf, ;
Height = 90, ;
Left = 10, ;
Name = "Cursor1", ;
Top = 20, ;
Width = 90
*< END OBJECT: BaseClass="cursor" />
ENDDEFINE
DEFINE CLASS form1 AS form
*< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Listproperty1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Listproperty1.ctnBox.grdList.clmProperty.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Listproperty1.ctnBox.grdList.clmValue.Text1" UniqueID="" Timestamp="" />
*<PropValue>
AllowOutput = .F.
AutoCenter = .T.
BorderStyle = 3
Caption = "Propiedades"
DoCreate = .T.
Height = 444
Name = "form1"
Width = 297
*</PropValue>
ADD OBJECT 'Listproperty1' AS listproperty WITH ;
Anchor = 15, ;
Height = 442, ;
Left = 0, ;
Name = "Listproperty1", ;
Top = 0, ;
Width = 295, ;
ctnBox.btnButton.Name = "btnButton", ;
ctnBox.cboCombo.Name = "cboCombo", ;
ctnBox.ctnSplitter.Name = "ctnSplitter", ;
ctnBox.grdList.clmProperty.ControlSource = "lproperty.property", ;
ctnBox.grdList.clmProperty.Header1.Name = "Header1", ;
ctnBox.grdList.clmProperty.Name = "clmProperty", ;
ctnBox.grdList.clmValue.ControlSource = "lproperty.display", ;
ctnBox.grdList.clmValue.Header1.Name = "Header1", ;
ctnBox.grdList.clmValue.Name = "clmValue", ;
ctnBox.grdList.Name = "grdList", ;
ctnBox.grdList.RecordSource = "lproperty", ;
ctnBox.Name = "ctnBox", ;
ctnBox.txtTextbox.Name = "txtTextbox", ;
cusFuncs.Name = "cusFuncs"
*< END OBJECT: ClassLib="_lproperty.vcx" BaseClass="container" />
ADD OBJECT 'Listproperty1.ctnBox.grdList.clmProperty.Text1' AS textbox WITH ;
BackColor = 192,192,192, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'Listproperty1.ctnBox.grdList.clmValue.Text1' AS textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
PROCEDURE Load
Set Talk Off
Set Deleted On
Set Century On
Set Notify Off
Set Confirm Off
Set Debug Off
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,95 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="lproperty.pjx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
LPARAMETERS tcDir
lcCurdir = SYS(5)+CURDIR()
CD ( EVL( tcDir, JUSTPATH( SYS(16) ) ) )
*<DevInfo>
_Author = ""
_Company = ""
_Address = ""
_City = ""
_State = ""
_PostalCode = ""
_Country = ""
*--
_Comments = ""
_CompanyName = ""
_FileDescription = ""
_LegalCopyright = ""
_LegalTrademark = ""
_ProductName = ""
_MajorVer = ""
_MinorVer = ""
_Revision = ""
_LanguageID = ""
_AutoIncrement = "0"
*</DevInfo>
*<BuildProj>
*<.HomeDir = 'd:\marius\foxpro\listproperty\listproperty' />
FOR EACH loProject IN _VFP.Projects FOXOBJECT
loProject.Close()
ENDFOR
STRTOFILE( '', '__newproject.f2b' )
BUILD PROJECT lProperty.pjx FROM '__newproject.f2b'
FOR EACH loProject IN _VFP.Projects FOXOBJECT
loProject.Close()
ENDFOR
MODIFY PROJECT 'lProperty.pjx' NOWAIT NOSHOW NOPROJECTHOOK
loProject = _VFP.Projects('lProperty.pjx')
WITH loProject.FILES
.ADD('_lproperty.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('archivo1.txt') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('calendar.ico') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('colors.ico') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('frmcalendar.scx') && *< FileMetadata: Type="K" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('frmexample.scx') && *< FileMetadata: Type="K" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" />
.ADD('lproperty.dbf') && *< FileMetadata: Type="D" Cpid="0" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('programa1.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
.ADD('ve_sizeb.cur') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" />
*</BuildProj>
.ITEM('__newproject.f2b').Remove()
*<FileComments>
*</FileComments>
*<ExcludedFiles>
.ITEM("lproperty.dbf").Exclude = .T.
*</ExcludedFiles>
*<TextFiles>
*</TextFiles>
ENDWITH
WITH loProject
*<ProjectProperties>
.SetMain("_lproperty.vcx")
.Debug = .T.
.Encrypted = .F.
*<.CmntStyle = 1 />
*<.NoLogo = .F. />
*<.SaveCode = .T. />
*<.User = '' />
.ProjectHookLibrary = ''
.ProjectHookClass = ''
*</ProjectProperties>
ENDWITH
_VFP.Projects('lProperty.pjx').Close()
*ERASE '__newproject.f2b'
CD (lcCurdir)
RETURN

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,10 @@
colMyCollection=CREATEOBJECT("Collection")
frm1=CREATEOBJECT("Form")
frm2=CREATEOBJECT("Form")
colMyCollection.Add(frm1)
colMyCollection.Add(frm2)
colMyCollection.Add("Item 1")
colMyCollection.Add("Item 2")
colMyCollection.Add("Item 3")
Form1.lstMyList.RowSourceType = 10
Form1.lstMyList.RowSource = "colMyCollection, Caption, Name"

BIN
utile/Menu/PopMenu.zip Normal file

Binary file not shown.

34
utile/Menu/citeste.txt Normal file
View File

@@ -0,0 +1,34 @@
loPop = Newobject("PopMenu", "menutool.vcx")
loPop.Clear
*** Categorii note
lcParentKey = ""
lcKey = Alltrim(Str(NVL(loCategorie.Id, 0)))
lcTitle = Alltrim(loCategorie.nume) + " (" + ALLTRIM(STR(loCategorie.nr_seturi)) + ")"
lcCommand = ""
lcPicture = ""
llEnabled = .T.
lnAddFlag = 0x00
loPop.Add(m.lcParentKey, m.lcKey, m.lcTitle, m.lcCommand, m.lcPicture, m.llEnabled, m.lnAddFlag)
lcKey = lcParentKey + "_" + Alltrim(Str(loSet.Id))
lcTitle = Alltrim(loSet.nume)
lcCommand = ""
lcPicture = ""
llEnabled = .T.
lnAddFlag = 0x00
loPop.Add(m.lcParentKey, m.lcKey, m.lcTitle, m.lcCommand, m.lcPicture, m.llEnabled, m.lnAddFlag)
loPop.nReturn = 1 && Key
loPop.lOwnerDraw = .T.
lcReturnKey = loPop.ShowBy(This)
lcReturnKey = NVL(lcReturnKey, '')
IF !EMPTY(m.lcReturnKey)
lnPos = AT('_', m.lcReturnKey)
IF m.lnPos > 0
lcIdSet = SUBSTR(m.lcReturnKey, m.lnPos + 1)
lnIdSet = VAL(m.lcIdSet)
DO note_fara_predefinire WITH m.lnIdSet IN proceduri.prg
ENDIF
ENDIF

2434
utile/Menu/menutool.vc2 Normal file

File diff suppressed because it is too large Load Diff

1207
utile/Menu/win32api.h Normal file

File diff suppressed because it is too large Load Diff

23
utile/Teste/test.prg Normal file
View File

@@ -0,0 +1,23 @@
lcFile = FORCEEXT(SYS(16),'prg')
lnRows = APROCINFO(laproc,lcFile)
lcProcedures = ""
FOR i = 1 TO lnRows
IF LOWER(laproc[i,3]) = 'procedure'
lcProcedures = lcProcedures + laproc[i,1] + CHR(13) + CHR(10)
ENDIF
ENDFOR
MESSAGEBOX(lcProcedures)
PROCEDURE test1
ENDPROC && test1
PROCEDURE test2
ENDPROC && test2
PROCEDURE test31
ENDPROC && test31

View File

@@ -0,0 +1,298 @@
* test_init_env_auto.prg
* Varianta NEINTERACTIVA a COMUN\programe\test_init_env.prg, pentru rulare headless
* (vfp9.exe -A -T "script.prg") din scripturi de depanare / teste automate.
* Nu are INPUTBOX/xmenu: primeste conexiunea ca parametri si NU lanseaza nimic la final.
*
* Utilizare (dintr-un script apelant, vezi test_repro_cnrcrt_footer.prg):
* DO test_init_env_auto WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola'
* IF gnHandle <= 0 ... eroare conectare
* Mediu de test standard: server CENTRAL, schema MARIUSM_AUTO (parola schemei la MM);
* utilizatorul de aplicatie corespunzator: "MARIUS M" / parola "123" (pentru fluxurile
* care cer login de aplicatie; harness-ul nu trece prin frm_login).
*
* Dupa apel sunt disponibile: goConn/goExecutor/goApp/goLog/goApi, goFirma/goCalendar,
* gnAn/gnLuna/gcS/gnIdFirma etc., SET PATH/CLASSLIB/PROCEDURE ca in roacont.prg,
* pachetele Oracle de sesiune setate (pack_sesiune/pack_contafin).
* ATENTIE: mentine lista de SET CLASSLIB/PROCEDURE sincronizata cu test_init_env.prg.
LPARAMETERS tcHost, tcSchema, tcPassword, tnAn, tnLuna
tcHost = IIF(EMPTY(tcHost), 'CENTRAL', tcHost)
tcSchema = IIF(EMPTY(tcSchema), 'MARIUSM_AUTO', tcSchema)
tcPassword = IIF(EMPTY(tcPassword), 'ROMFASTSOFT', tcPassword)
SET DELETED ON
SET ANSI ON
SET EXACT ON
SET SAFETY OFF
CLOSE DATABASES
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, glEMama, gnIdFirma, gcCondSucursala, ;
gnIdSucursala, gcS, gcFirma, gcUserName, gcNumeProgram, gcAppName, glLunaInchisa, ;
buton, gnButon, pnButon, gl406, gcAcces
CT_SUCCES = 1
CT_INSUCCES = -1
crlf = CHR(13) + CHR(10)
gnAn = IIF(EMPTY(tnAn), YEAR(DATE()), tnAn)
gnLuna = IIF(EMPTY(tnLuna), MONTH(DATE()), tnLuna)
gnIdUtil = -3
gnIdFirma = 110
gcCondSucursala = []
gnIdSucursala = m.gnIdFirma
gcS = UPPER(ALLTRIM(tcSchema))
gcFirma = m.gcS
gcUserName = m.gcS
gcNumeProgram = [ROACONT]
gcAppName = [ROACONT]
glLunaInchisa = .F.
glEMama = .F.
gl406 = .F.
* PUBLIC, nu Declare: acest program se termina cu RETURN, iar nrcrt() (oproceduri_comune.prg)
* citeste NROR din ControlSource-uri de grid mult dupa aceea (in roacont.prg, Declare traieste
* cat programul principal; aici ar muri la RETURN si gridurile si-ar pierde coloanele)
PUBLIC nror(65000)
buton = 1
gnButon = 1
pnButon = 1
LOCAL lcPath
PUBLIC gcAppPath, DIRGEN, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile
gcAppPath = [D:\ROA\ROACONT\]
Set Default To (gcAppPath)
lcPath = gcAppPath + 'Date;' + ;
gcAppPath + 'Include;' + ;
gcAppPath + 'FERESTRE;' + ;
gcAppPath + 'GRAFICE;' + ;
gcAppPath + 'CLASE;' + ;
gcAppPath + 'MENIURI;' + ;
gcAppPath + 'PROGRAME;' + ;
gcAppPath + 'RAPOARTE;' + ;
gcAppPath + 'COMUN\CLASE;' + ;
gcAppPath + 'COMUN\FERESTRE;' + ;
gcAppPath + 'COMUN\PROGRAME;' + ;
gcAppPath + 'COMUN\GRAFICE;' + ;
gcAppPath + 'COMUN\RAPOARTE;' + ;
gcAppPath + 'COMUN\UTILE\CALENDAR;' + ;
gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + ;
gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + ;
gcAppPath + 'COMUN\UTILE\NFJSON;' + ;
gcAppPath + 'COMUN\UTILE\NFXML;' + ;
gcAppPath + 'COMUN\UTILE\EXCEL;' + ;
gcAppPath + 'COMUN\UTILE\GRIDEXTRAS;' + ;
Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2)))+[COMUNROA\]
SET PATH TO &lcPath ADDITIVE
Set Classlib To clase\cont2000 Additive
Set Classlib To appwiz Additive
Set Classlib To CAUT Additive
Set Classlib To BAZA Additive
Set Classlib To contab Additive
Set Classlib To comun Additive
Set Classlib To registry Additive
Set Classlib To cauta_alfa_forms.vcx Additive
Set Classlib To obalanta Additive
Set Classlib To ocriterii.vcx Additive
Set Classlib To ctl32_statusbar.vcx Additive
Set Classlib To ctl32_common.vcx Additive
Set Classlib To ctl32_structs.vcx Additive
Set Classlib To ctl32_progressbar.vcx Additive
Set Procedure To PROCEDURI Additive
Set Procedure To pmenu Additive
Set Procedure To proceduri_comune Additive
Set Procedure To mesaje Additive
Set Procedure To acces_meniu Additive
Set Procedure To quitapp Additive
Set Procedure To init_program Additive
Set Procedure To oproceduri_maintenance.PRG Additive
Set Procedure To gridproc Additive
Set Procedure To proceduri_excel Additive
Set Procedure To oserii_numere.PRG Additive
Set Procedure To cauta_alfa Additive
Set Procedure To oproceduri_parteneri Additive
Set Procedure To oproceduri_incasari Additive
Set Procedure To wwconfig Additive
Set Procedure To oexport Additive
SET PROCEDURE TO ocasabanca ADDITIVE
SET PROCEDURE TO importfromxlsx ADDITIVE
SET PROCEDURE TO appendfromxlsx.prg ADDITIVE
SET PROCEDURE TO overificari.prg ADDITIVE
SET PROCEDURE TO onomenclatoare.prg ADDITIVE
SET PROCEDURE TO excelxml.prg ADDITIVE
SET PROCEDURE TO saft_d406.prg ADDITIVE
Set Classlib To DECABAZA Additive
Set Classlib To onomenclatoare Additive
Set Classlib To oparteneri Additive
Set Classlib To OCASABANCA Additive
Set Classlib To OVANZCUMP Additive
Set Classlib To oCompensari Additive
Set Classlib To oRapoarte_cont Additive
Set Classlib To oSit_Op Additive
Set Classlib To overificari Additive
Set Classlib To oteste Additive
Set Classlib To omodificari Additive
Set Classlib To ooptiuni Additive
Set Classlib To ointroduceri_cont Additive
Set Classlib To onote_contabile Additive
Set Classlib To odebcred Additive
Set Classlib To ferestre_oracle Additive
Set Classlib To caut_ora Additive
Set Classlib To otoolbar Additive
Set Classlib To inchideri_sal Additive
Set Classlib To serii_numere Additive
Set Classlib To contabilitate_rapoarte Additive
Set Classlib To oconversii Additive
Set Classlib To oactualizari Additive
Set Classlib To anaf_efactura Additive
Set Classlib To Messagebox Additive
SET CLASSLIB TO wwdialogs ADDITIVE
SET CLASSLIB TO orapoarte.vcx additive
SET CLASSLIB TO orapoarte_contabilitate.vcx additive
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET CLASSLIB TO _calendar.vcx ADDITIVE
SET CLASSLIB TO orapoarte_comun.vcx ADDITIVE
SET CLASSLIB TO saft_d406.vcx ADDITIVE
Set Procedure To GENCURSOR.PRG Additive
Set Procedure To OPROCEDURI_COMUNE.PRG Additive
Set Procedure To OINIT_OPTIUNI.PRG Additive
Set Procedure To updateserver.PRG Additive
Set Procedure To oCompensari.PRG Additive
Set Procedure To oSituatii_Operative.PRG Additive
Set Procedure To oOperatii_comune.PRG Additive
Set Procedure To OCONT2003.PRG Additive
Set Procedure To OPROCEDURI_aMS.PRG Additive
Set Procedure To oparteneri.PRG Additive
Set Procedure To orapoarte.PRG Additive
Set Procedure To orap_trezorerie Additive
Set Procedure To ocautare Additive
Set Procedure To omeniu_initializari Additive
Set Procedure To osecurity Additive
Set Procedure To oheader Additive
Set Procedure To orefaceri Additive
Set Procedure To oproceduri_casademarcat Additive
Set Procedure To controllerecr Additive
Set Procedure To oproceduri_comune_imob.PRG Additive
Set Procedure To oproceduri_conversie.PRG Additive
Set Procedure To odocumente.PRG Additive
Set Procedure To oproceduri_actualizari.PRG Additive
SET PROCEDURE TO orapoarte_dinamice.prg additive
SET PROCEDURE TO update_imob.prg ADDITIVE
SET PROCEDURE TO oproceduri_import.prg ADDITIVE
Set Procedure To wwutils.PRG Additive
Set Procedure To wwxmlhttp.PRG Additive
Set Procedure To ini.PRG Additive
Set Procedure To regex.PRG Additive
Set Procedure To validare.PRG Additive
Set Procedure To oproceduri_evolutie Additive
Set Procedure To oproceduri_decont Additive
Set Procedure To proceduri_rapoarte.PRG Additive
SET PROCEDURE TO anaf_efactura.prg ADDITIVE
SET PROCEDURE TO iniacces.prg ADDITIVE
SET PROCEDURE TO oupdate.prg additive
SET PROCEDURE TO procese.prg additive
SET PROCEDURE TO version.prg additive
SET PROCEDURE TO xmlaccess.prg additive
SET PROCEDURE TO xmlparser.prg additive
SET PROCEDURE TO filebringer.prg additive
SET PROCEDURE TO wwcodeupdate.prg additive
SET PROCEDURE TO wwhttp.prg ADDITIVE
SET PROCEDURE TO wwapi.prg ADDITIVE
Declare Integer GetPrivateProfileString In WIN32API ;
string, String, String, String @, Integer, String
Declare Integer WritePrivateProfileString In Win32Api ;
string, String, String, String
Declare Integer CopyFile In WIN32API ;
STRING lpExistingFileName, STRING lpNewFileName, INTEGER bFailIfExists
Declare Integer PathFileExists In shlwapi STRING pszPath
If Type('goApi') = 'U'
Public goApi
goApi = Newobject("wwAPI", "wwAPI.prg")
ENDIF
set procedure to oinit_optiuni.prg additive
set procedure to oproceduri_comune.prg additive
PUBLIC gnHandle, goExecutor, goConn, goFirma, goCalendar, poLog, goLog, goApp
DIRGEN = [D:\ROA\]
gcBasePath = dirgen
gcGeneralIniFile = DIRGEN + "settings.ini"
gcSettingsFile = m.gcGeneralIniFile
gcTempPath = Addbs(shortpath(goApi.GetTempPath())) + gcS + [\]
If !Directory(gcTempPath)
Md (gcTempPath)
Endif
gcAcces = [1;2;3;4;5;6;7;8;]
poLog = Newobject("Log_Mesaje","Log_Mesaje.prg")
goLog = poLog
goApp = Createobject("wzApplication")
gnHandle = 0
goExecutor = createobject("oExecutor")
goConn = createobject("oConn")
goConn.Connect(m.tcHost, m.tcSchema, m.tcPassword)
IF m.gnHandle <= 0
RETURN .F.
ENDIF
LOCAL llSucces, lcSql
goFirma = null
llSucces = goExecutor.oExecuta("select * from syn_v_nom_firme where schema = ?gcS", "cFirma")
IF m.llSucces
SELECT cFirma
gnIdFirma = id_firma
gnIdSucursala = null
gcFirma = ALLTRIM(firma)
SCATTER NAME goFirma
ELSE
goFirma = CREATEOBJECT('custom')
goFirma.addproperty('cod_fiscal', '')
goFirma.addproperty('schema', m.gcS)
goFirma.addproperty('firma', m.gcS)
ENDIF
USE IN (SELECT('cFirma'))
goCalendar = null
llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = (select MAX(an*12+luna) FROM calendar)', 'cCalendar')
IF m.llSucces
SELECT cCalendar
GO TOP
IF EMPTY(m.tnAn)
gnAn = anul
gnLuna = luna
ENDIF
SCATTER NAME goCalendar
ENDIF
USE IN (SELECT('cCalendar'))
CREATE CURSOR dual (dummy c(10))
INSERT INTO dual (dummy) VALUES ("")
actualizeaza_optiuni()
Do optiuni_firma IN oinit_optiuni.prg
lcSql = [begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.setluna(?gnLuna); pack_sesiune.setan(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.setlunabal(?gnLuna); pack_sesiune.setanbal(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.SET_DATA_RON(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.set_data_ron(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_firma(?gnIdFirma); end;]
llSucces = goExecutor.oExecuta(lcSql)
RETURN .T.

View File

@@ -0,0 +1,125 @@
* test_repro_cnrcrt_footer.prg
* Repro/regresie pentru eroarea "Property CNRCRT is not found" din
* FRM_MODIFIC2024.PGFARTICOLE.PAGE1._GRDFOOTER1.CALCTOTAL
* (Import extrase bancare > Generare note, ROACONT 2.11.61, 15.07.2026).
*
* Cauza (dovedita prin bisectie, vezi COMUN\docs\depanare_testare_vfp.md):
* - frm_import_extrase_banca.modificanote crea crsJTVATemp prin
* SELECT * INTO CURSOR (copia pierde indexul TAG id_jtva creat de update_jtva_coloane);
* - coloana cExplicatieTVA din frm_modific2024.grdRulaje face Seek pe acel tag in ControlSource;
* - dupa repararea typo-ului oMinHeaderHeight->nMinHeaderHeight in cusfonthandler
* (accessibility.vcx, r17869), ApplyFontToGrid atinge coloanele la Init;
* evaluarea ControlSource-ului cu Seek pe tag inexistent face grid-ul sa-si piarda
* TOATE coloanele => footer-ul se ataseaza la 0 coloane => calctotal crapa la
* Getpem(This, cColWithLabel).
*
* Rulare headless (nu tine VFP IDE deschis; nu rula cu roacont.exe pornit):
* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ;
* "D:\ROA\ROACONT\COMUN\utile\Teste\test_repro_cnrcrt_footer.prg" [MOD]
* MOD:
* CUINDEX (implicit) - fluxul corectat (index pe crsJTVATemp). Asteptat: 63 coloane, OK.
* FARAINDEX - fluxul vechi, fara index. Asteptat: 0 coloane + eroarea CNRCRT
* (reproduce bug-ul; util ca test de regresie al capcanei).
* Rezultatul se scrie in %TEMP%\test_repro_cnrcrt_footer.txt, ultima linie REZULTAT: OK/BUG.
LPARAMETERS tcMode
tcMode = IIF(EMPTY(tcMode), 'CUINDEX', UPPER(ALLTRIM(tcMode)))
PUBLIC gcLogFile, gnErrCNRCRT
gcLogFile = ADDBS(SYS(2023)) + 'test_repro_cnrcrt_footer.txt'
gnErrCNRCRT = 0
STRTOFILE('START ' + tcMode + ' ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLogFile)
ON ERROR DO ReproErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO ReproLog WITH 'EROARE: conectare Oracle esuata'
DO ReproLog WITH 'REZULTAT: NEDETERMINAT'
QUIT
ENDIF
DO ReproLog WITH 'mediu OK, gnAn=' + TRANSFORM(gnAn) + ' luna=' + TRANSFORM(gnLuna)
* ===== replicare modificanote din frm_import_extrase_banca (partea non-UI) =====
IF !Used('saft_taxtable')
update_saft_taxtable()
ENDIF
IF !Used('saft_mecanisme_plati')
update_saft_mecanisme_plati()
ENDIF
update_jtva_coloane("JV", 'crsExplicatiiTVATemp', 1)
SELECT * FROM crsExplicatiiTVATemp INTO CURSOR crsJTVATemp READWRITE
IF tcMode == 'CUINDEX'
* fix-ul din modificanote (15.07.2026): copia SELECT INTO pierde indexul
SELECT crsJTVATemp
INDEX ON id_jtva_coloana TAG id_jtva
ENDIF
LOCAL llSucces, lcSql
lcSql = [SELECT * FROM vact WHERE 1=2]
llSucces = goExecutor.oExecuta(m.lcSql, 'actactan_temp')
lcSql = [select * from vrul_tot where 1=2]
llSucces = goExecutor.oExecuta(lcSql, 'v_rul')
Select *, valoare + valtva As valoarectva, valoarev + valtvav As valoarevctva From v_rul Into Cursor trul READWRITE
Use In (SELECT('v_rul'))
lcSql = [select * from vrul_obinv_tot where 1=2]
llSucces = goExecutor.oExecuta(lcSql, 'v_rul_obinv')
Select *, valoare + valtva As valoarectva, valoarev + valtvav As valoarevctva From v_rul_obinv Into Cursor trul_obinv READWRITE
Use In (SELECT('v_rul_obinv'))
Select actactan_temp
Select .F. As ales, a.explicatia4 As iban, Iif(!Empty(Nvl(a.id_jtva_coloana, 0)), 1, 0) As Cu_tva, ;
Cast(0 As N(2)) As tipnota, a.*, b.denumire As explicatie_tva_2 ;
From actactan_temp a Left Join crsExplicatiiTVATemp b On a.id_jtva_coloana = b.id_jtva_coloana ;
Into Cursor tact Readwrite
gcAcces = "1;2;3;4;"
Select tact
Go Top
* ===== forma reala + secventa relevanta din Show =====
LOCAL loForm, i, lcNames, lnColSrc, lnColFooter
loForm = CREATEOBJECT([frm_modific2024], 90023, .T.)
IF VARTYPE(loForm) <> 'O'
DO ReproLog WITH 'EROARE: frm_modific2024 nu s-a instantiat'
DO ReproLog WITH 'REZULTAT: NEDETERMINAT'
QUIT
ENDIF
Select tact
loForm.grid1.SetFocus
loForm.gridextra1.setup()
loForm.CalculeazaTotal()
lnColSrc = loForm.pgfArticole.Page1.grdRulaje.ColumnCount
DO ReproLog WITH 'grdRulaje coloane: ' + TRANSFORM(lnColSrc)
loForm.pgfArticole.page1._grdfooter1.attachtogrid(loForm.pgfArticole.page1.grdRulaje)
lnColFooter = loForm.pgfArticole.Page1._grdfooter1.ColumnCount
DO ReproLog WITH 'footer coloane dupa attach: ' + TRANSFORM(lnColFooter)
loForm.pgfArticole.page1._grdfooter1.calcTotal()
loForm.pgfArticole.page2._grdfooter1.attachtogrid(loForm.pgfArticole.page2.grdRulajeObinv)
loForm.pgfArticole.page2._grdfooter1.calcTotal()
loForm.Release()
IF m.lnColSrc > 0 AND m.gnErrCNRCRT = 0
DO ReproLog WITH 'REZULTAT: OK'
ELSE
DO ReproLog WITH 'REZULTAT: BUG (coloane pierdute sau eroare CNRCRT)'
ENDIF
QUIT
PROCEDURE ReproErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
IF 'CNRCRT' $ UPPER(tcMsg)
gnErrCNRCRT = gnErrCNRCRT + 1
ENDIF
DO ReproLog WITH 'ERR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE ReproLog
LPARAMETERS tcMsg
LOCAL lcL
lcL = FILETOSTR(gcLogFile)
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcLogFile)
ENDPROC

View File

@@ -0,0 +1,172 @@
*** TESTE
CRLF = CHR(13) + CHR(10)
CTAB = CHR(9)
gcTestMessage = ""
gcHost = "jcsserver"
gcUser = "mariusm_auto"
gcPassword = "123"
gnHandle = 0
*!* FACTURA
lnCodF = 1105748
lnLunaF = 8
lnAnF = 2006
lnIdFactF = 5006097
*!* INCASARE
lnCodI = 1105749
lnLunaI = 8
lnAnI = 2006
lnIdFactI = 5006097
lnIdFactPI = 5006097
SET PROCEDURE TO D:\ROA_RB\ROACONT\COMUN\programe\odocumente ADDITIVE
SET PROCEDURE TO D:\ROA_RB\ROACONT\COMUN\programe\oproceduri_comune.prg ADDITIVE
goExecutor = CREATEOBJECT("oExecutor")
goConn = CREATEOBJECT("oConn")
loMyTests = CREATEOBJECT("MyTests")
loMyTests.teste()
DEFINE CLASS MyTests AS CUSTOM
***==================================================
PROCEDURE teste
LOCAL lcFile, lnRows, lcProcedure,i
lcFile = FORCEEXT(SYS(16),'prg')
IF ATC('PROCEDURE', lcFile) > 0
lcFile = SUBSTR(lcFile, AT(':', lcFile)-1)
ENDIF
IF !FILE(lcFile)
this.appendMessage("Error", 'Nu exista fisierul ' + lcFile)
MESSAGEBOX(gcTestMessage)
RETURN
ENDIF
lnRows = APROCINFO(laproc,lcFile)
lcProcedure = ""
gnHandle = this.initializare(gcHost, gcUser, gcPassword)
lcTestFile = SYS(16)
IF gnHandle > 0
FOR i = 1 TO lnRows
lcProcedure = laProc[i,1]
IF AT('.', lcProcedure) > 0
lcProcedure = SUBSTR(lcProcedure, AT('.', lcProcedure) + 1)
ENDIF
IF LOWER(laproc[i,3]) <> 'procedure' OR LEFT(LOWER(lcProcedure), 5) <> 'test_'
LOOP
ENDIF
lnSucces = THIS.&lcProcedure.()
ENDFOR
*!* lnSucces = this.test_referintedocumentenota()
*!* lnSucces = this.test_referintedocument()
ENDIF
lnSucces = this.curatare(gnHandle)
MESSAGEBOX(gcTestMessage)
ENDPROC && teste
***==================================================
FUNCTION initializare
LPARAMETERS tcHost, tcUser, tcPassword
LOCAL lnHandle
lnHandle = goConn.connect(tcHost, tcUser, tcPassword)
IF lnHandle <= 0
this.appendMessage("Error","Nu s-a realizat conexiunea")
ELSE
this.appendMessage("Succes","S-a realizat conexiunea")
ENDIF
RETURN lnHandle
ENDFUNC && initializare
FUNCTION Error(nError,cMethod,nLine)
LOCAL lcError
lcError = MESSAGE() + ';' + TRANSFORM(nError) + ';' + cMethod + ';' + ';' + TRANSFORM(nLine)
DEBUG
SUSPEND
this.appendMessage("Error",lcError)
ENDFUNC && Error
***==================================================
FUNCTION curatare
LPARAMETERS tnHandle
LOCAL lnSucces
lnSucces = 1
IF tnHandle > 0
lnSucces = SQLDISCONNECT(tnHandle)
ENDIF
IF lnSucces <= 0
this.appendMessage("Error","Nu s-a inchis conexiunea")
ELSE
this.appendMessage("Succes","S-a inchis conexiunea")
ENDIF
RETURN lnSucces
ENDFUNC && curatare
***==================================================
PROCEDURE Verifica
LPARAMETERS tuValue1, tuValue2, tcTest, tcMessage
IF tuValue1 <> tuValue2
this.appendMessage("Error",tcTest + ";" + tcMessage)
ELSE
this.appendMessage("Succes",tcTest + ";")
ENDIF
ENDPROC && verifica
PROCEDURE appendMessage
LPARAMETERS tcResult, tcMessage
gcTestMessage = gcTestMessage + tcResult + CTAB + tcMessage + CRLF
_CLIPTEXT = gcTestMessage
ENDPROC
***==================================================
FUNCTION test_referintedocumentenota
LOCAL lnSucces
*!* verific o nota de factura cu referinte
llReferinteDocumente = ReferinteDocumenteNota(lnAnF, lnLunaF, lnCodF) && && odocumente.prg
this.Verifica(llReferinteDocumente, .T., "test_referintedocumentenota-1", "Documentul are referinte")
*!* verific o nota de incasare fara referinte
llReferinteDocumente = ReferinteDocumenteNota(lnAnI, lnLunaI, lnCodI) && && odocumente.prg
this.Verifica(llReferinteDocumente, .F., "test_referintedocumentenota-2", "Documentul nu are referinte")
ENDFUNC && test_referintedocument
***==================================================
FUNCTION test_referintedocument
LOCAL lnSucces
*!* verific un id_fact cu referinte
llReferinteDocumente = ReferinteDocument(lnAnF, lnLunaF, lnCodF, lnIdFactF) && && odocumente.prg
this.Verifica(llReferinteDocumente, .T., "test_referintedocument-1", "Documentul are referinte")
*!* verific un id_fact fara referinte
llReferinteDocumente = ReferinteDocument(lnAnI, lnLunaI, lnCodI, lnIdFactI) && && odocumente.prg
this.Verifica(llReferinteDocumente, .F., "test_referintedocument-2", "Documentul nu are referinte")
ENDFUNC && test_referintedocument
ENDDEFINE

1710
utile/calendar/_calendar.vc2 Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 707 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

42
utile/chatbot/CLAUDE.md Normal file
View File

@@ -0,0 +1,42 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is a single-file chatbot application for Romfast technical support. The project consists of a standalone HTML file (`chatbot_maria.html`) that implements a full-featured chatbot interface using the Flowise embed library.
## Architecture
The chatbot integrates with a Flowise API backend hosted at `https://mutual-special-koala.ngrok-free.app` using chatflow ID `d4911620-07fe-41f8-adb4-f2f52d6ec766`.
Key architectural components:
- **Flowise Integration**: Uses the Flowise embed library from CDN for the main chatbot functionality
- **Direct API Mode**: Supports URL parameter-based message handling that bypasses the chat interface and displays responses in a modal overlay
- **Dual Display Modes**:
- Standard chatbot widget with starter prompts
- Direct API response modal when `?message=` URL parameter is present
## Key Features
- **Maria ChatBot**: Romanian language technical support assistant for Romfast ROA system
- **URL Parameter Support**: Can accept initial messages via `?message=` URL parameter
- **Conditional UI**: Hides starter prompts when a direct message is provided
- **Chat History**: Saves conversation history to localStorage when transitioning from API mode to chat mode
- **Responsive Design**: Mobile-friendly layout with collapsible menu
## Configuration
The chatbot configuration is embedded in the JavaScript module:
- API Host: `https://mutual-special-koala.ngrok-free.app`
- Chatflow ID: `d4911620-07fe-41f8-adb4-f2f52d6ec766`
- Romanian language interface with predefined starter prompts about eFactura, SAFT declarations, and auto service workflows
## Development Notes
This is a static HTML file with no build process. To modify:
1. Edit `chatbot_maria.html` directly
2. Test by opening in a browser
3. For URL parameter testing, use format: `chatbot_maria.html?message=your%20message%20here`
The application handles two distinct user flows based on URL parameters, switching between embedded chatbot widget and full-screen API response modal.

128
utile/chatbot/README.md Normal file
View File

@@ -0,0 +1,128 @@
# Chatbot Maria - Romfast Support
Un chatbot de suport tehnic pentru sistemul ROA, construit cu Flowise embed.
## Funcționalități
- **Chatbot integrat**: Interface de chat folosind Flowise embed library
- **Suport pentru URL parametri**: Permite trimiterea directă a mesajelor prin URL
- **Două moduri de afișare**:
- Chat widget standard cu prompt-uri predefinite
- Modal de răspuns direct pentru mesaje din URL
- **Gestionare robustă a caracterelor speciale**: Suport pentru URL-uri cu secvențe de encoding problematice
## Testare
### 1. Test de bază
Deschide fișierul direct în browser:
```
chatbot_maria.html
```
### 2. Test cu mesaj din URL
Testează funcția de mesaj direct prin URL:
```
chatbot_maria.html?message=Cum%20se%20actualizeaza%20tokenul%20eFactura?
```
### 3. Test cu caractere speciale
Testează cu mesaje care conțin caractere speciale (cazul problematic):
```
chatbot_maria.html?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori
```
### 4. Debugging în Browser
Pentru a vedea ce se întâmplă în timpul testării:
1. **Deschide Developer Tools**: F12 în browser
2. **Mergi la tab-ul Console**
3. **Încarcă pagina cu parametrul URL**
4. **Monitorizează log-urile**:
- `"Parametru decodat cu URLSearchParams:"` - prima încercare
- `"Valoare brută din URL (fallback):"` - dacă URLSearchParams nu funcționează
- `"Parametru decodat cu metoda sigură:"` - rezultatul final
- `"Se trimite mesajul direct prin API:"` - confirmă că mesajul e trimis
- `"Status răspuns:"` - codul de răspuns al API-ului
- `"Răspuns primit de la API:"` - răspunsul de la chatbot
### 5. Verificare Funcționalitate
**Testul a reușit dacă**:
- ✅ Nu vezi erori "URI malformed" în console
- ✅ Vezi mesajul decodat în console
- ✅ Vezi "Se trimite mesajul direct prin API"
- ✅ Vezi răspunsul API în modal
**Semnale de probleme**:
- ❌ "Eroare la decodarea parametrului URL"
- ❌ "URI malformed"
- ❌ Pagina nu afișează nimic
- ❌ Request-ul API eșuează cu timeout
### 6. Testare Offline
Poți testa funcțiile de decodificare fără server:
1. **Deschide Developer Tools** (F12)
2. **Mergi la tab-ul Console**
3. **Testează manual funcțiile**:
```javascript
// Test URLSearchParams
const urlParams = new URLSearchParams("?message=test%20cu%20caractere%20speciale");
console.log(urlParams.get('message'));
// Test cu URL problematic
const problematicUrl = "?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori";
const testParams = new URLSearchParams(problematicUrl);
console.log(testParams.get('message'));
```
## Configurare API
Chatbot-ul se conectează la:
- **API Host**: `https://mutual-special-koala.ngrok-free.app`
- **Chatflow ID**: `d4911620-07fe-41f8-adb4-f2f52d6ec766`
Pentru modificare, editează valorile în secțiunea JavaScript:
```javascript
const apiHost = "https://mutual-special-koala.ngrok-free.app";
const chatflowId = "d4911620-07fe-41f8-adb4-f2f52d6ec766";
```
## Troubleshooting
### Problema: "URI malformed"
**Soluție**: Implementarea actuală gestionează automat această problemă prin decodificare sigură chunk-by-chunk.
### Problema: API nu răspunde
**Verificări**:
1. API host-ul este accesibil
2. Chatflow ID-ul este corect
3. Conexiunea la internet funcționează
4. Nu sunt blocate request-urile CORS
### Problema: Pagina nu se încarcă
**Verificări**:
1. Fișierul HTML este valid
2. CDN-ul Flowise este accesibil: `https://cdn.jsdelivr.net/npm/flowise-embed/dist/web.js`
3. Nu sunt erori JavaScript în console
### Problema: Mesajul nu se trimite
**Verificări**:
1. Parametrul URL este corect
2. Mesajul nu este gol după decodificare
3. API-ul acceptă request-ul
4. Nu sunt erori de timeout (30 secunde)
## Prompt-uri Predefinite
Chatbot-ul afișează următoarele prompt-uri standard când nu este specificat un mesaj în URL:
- Cum se actualizeaza tokenul eFactura?
- Cand se completeaza codul de plata pentru declaratia SAFT?
- Care sunt pasii pentru emiterea unei facturi service auto?
- Cum se valideaza o comanda service auto?
- Cum se deschide o comanda service auto?
- Cum se modifica datele initiale ale unei comenzi service auto?

View File

@@ -0,0 +1,374 @@
{
"nodes": [
{
"id": "groqChat_0",
"position": {
"x": -853.9751777873863,
"y": 729.9149966558168
},
"type": "customNode",
"data": {
"id": "groqChat_0",
"label": "GroqChat",
"version": 3,
"name": "groqChat",
"type": "GroqChat",
"baseClasses": [
"GroqChat",
"BaseChatModel",
"BaseLanguageModel",
"Runnable"
],
"category": "Chat Models",
"description": "Wrapper around Groq API with LPU Inference Engine",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": [
"groqApi"
],
"optional": true,
"id": "groqChat_0-input-credential-credential"
},
{
"label": "Model Name",
"name": "modelName",
"type": "asyncOptions",
"loadMethod": "listModels",
"placeholder": "llama3-70b-8192",
"id": "groqChat_0-input-modelName-asyncOptions"
},
{
"label": "Temperature",
"name": "temperature",
"type": "number",
"step": 0.1,
"default": 0.9,
"optional": true,
"id": "groqChat_0-input-temperature-number"
}
],
"inputAnchors": [
{
"label": "Cache",
"name": "cache",
"type": "BaseCache",
"optional": true,
"id": "groqChat_0-input-cache-BaseCache"
}
],
"inputs": {
"cache": "",
"modelName": "meta-llama/llama-4-scout-17b-16e-instruct",
"temperature": "0.3"
},
"outputAnchors": [
{
"id": "groqChat_0-output-groqChat-GroqChat|BaseChatModel|BaseLanguageModel|Runnable",
"name": "groqChat",
"label": "GroqChat",
"description": "Wrapper around Groq API with LPU Inference Engine",
"type": "GroqChat | BaseChatModel | BaseLanguageModel | Runnable"
}
],
"outputs": {},
"selected": false
},
"width": 300,
"height": 521,
"selected": false,
"positionAbsolute": {
"x": -853.9751777873863,
"y": 729.9149966558168
},
"dragging": false
},
{
"id": "bufferWindowMemory_0",
"position": {
"x": -462.951092583539,
"y": 592.4237789688921
},
"type": "customNode",
"data": {
"id": "bufferWindowMemory_0",
"label": "Buffer Window Memory",
"version": 2,
"name": "bufferWindowMemory",
"type": "BufferWindowMemory",
"baseClasses": [
"BufferWindowMemory",
"BaseChatMemory",
"BaseMemory"
],
"category": "Memory",
"description": "Uses a window of size k to surface the last k back-and-forth to use as memory",
"inputParams": [
{
"label": "Size",
"name": "k",
"type": "number",
"default": "4",
"description": "Window of size k to surface the last k back-and-forth to use as memory.",
"id": "bufferWindowMemory_0-input-k-number"
},
{
"label": "Session Id",
"name": "sessionId",
"type": "string",
"description": "If not specified, a random id will be used. Learn <a target=\"_blank\" href=\"https://docs.flowiseai.com/memory#ui-and-embedded-chat\">more</a>",
"default": "",
"optional": true,
"additionalParams": true,
"id": "bufferWindowMemory_0-input-sessionId-string"
},
{
"label": "Memory Key",
"name": "memoryKey",
"type": "string",
"default": "chat_history",
"additionalParams": true,
"id": "bufferWindowMemory_0-input-memoryKey-string"
}
],
"inputAnchors": [],
"inputs": {
"k": "5",
"sessionId": "",
"memoryKey": "chat_history"
},
"outputAnchors": [
{
"id": "bufferWindowMemory_0-output-bufferWindowMemory-BufferWindowMemory|BaseChatMemory|BaseMemory",
"name": "bufferWindowMemory",
"label": "BufferWindowMemory",
"description": "Uses a window of size k to surface the last k back-and-forth to use as memory",
"type": "BufferWindowMemory | BaseChatMemory | BaseMemory"
}
],
"outputs": {},
"selected": false
},
"width": 300,
"height": 331,
"positionAbsolute": {
"x": -462.951092583539,
"y": 592.4237789688921
},
"selected": false,
"dragging": false
},
{
"id": "documentStoreVS_0",
"position": {
"x": -502.4400397551632,
"y": 1058.8723425753983
},
"type": "customNode",
"data": {
"id": "documentStoreVS_0",
"label": "Document Store (Vector)",
"version": 1,
"name": "documentStoreVS",
"type": "DocumentStoreVS",
"baseClasses": [
"DocumentStoreVS"
],
"category": "Vector Stores",
"description": "Search and retrieve documents from Document Store",
"inputParams": [
{
"label": "Select Store",
"name": "selectedStore",
"type": "asyncOptions",
"loadMethod": "listStores",
"id": "documentStoreVS_0-input-selectedStore-asyncOptions"
}
],
"inputAnchors": [],
"inputs": {
"selectedStore": "ed308d4d-bb05-480c-b399-d17edf5c0302"
},
"outputAnchors": [
{
"name": "output",
"label": "Output",
"type": "options",
"description": "",
"options": [
{
"id": "documentStoreVS_0-output-retriever-BaseRetriever",
"name": "retriever",
"label": "Retriever",
"description": "",
"type": "BaseRetriever"
},
{
"id": "documentStoreVS_0-output-vectorStore-VectorStore",
"name": "vectorStore",
"label": "Vector Store",
"description": "",
"type": "VectorStore"
}
],
"default": "retriever"
}
],
"outputs": {
"output": "retriever"
},
"selected": false
},
"width": 300,
"height": 312,
"positionAbsolute": {
"x": -502.4400397551632,
"y": 1058.8723425753983
},
"selected": false,
"dragging": false
},
{
"id": "conversationalRetrievalQAChain_0",
"position": {
"x": -74.84182984134901,
"y": 846.5506790761656
},
"type": "customNode",
"data": {
"id": "conversationalRetrievalQAChain_0",
"label": "Conversational Retrieval QA Chain",
"version": 3,
"name": "conversationalRetrievalQAChain",
"type": "ConversationalRetrievalQAChain",
"baseClasses": [
"ConversationalRetrievalQAChain",
"BaseChain",
"Runnable"
],
"category": "Chains",
"description": "Document QA - built on RetrievalQAChain to provide a chat history component",
"inputParams": [
{
"label": "Return Source Documents",
"name": "returnSourceDocuments",
"type": "boolean",
"optional": true,
"id": "conversationalRetrievalQAChain_0-input-returnSourceDocuments-boolean"
},
{
"label": "Rephrase Prompt",
"name": "rephrasePrompt",
"type": "string",
"description": "Using previous chat history, rephrase question into a standalone question",
"warning": "Prompt must include input variables: {chat_history} and {question}",
"rows": 4,
"additionalParams": true,
"optional": true,
"default": "Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question.\n\nChat History:\n{chat_history}\nFollow Up Input: {question}\nStandalone Question:",
"id": "conversationalRetrievalQAChain_0-input-rephrasePrompt-string"
},
{
"label": "Response Prompt",
"name": "responsePrompt",
"type": "string",
"description": "Taking the rephrased question, search for answer from the provided context",
"warning": "Prompt must include input variable: {context}",
"rows": 4,
"additionalParams": true,
"optional": true,
"default": "I want you to act as a document that I am having a conversation with. Your name is \"AI Assistant\". Using the provided context, answer the user's question to the best of your ability using the resources provided.\nIf there is nothing in the context relevant to the question at hand, just say \"Hmm, I'm not sure\" and stop after that. Refuse to answer any question not about the info. Never break character.\n------------\n{context}\n------------\nREMEMBER: If there is no relevant information within the context, just say \"Hmm, I'm not sure\". Don't try to make up an answer. Never break character.",
"id": "conversationalRetrievalQAChain_0-input-responsePrompt-string"
}
],
"inputAnchors": [
{
"label": "Chat Model",
"name": "model",
"type": "BaseChatModel",
"id": "conversationalRetrievalQAChain_0-input-model-BaseChatModel"
},
{
"label": "Vector Store Retriever",
"name": "vectorStoreRetriever",
"type": "BaseRetriever",
"id": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever"
},
{
"label": "Memory",
"name": "memory",
"type": "BaseMemory",
"optional": true,
"description": "If left empty, a default BufferMemory will be used",
"id": "conversationalRetrievalQAChain_0-input-memory-BaseMemory"
},
{
"label": "Input Moderation",
"description": "Detect text that could generate harmful output and prevent it from being sent to the language model",
"name": "inputModeration",
"type": "Moderation",
"optional": true,
"list": true,
"id": "conversationalRetrievalQAChain_0-input-inputModeration-Moderation"
}
],
"inputs": {
"model": "{{groqChat_0.data.instance}}",
"vectorStoreRetriever": "{{documentStoreVS_0.data.instance}}",
"memory": "{{bufferWindowMemory_0.data.instance}}",
"returnSourceDocuments": false,
"rephrasePrompt": "Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question.\n\nChat History:\n{chat_history}\nFollow Up Input: {question}\nStandalone Question:",
"responsePrompt": "I want you to act as a technical support person for ROA, an ERP developed by Romfast company. You have access to the documents from your context, Your name is \"Maria\". Using the provided context and your general knowledge, answer the user's question to the best of your ability using the resources provided. I want you to give the answer for the program users, nontechnical, not for the programmer. I don't want to solve program errors, but to help users to solve their problems.\nKeep the answer as short as possible, but descriptive. Don't repeat the problem in your answer. You can make light jokes and greet people in funny ways. Never break character. don't greet the user on every message.\n------------\n{context}\n------------\nREMEMBER: If there is no relevant information within the context, just say \"Hmm, nu am informații despre acest subiect.\" and ask the user if he wishes for you to try to answer anyway. Don't try to make up an answer. Don't make up answers that aren't in the context. Never break character, unless the user writes the secret password: mariamaria\n\nAnswer only in Romanian and writes all the answers without diacritics. Write without diacritics and for the answers from the knowledge database.",
"inputModeration": ""
},
"outputAnchors": [
{
"id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain|Runnable",
"name": "conversationalRetrievalQAChain",
"label": "ConversationalRetrievalQAChain",
"description": "Document QA - built on RetrievalQAChain to provide a chat history component",
"type": "ConversationalRetrievalQAChain | BaseChain | Runnable"
}
],
"outputs": {},
"selected": false
},
"width": 300,
"height": 532,
"selected": false,
"dragging": false,
"positionAbsolute": {
"x": -74.84182984134901,
"y": 846.5506790761656
}
}
],
"edges": [
{
"source": "documentStoreVS_0",
"sourceHandle": "documentStoreVS_0-output-retriever-BaseRetriever",
"target": "conversationalRetrievalQAChain_0",
"targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever",
"type": "buttonedge",
"id": "documentStoreVS_0-documentStoreVS_0-output-retriever-BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever"
},
{
"source": "bufferWindowMemory_0",
"sourceHandle": "bufferWindowMemory_0-output-bufferWindowMemory-BufferWindowMemory|BaseChatMemory|BaseMemory",
"target": "conversationalRetrievalQAChain_0",
"targetHandle": "conversationalRetrievalQAChain_0-input-memory-BaseMemory",
"type": "buttonedge",
"id": "bufferWindowMemory_0-bufferWindowMemory_0-output-bufferWindowMemory-BufferWindowMemory|BaseChatMemory|BaseMemory-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-memory-BaseMemory"
},
{
"source": "groqChat_0",
"sourceHandle": "groqChat_0-output-groqChat-GroqChat|BaseChatModel|BaseLanguageModel|Runnable",
"target": "conversationalRetrievalQAChain_0",
"targetHandle": "conversationalRetrievalQAChain_0-input-model-BaseChatModel",
"type": "buttonedge",
"id": "groqChat_0-groqChat_0-output-groqChat-GroqChat|BaseChatModel|BaseLanguageModel|Runnable-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseChatModel"
}
]
}

View File

@@ -0,0 +1,146 @@
// Before and After Comparison Test
console.log("=== BEFORE vs AFTER: URL Parameter Decoding ===\n");
const problematicSearch = "?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori";
// OLD IMPLEMENTATION (with the problematic line)
function oldGetUrlParameter(name, searchString) {
try {
const urlParams = new URLSearchParams(searchString);
const value = urlParams.get(name);
if (value === null) {
return '';
}
return value;
} catch (error) {
// Old problematic fallback
try {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(searchString);
if (results === null) {
return '';
}
let rawValue = results[1];
// THIS IS THE PROBLEMATIC PART - corrupts %B sequences
let cleaned = rawValue
.replace(/\+/g, ' ')
.replace(/%20/g, ' ')
.replace(/%27/g, "'")
.replace(/%28/g, "(")
.replace(/%29/g, ")")
.replace(/%3A/g, ":")
.replace(/%2C/g, ",")
.replace(/%([\dA-Fa-f])/g, '$1') // PROBLEM: Replaces %B with B
.replace(/%/g, ''); // Removes remaining %
return cleaned;
} catch (fallbackError) {
return '';
}
}
}
// NEW IMPLEMENTATION (improved)
function newGetUrlParameter(name, searchString) {
try {
const urlParams = new URLSearchParams(searchString);
const value = urlParams.get(name);
if (value === null) {
return '';
}
return value;
} catch (error) {
// Improved safe fallback
try {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(searchString);
if (results === null) {
return '';
}
let rawValue = results[1];
// Safe decode function
function safeDecodeURIComponent(str) {
str = str.replace(/\+/g, ' ');
const chunks = str.split('%');
let result = chunks[0];
for (let i = 1; i < chunks.length; i++) {
const chunk = chunks[i];
if (chunk.length >= 2) {
const hexCode = chunk.substring(0, 2);
const rest = chunk.substring(2);
if (/^[0-9A-Fa-f]{2}$/.test(hexCode)) {
try {
result += decodeURIComponent('%' + hexCode) + rest;
} catch (e) {
result += '%' + chunk;
}
} else {
// IMPROVEMENT: Preserves invalid sequences like %B
result += '%' + chunk;
}
} else {
result += '%' + chunk;
}
}
return result;
}
return safeDecodeURIComponent(rawValue);
} catch (fallbackError) {
return '';
}
}
}
// Test both implementations
console.log("Problematic URL search parameter:");
console.log(problematicSearch);
console.log();
console.log("=== OLD IMPLEMENTATION RESULT ===");
try {
const oldResult = oldGetUrlParameter('message', problematicSearch);
console.log("✅ Success (but corrupted content):");
console.log(oldResult);
console.log();
console.log("🔍 Notice: '%BankAccount_choice0' became 'BankAccount_choice0' (lost the %B)");
} catch (error) {
console.log("❌ Failed:");
console.log(error.message);
}
console.log();
console.log("=== NEW IMPLEMENTATION RESULT ===");
try {
const newResult = newGetUrlParameter('message', problematicSearch);
console.log("✅ Success (with preserved content):");
console.log(newResult);
console.log();
console.log("🔍 Notice: '%BankAccount_choice0' is preserved correctly");
} catch (error) {
console.log("❌ Failed:");
console.log(error.message);
}
console.log();
console.log("=== SUMMARY ===");
console.log("OLD: Corrupts %B sequences by converting them to single characters");
console.log("NEW: Preserves %B sequences as they are, preventing data loss");
console.log("BENEFIT: No more URI malformed errors and accurate message content");

195
utile/chatbot/chatbot.html Normal file
View File

@@ -0,0 +1,195 @@
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RomFast - Contact</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 0;
padding: 0;
color: #333;
background: #444;
}
.page-container {
display: flex;
justify-content: center;
}
.container {
width: 921px;
background-color: #fff;
}
.header {
background: #1B5B76;
padding: 20px;
color: white;
}
.logo-container {
display: flex;
align-items: center;
}
.logo img {
max-width: 100px;
height: auto;
}
.company-info {
margin-left: 20px;
}
.company-name {
font-size: 32px;
font-weight: bold;
}
.subtitle {
font-size: 16px;
}
.menu {
background-color: #f0f0f0;
padding: 10px 0;
}
.menu-toggle {
display: none;
background: none;
border: none;
font-size: 30px;
cursor: pointer;
}
.menu ul {
list-style-type: none;
padding: 0;
margin: 0;
display: flex;
justify-content: space-around;
}
.menu ul li a {
color: #333;
text-decoration: none;
text-transform: uppercase;
font-size: 14px;
padding: 10px;
display: block;
}
.content {
display: flex;
padding: 20px;
}
.left-column {
flex: 2;
padding-right: 20px;
}
.right-column {
flex: 1;
border-left: 1px solid #ccc;
padding-left: 20px;
}
.contact-image {
max-width: 100%;
height: auto;
border: 1px solid #dadada;
margin-bottom: 20px;
}
.footer {
background-color: #08819c;
color: #fff;
text-align: center;
padding: 10px 0;
}
@media (max-width: 921px) {
.container {
width: 100%;
}
.content {
flex-direction: column;
}
.right-column {
border-left: none;
border-top: 1px solid #ccc;
padding-top: 20px;
margin-top: 20px;
}
.menu-toggle {
display: block;
margin: 10px;
}
.menu ul {
display: none;
flex-direction: column;
}
.menu ul.show {
display: flex;
}
.menu ul li {
text-align: center;
}
.menu ul li a {
padding: 15px;
border-top: 1px solid #ddd;
}
}
</style>
</head>
<body>
<flowise-fullchatbot></flowise-fullchatbot>
<script type="module">
import Chatbot from "https://cdn.jsdelivr.net/npm/flowise-embed/dist/web.js"
Chatbot.initFull({
chatflowid: "462dabb9-6995-4f7e-ad8e-30624ae56be5",
apiHost: "https://mutual-special-koala.ngrok-free.app",
theme: {
chatWindow: {
showTitle: true,
title: 'Cezar ChatBot - Romfast Suport',
titleAvatarSrc: 'https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/svg/google-messages.svg',
showAgentMessages: true,
welcomeMessage: 'Buna! Cu ce te pot ajuta?',
errorMessage: 'Am o eroare! Revino mai tarziu',
backgroundColor: "#ffffff",
backgroundImage: 'enter image path or link', // If set, this will overlap the background color of the chat window.
height: 700,
width: 500,
fontSize: 16,
starterPrompts: ['Cum se actualizeaza tokenul eFactura?', 'Cand se completeaza codul de plata pentru declaratia SAFT?'], // It overrides the starter prompts set by the chat flow passed
starterPromptFontSize: 15,
clearChatOnReload: true, // If set to true, the chat will be cleared when the page reloads.
botMessage: {
backgroundColor: "#f7f8ff",
textColor: "#303235",
showAvatar: true,
avatarSrc: "https://raw.githubusercontent.com/zahidkhawaja/langchain-chat-nextjs/main/public/parroticon.png",
},
userMessage: {
backgroundColor: "#3B81F6",
textColor: "#ffffff",
showAvatar: true,
avatarSrc: "https://raw.githubusercontent.com/zahidkhawaja/langchain-chat-nextjs/main/public/usericon.png",
},
textInput: {
placeholder: 'Type your question',
backgroundColor: '#ffffff',
textColor: '#303235',
sendButtonColor: '#3B81F6',
maxChars: 2000,
maxCharsWarningMessage: 'You exceeded the characters limit. Please input less than 2000 characters.',
autoFocus: true, // If not used, autofocus is disabled on mobile and enabled on desktop. true enables it on both, false disables it on both.
sendMessageSound: false,
// sendSoundLocation: "send_message.mp3", // If this is not used, the default sound effect will be played if sendSoundMessage is true.
receiveMessageSound: false,
// receiveSoundLocation: "receive_message.mp3", // If this is not used, the default sound effect will be played if receiveSoundMessage is true.
},
feedback: {
color: '#303235',
},
footer: {
textColor: '#303235',
text: 'Powered by',
company: 'Romfast',
companyLink: 'https://www.romfast.ro',
}
}
}
})
</script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,119 @@
// Comprehensive test to verify the URL decoding fix
console.log("=== COMPREHENSIVE URL DECODING TEST ===\n");
// Test the exact problematic URL from the user
const testURL = "https://www.romfast.ro/chatbot_maria.html?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori";
console.log("Testing with the exact problematic URL:");
console.log(testURL);
console.log();
// Extract the search params
const url = new URL(testURL);
const searchParams = url.search;
console.log("Search parameters:", searchParams);
console.log();
// Test different approaches
console.log("=== METHOD 1: URLSearchParams (Browser Native) ===");
try {
const params = new URLSearchParams(searchParams);
const message = params.get('message');
console.log("✅ SUCCESS - URLSearchParams handled it:");
console.log("Result:", message);
console.log("Length:", message.length);
console.log("Contains replacement char:", message.includes('<27>'));
} catch (error) {
console.log("❌ FAILED - URLSearchParams error:");
console.log("Error:", error.message);
}
console.log();
console.log("=== METHOD 2: decodeURIComponent (Direct) ===");
try {
const rawParam = searchParams.match(/message=([^&]*)/)?.[1] || '';
const decoded = decodeURIComponent(rawParam);
console.log("✅ SUCCESS - decodeURIComponent worked:");
console.log("Result:", decoded);
} catch (error) {
console.log("❌ FAILED - decodeURIComponent error:");
console.log("Error:", error.message);
console.log("This is the 'URI malformed' error you were experiencing!");
}
console.log();
console.log("=== METHOD 3: Our Improved Safe Decoder ===");
function safeDecodeURIComponent(str) {
// First replace + with spaces
str = str.replace(/\+/g, ' ');
// Process % sequences chunk by chunk
const chunks = str.split('%');
let result = chunks[0]; // First chunk is never encoded
for (let i = 1; i < chunks.length; i++) {
const chunk = chunks[i];
if (chunk.length >= 2) {
const hexCode = chunk.substring(0, 2);
const rest = chunk.substring(2);
// Check if it's a valid hex code
if (/^[0-9A-Fa-f]{2}$/.test(hexCode)) {
try {
result += decodeURIComponent('%' + hexCode) + rest;
} catch (e) {
// If decoding fails, keep the original
result += '%' + chunk;
}
} else {
// Invalid hex code (like %B), keep as is
result += '%' + chunk;
}
} else {
// Incomplete code, keep as is
result += '%' + chunk;
}
}
return result;
}
try {
const rawParam = searchParams.match(/message=([^&]*)/)?.[1] || '';
const decoded = safeDecodeURIComponent(rawParam);
console.log("✅ SUCCESS - Safe decoder worked:");
console.log("Result:", decoded);
console.log("Preserved %B sequence:", decoded.includes('%B'));
} catch (error) {
console.log("❌ FAILED - Safe decoder error:");
console.log("Error:", error.message);
}
console.log();
console.log("=== ANALYSIS ===");
console.log("1. URLSearchParams DOES work, but converts %B to replacement character (<28>)");
console.log("2. decodeURIComponent FAILS with 'URI malformed' error on %B");
console.log("3. Our safe decoder PRESERVES the %B sequence intact");
console.log();
console.log("=== THE ACTUAL ISSUE ===");
console.log("The %B in your URL is not valid URL encoding because:");
console.log("- Valid URL encoding requires two hex digits: %XX");
console.log("- %B only has one hex digit");
console.log("- This should probably be %0B (vertical tab) or %42 (letter 'B')");
console.log();
console.log("=== THE SOLUTION ===");
console.log("✅ Updated chatbot_maria.html with improved getUrlParameter function");
console.log("✅ Function now handles invalid URL sequences gracefully");
console.log("✅ No more 'URI malformed' errors");
console.log("✅ Message content is preserved accurately");
console.log();
console.log("=== EXPECTED BEHAVIOR ===");
console.log("When you load the problematic URL, the chatbot will now:");
console.log("1. First try URLSearchParams (which works but gives replacement char)");
console.log("2. Use the decoded message from URLSearchParams");
console.log("3. If URLSearchParams failed, fall back to safe decoder");
console.log("4. Send the message to the API successfully");
console.log("5. Display the response without errors");

View File

@@ -0,0 +1,263 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Final Solution Test - URL Parameter Decoding</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
background: #f5f5f5;
}
.test-container {
background: white;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.success { color: #28a745; font-weight: bold; }
.error { color: #dc3545; font-weight: bold; }
.warning { color: #ffc107; font-weight: bold; }
.code {
background: #f8f9fa;
padding: 10px;
border-radius: 4px;
font-family: monospace;
border-left: 4px solid #007bff;
margin: 10px 0;
word-break: break-all;
}
.result {
background: #e9ecef;
padding: 15px;
border-radius: 4px;
margin: 10px 0;
word-break: break-word;
}
.test-case {
margin: 15px 0;
padding: 15px;
border: 1px solid #ddd;
border-radius: 4px;
}
</style>
</head>
<body>
<h1>Final Solution Test - URL Parameter Decoding</h1>
<p>Testing the improved URL parameter decoding function that handles the %B issue gracefully.</p>
<div class="test-container">
<h2>Test Cases</h2>
<div id="testResults"></div>
</div>
<div class="test-container">
<h2>Summary</h2>
<div id="summary"></div>
</div>
<script>
// Improved URL parameter function (same as updated in chatbot_maria.html)
function getUrlParameter(name, searchString) {
try {
// Folosește URLSearchParams pentru o decodificare mai sigură
const urlParams = new URLSearchParams(searchString);
const value = urlParams.get(name);
if (value === null) {
return '';
}
console.log("Parametru decodat cu URLSearchParams:", value);
return value;
} catch (error) {
console.error("Eroare cu URLSearchParams:", error);
// Fallback la metoda manuală cu decodificare sigură
try {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(searchString);
if (results === null) {
return '';
}
let rawValue = results[1];
console.log("Valoare brută din URL (fallback):", rawValue);
// Funcție de decodificare sigură care gestionează secvențe invalide
function safeDecodeURIComponent(str) {
// Primul pas: înlocuiește + cu spații
str = str.replace(/\+/g, ' ');
// Al doilea pas: procesează secvențele % chunk cu chunk
const chunks = str.split('%');
let result = chunks[0]; // Primul chunk nu este niciodată codat
for (let i = 1; i < chunks.length; i++) {
const chunk = chunks[i];
if (chunk.length >= 2) {
const hexCode = chunk.substring(0, 2);
const rest = chunk.substring(2);
// Verifică dacă este un cod hex valid
if (/^[0-9A-Fa-f]{2}$/.test(hexCode)) {
try {
result += decodeURIComponent('%' + hexCode) + rest;
} catch (e) {
// Dacă decodificarea eșuează, păstrează originalul
result += '%' + chunk;
}
} else {
// Cod hex invalid (cum ar fi %B), păstrează originalul
result += '%' + chunk;
}
} else {
// Cod incomplet, păstrează originalul
result += '%' + chunk;
}
}
return result;
}
const decoded = safeDecodeURIComponent(rawValue);
console.log("Parametru decodat cu metoda sigură:", decoded);
return decoded;
} catch (fallbackError) {
console.error("Eroare și la fallback sigur:", fallbackError);
return '';
}
}
}
// Test cases
const testCases = [
{
name: "Original Problematic URL",
search: "?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori",
expected: "F: Header (1) sectiune Company (1) sectiune BankAccount (1) eroare structura: grupul '%BankAccount_choice0' ar fi trebuit sa apara de minimum 1 ori, dar apare efectiv de 0 ori"
},
{
name: "Normal URL encoding",
search: "?message=Hello%20World%20%28test%29",
expected: "Hello World (test)"
},
{
name: "URL with plus signs",
search: "?message=Hello+World+Test",
expected: "Hello World Test"
},
{
name: "URL with multiple invalid sequences",
search: "?message=Test%B%G%20and%20%27normal%27",
expected: "Test%B%G and 'normal'"
},
{
name: "Empty message",
search: "?message=",
expected: ""
},
{
name: "No message parameter",
search: "?other=value",
expected: ""
}
];
function runTests() {
const resultsDiv = document.getElementById('testResults');
const summaryDiv = document.getElementById('summary');
let passed = 0;
let failed = 0;
let results = [];
testCases.forEach((testCase, index) => {
const testDiv = document.createElement('div');
testDiv.className = 'test-case';
try {
const result = getUrlParameter('message', testCase.search);
const success = result === testCase.expected;
if (success) {
passed++;
} else {
failed++;
}
testDiv.innerHTML = `
<h3>Test ${index + 1}: ${testCase.name}</h3>
<div class="code"><strong>Input:</strong> ${testCase.search}</div>
<div class="result"><strong>Expected:</strong><br>${testCase.expected}</div>
<div class="result"><strong>Got:</strong><br>${result}</div>
<div class="${success ? 'success' : 'error'}">
${success ? '✅ PASSED' : '❌ FAILED'}
</div>
`;
results.push({
name: testCase.name,
success: success,
expected: testCase.expected,
got: result
});
} catch (error) {
failed++;
testDiv.innerHTML = `
<h3>Test ${index + 1}: ${testCase.name}</h3>
<div class="code"><strong>Input:</strong> ${testCase.search}</div>
<div class="error">❌ ERROR: ${error.message}</div>
`;
results.push({
name: testCase.name,
success: false,
error: error.message
});
}
resultsDiv.appendChild(testDiv);
});
// Summary
const totalTests = testCases.length;
const successRate = Math.round((passed / totalTests) * 100);
summaryDiv.innerHTML = `
<h3>Test Results Summary</h3>
<p><strong>Total Tests:</strong> ${totalTests}</p>
<p><strong>Passed:</strong> <span class="success">${passed}</span></p>
<p><strong>Failed:</strong> <span class="error">${failed}</span></p>
<p><strong>Success Rate:</strong> ${successRate}%</p>
<h3>Key Improvements:</h3>
<ul>
<li>✅ Handles invalid URL encoding sequences like %B gracefully</li>
<li>✅ Preserves original text when decoding fails</li>
<li>✅ Maintains compatibility with valid URL encoding</li>
<li>✅ Provides robust fallback mechanism</li>
<li>✅ No more "URI malformed" errors</li>
</ul>
<h3>How it works:</h3>
<ol>
<li>First tries URLSearchParams (works for most cases)</li>
<li>If URLSearchParams fails, uses safe chunk-by-chunk processing</li>
<li>Only attempts to decode valid hex sequences (%XX format)</li>
<li>Preserves invalid sequences like %B instead of corrupting them</li>
<li>Handles incomplete sequences gracefully</li>
</ol>
`;
}
// Run tests when page loads
window.addEventListener('load', runTests);
</script>
</body>
</html>

View File

@@ -0,0 +1,164 @@
// URL Parameter Decoding Test Script
// Tests the problematic URL with %B character and various decoding methods
console.log("=== URL Parameter Decoding Test ===\n");
// The problematic URL from the user's request
const problematicUrl = "https://www.romfast.ro/chatbot_maria.html?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori";
console.log("Problematic URL:");
console.log(problematicUrl);
console.log();
// Extract the query string
const urlObj = new URL(problematicUrl);
const queryString = urlObj.search;
const messageParam = queryString.match(/message=([^&]*)/)?.[1] || '';
console.log("Extracted message parameter (raw):");
console.log(messageParam);
console.log();
// Test Method 1: URLSearchParams (this should fail with the %B issue)
console.log("=== Test 1: URLSearchParams method ===");
try {
const searchParams = new URLSearchParams(queryString);
const decodedMessage1 = searchParams.get('message');
console.log("✅ SUCCESS with URLSearchParams:");
console.log(decodedMessage1);
} catch (error) {
console.log("❌ FAILED with URLSearchParams:");
console.log("Error:", error.message);
}
console.log();
// Test Method 2: decodeURIComponent (this should also fail)
console.log("=== Test 2: decodeURIComponent method ===");
try {
const decodedMessage2 = decodeURIComponent(messageParam);
console.log("✅ SUCCESS with decodeURIComponent:");
console.log(decodedMessage2);
} catch (error) {
console.log("❌ FAILED with decodeURIComponent:");
console.log("Error:", error.message);
}
console.log();
// Test Method 3: Manual decoding with character replacement (current fallback method)
console.log("=== Test 3: Manual decoding with replacement ===");
try {
let manualDecoded = messageParam
.replace(/\+/g, ' ')
.replace(/%20/g, ' ')
.replace(/%27/g, "'")
.replace(/%28/g, "(")
.replace(/%29/g, ")")
.replace(/%3A/g, ":")
.replace(/%2C/g, ",")
.replace(/%([\dA-Fa-f])/g, '$1') // This line is problematic - replaces %B with B
.replace(/%/g, ''); // Removes remaining %
console.log("✅ SUCCESS with manual decoding:");
console.log(manualDecoded);
console.log("⚠️ NOTE: This method corrupts %B sequences!");
} catch (error) {
console.log("❌ FAILED with manual decoding:");
console.log("Error:", error.message);
}
console.log();
// Test Method 4: Improved manual decoding (recommended fix)
console.log("=== Test 4: Improved manual decoding (RECOMMENDED) ===");
try {
// First, handle known safe replacements
let improvedDecoded = messageParam
.replace(/\+/g, ' ')
.replace(/%20/g, ' ')
.replace(/%27/g, "'")
.replace(/%28/g, "(")
.replace(/%29/g, ")")
.replace(/%3A/g, ":")
.replace(/%2C/g, ",");
// Then handle invalid sequences by removing them entirely or replacing with safe characters
// %B is not a valid URL encoding (should be %0B for vertical tab or something else)
improvedDecoded = improvedDecoded
.replace(/%[^0-9A-Fa-f]/g, '') // Remove invalid % sequences that don't have valid hex
.replace(/%[0-9A-Fa-f]$/g, '') // Remove incomplete % sequences at end
.replace(/%([0-9A-Fa-f])(?![0-9A-Fa-f])/g, '$1'); // Convert single hex digit sequences
console.log("✅ SUCCESS with improved manual decoding:");
console.log(improvedDecoded);
} catch (error) {
console.log("❌ FAILED with improved manual decoding:");
console.log("Error:", error.message);
}
console.log();
// Test Method 5: Safe decoding with chunk processing
console.log("=== Test 5: Safe chunk-by-chunk decoding ===");
try {
function safeDecodeURIComponent(str) {
// Split by % and process each chunk
const chunks = str.split('%');
let result = chunks[0]; // First chunk is never encoded
for (let i = 1; i < chunks.length; i++) {
const chunk = chunks[i];
if (chunk.length >= 2) {
const hexCode = chunk.substring(0, 2);
const rest = chunk.substring(2);
// Check if it's a valid hex code
if (/^[0-9A-Fa-f]{2}$/.test(hexCode)) {
try {
result += decodeURIComponent('%' + hexCode) + rest;
} catch (e) {
// If decoding fails, keep the original
result += '%' + chunk;
}
} else {
// Invalid hex code, keep as is
result += '%' + chunk;
}
} else {
// Incomplete code, keep as is
result += '%' + chunk;
}
}
return result;
}
const safeDecoded = safeDecodeURIComponent(messageParam);
console.log("✅ SUCCESS with safe chunk decoding:");
console.log(safeDecoded);
} catch (error) {
console.log("❌ FAILED with safe chunk decoding:");
console.log("Error:", error.message);
}
console.log();
// Analysis of the %B issue
console.log("=== Analysis of the %B issue ===");
console.log("The sequence '%B' in the URL is problematic because:");
console.log("1. It's not a valid URL encoding (missing second hex digit)");
console.log("2. URLSearchParams and decodeURIComponent expect %XX format");
console.log("3. %B should probably be %0B (vertical tab) or %42 (letter B) or escaped as %25B");
console.log();
// Show where the issue occurs in the original message
const problemIndex = messageParam.indexOf('%B');
if (problemIndex !== -1) {
console.log("The %B sequence appears at position:", problemIndex);
console.log("Context around %B:");
const start = Math.max(0, problemIndex - 20);
const end = Math.min(messageParam.length, problemIndex + 20);
console.log("...", messageParam.substring(start, end), "...");
console.log(" ", " ".repeat(problemIndex - start) + "^^^ HERE");
}
console.log();
console.log("=== Recommended Solution ===");
console.log("Update the getUrlParameter function in chatbot_maria.html to use Method 5 (Safe chunk-by-chunk decoding)");
console.log("This will handle invalid URL encoding sequences gracefully without throwing errors.");

249
utile/chatbot/url_test.html Normal file
View File

@@ -0,0 +1,249 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>URL Parameter Decoding Test</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
background: #f5f5f5;
}
.test-container {
background: white;
padding: 20px;
border-radius: 8px;
margin-bottom: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.success { color: #28a745; }
.error { color: #dc3545; }
.warning { color: #ffc107; }
.code {
background: #f8f9fa;
padding: 10px;
border-radius: 4px;
font-family: monospace;
border-left: 4px solid #007bff;
margin: 10px 0;
}
.result {
background: #e9ecef;
padding: 15px;
border-radius: 4px;
margin: 10px 0;
word-break: break-word;
}
</style>
</head>
<body>
<h1>URL Parameter Decoding Test</h1>
<p>Testing the problematic URL with %B character that causes "URI malformed" errors.</p>
<div class="test-container">
<h2>Test URL</h2>
<div class="code" id="testUrl"></div>
</div>
<div class="test-container">
<h2>Current Implementation (from chatbot_maria.html)</h2>
<div id="currentResult"></div>
</div>
<div class="test-container">
<h2>Improved Implementation (Recommended Fix)</h2>
<div id="improvedResult"></div>
</div>
<div class="test-container">
<h2>Comparison</h2>
<div id="comparison"></div>
</div>
<script>
// The problematic URL
const testUrl = "https://www.romfast.ro/chatbot_maria.html?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori";
document.getElementById('testUrl').textContent = testUrl;
// Simulate the URL by setting location.search
const mockSearch = "?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori";
// Current implementation (from chatbot_maria.html)
function getCurrentUrlParameter(name) {
try {
// Simulate URLSearchParams test first
const urlParams = new URLSearchParams(mockSearch);
const value = urlParams.get(name);
if (value === null) {
return '';
}
console.log("Parametru decodat cu URLSearchParams:", value);
return value;
} catch (error) {
console.error("Eroare cu URLSearchParams:", error);
// Fallback la metoda manuală cu curățare agresivă
try {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(mockSearch);
if (results === null) {
return '';
}
let rawValue = results[1];
console.log("Valoare brută din URL (fallback):", rawValue);
// Înlocuiește secvențele problematice manual
let cleaned = rawValue
.replace(/\+/g, ' ')
.replace(/%20/g, ' ')
.replace(/%27/g, "'")
.replace(/%28/g, "(")
.replace(/%29/g, ")")
.replace(/%3A/g, ":")
.replace(/%2C/g, ",")
.replace(/%([\dA-Fa-f])/g, '$1') // This line is problematic!
.replace(/%/g, ''); // Elimină orice % rămas
console.log("Parametru curățat manual:", cleaned);
return cleaned;
} catch (fallbackError) {
console.error("Eroare și la fallback:", fallbackError);
return '';
}
}
}
// Improved implementation (recommended fix)
function getImprovedUrlParameter(name) {
try {
// First try URLSearchParams
const urlParams = new URLSearchParams(mockSearch);
const value = urlParams.get(name);
if (value !== null) {
console.log("SUCCESS with URLSearchParams:", value);
return value;
}
return '';
} catch (error) {
console.log("URLSearchParams failed, using safe fallback:", error.message);
// Safe fallback with chunk processing
try {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(mockSearch);
if (results === null) {
return '';
}
let rawValue = results[1];
// Safe decode function
function safeDecodeURIComponent(str) {
// First handle common safe replacements
str = str.replace(/\+/g, ' ');
// Then process % sequences chunk by chunk
const chunks = str.split('%');
let result = chunks[0]; // First chunk is never encoded
for (let i = 1; i < chunks.length; i++) {
const chunk = chunks[i];
if (chunk.length >= 2) {
const hexCode = chunk.substring(0, 2);
const rest = chunk.substring(2);
// Check if it's a valid hex code
if (/^[0-9A-Fa-f]{2}$/.test(hexCode)) {
try {
result += decodeURIComponent('%' + hexCode) + rest;
} catch (e) {
// If decoding fails, keep the original
result += '%' + chunk;
}
} else {
// Invalid hex code, keep as is (this handles %B)
result += '%' + chunk;
}
} else {
// Incomplete code, keep as is
result += '%' + chunk;
}
}
return result;
}
const decoded = safeDecodeURIComponent(rawValue);
console.log("Safe decode result:", decoded);
return decoded;
} catch (fallbackError) {
console.error("Safe fallback also failed:", fallbackError);
return '';
}
}
}
// Test both implementations
function runTests() {
const currentResultDiv = document.getElementById('currentResult');
const improvedResultDiv = document.getElementById('improvedResult');
const comparisonDiv = document.getElementById('comparison');
// Test current implementation
try {
const currentResult = getCurrentUrlParameter('message');
currentResultDiv.innerHTML = `
<div class="success">✅ Current implementation succeeded</div>
<div class="result"><strong>Result:</strong><br>${currentResult}</div>
`;
} catch (error) {
currentResultDiv.innerHTML = `
<div class="error">❌ Current implementation failed</div>
<div class="result"><strong>Error:</strong><br>${error.message}</div>
`;
}
// Test improved implementation
try {
const improvedResult = getImprovedUrlParameter('message');
improvedResultDiv.innerHTML = `
<div class="success">✅ Improved implementation succeeded</div>
<div class="result"><strong>Result:</strong><br>${improvedResult}</div>
`;
} catch (error) {
improvedResultDiv.innerHTML = `
<div class="error">❌ Improved implementation failed</div>
<div class="result"><strong>Error:</strong><br>${error.message}</div>
`;
}
// Show comparison
comparisonDiv.innerHTML = `
<h3>Key Differences:</h3>
<ul>
<li><strong>Current:</strong> Uses URLSearchParams first, falls back to aggressive manual replacement that corrupts %B</li>
<li><strong>Improved:</strong> Uses URLSearchParams first, falls back to safe chunk-by-chunk processing that preserves invalid sequences</li>
<li><strong>Issue:</strong> The %B in the URL is not valid URL encoding (should be %0B or %42)</li>
<li><strong>Solution:</strong> The improved version handles invalid sequences gracefully</li>
</ul>
<h3>Expected Message Content:</h3>
<div class="code">F: Header (1) sectiune Company (1) sectiune BankAccount (1) eroare structura: grupul '%BankAccount_choice0' ar fi trebuit sa apara de minimum 1 ori, dar apare efectiv de 0 ori</div>
`;
}
// Run tests when page loads
window.addEventListener('load', runTests);
</script>
</body>
</html>

View File

@@ -0,0 +1,85 @@
<title>
A simple guide on how to use ThemedControls
</title>
<body>
<p>Add the following files to your project:</p>
<ul>
<li>Text files from Other tab in Project Manager<br>Ctl32.h (mark it as "Excluded" from your project)<br>ThemedControls.h (mark it as "Excluded" from your project)<br>Themes.xml (mark it as "Excluded" from your project)<br><em>*** Don't forget to distribute these xml file together with your application! ***</em><br><br>
<li>Applications from Code tab in Project Manager<br>System.app (GDIPlusX from VFPX)<br><em>*** Don't forget to distribute these app file together with your application! ***<br><br></em>
<li><em></em>Programs from Code tab in Project Manager<br>Ctl32.prg<br>Ctl32_Api.prg<br>Ctl32_Classes.prg<br>Ctl32_Functions.prg<br>Ctl32_Structures.prg<br>Ctl32_Vfp2c32.prg<br><br>
<li>Classes tab in Project Manager<br>Buttons.vcx<br>Ctl32.vcx<br>ExplorerBar.vcx<br>OutlookNavBar.vcx<br>ThemedControls.vcx<br>ThemedControlsBuilders.vcx (mark it as "Excluded" from your project)<br>ToolBox.vcx<br>VFPX.vcx<br>ZoomNavBar.vcx<br><em>*** Don't use controls from Buttons.vcx, ExplorerBar.vcx, OutlookNavBar.vcx, ToolBox.vcx and ZoomNavBar.vcx directly because they are base classes. Use the subclassed controls in ThemedControls.vcx. ***</em></li></ul>
<p><strong></strong>&nbsp;</p>
<p><strong><font color="#0000ff">Before use any ThemedControl:</font></strong> </p>
<p>ThemesManager and BindWindowsEventsProxy objects used to handle themes are created automatically, but you need to destroy them before finish your application. </p>
<blockquote>
<p><pre>* Destroy ThemesManager object<br>If Vartype(_Screen.ThemesManager)=="O"<br>&nbsp;&nbsp; _Screen.RemoveObject("ThemesManager")<br>Endif</p><p>* Destroy BindWindowsEventsProxy object<br>If Type("_vfp.BindWindowsEventsProxy")<>"U"<br> _vfp.BindWindowsEventsProxy = Null<br>Endif</p></pre></blockquote>
<p>&nbsp;</p>
<p><strong>To use Button:</strong>
<ol>
<li>Add a ThemedButton object from ThemedControls.vcx to your form;
<li>Double click CustomBuilder property in Properties Window to show the Builder;
<li>Fill the properties and click in <em>Save and Exit</em> button;
<li>Use Click method to handle the button click.</li></ol>
<p>&nbsp;</p>
<p><strong></strong>
<p><strong>To use ExplorerBar:</strong>
<ol>
<li>Add a ThemedExplorerGroup object from ThemedControls.vcx to your form;
<li>Double click CustomBuilder property in Properties Window to show the Builder;
<li>Fill the properties and click in <em>Save and Exit</em> button;
<li>Click with right mouse button in ThemedExplorerGroup and choose Edit from shortcut menu to edit the control;
<li>Click with right mouse button in cntUserControls and choose Edit from shortcut menu to edit the control;
<li>Place any control that you want inside cntUserControls;
<li>Repeat steps from 1 to 6 to create how much groups you want;
<li>Add a ThemedExplorerBar object from ThemedControls.vcx to your form;
<li>Select all ThemedExplorerGroups you created and press CTRL + X in your keyboard;
<li>Click with right mouse button in ThemedExplorerBar and choose Edit from shortcut menu to edit the control;
<li>Press CTRL + V in your keyboard to move all ThemedExplorerGroups inside ThemedExplorerBar.</li></ol>
<blockquote>
<p>Or</p></blockquote>
<ol>
<li>Add a ThemedExplorerBar object from ThemedControls.vcx to your form;
<li>Double click CustomBuilder property in Properties Window to show the Builder;
<li>Fill the properties and click in <em>Add this group to the bar</em> button;
<li>Repeat step 3 to create how much groups you want;
<li>Click with right mouse button in ThemedExplorerBar and choose Edit from shortcut menu to edit the control;
<li>Click with right mouse button in ThemedExplorerGroup and choose Edit from shortcut menu to edit the control;
<li>Click with right mouse button in cntUserControls and choose Edit from shortcut menu to edit the control;
<li>Place any control that you want inside cntUserControls;
<li>Repeat steps from 6 to 8 for each group you created.</li></ol>
<p><strong></strong>&nbsp;</p>
<p><strong>To use OutlookNavBar:</strong></p>
<ol>
<li>Add a ThemedOutlookNavBar object from ThemedControls.vcx to your form;
<li>Click with right mouse button in ThemedOutlookNavbar and choose Edit from shortcut menu to edit the control;
<li>Click in the empty control area to select the Panes pagreframe object;
<li>Set the PageCount property to the number of buttons that you want to display;
<li>In the Properties Window, activate each page and set Caption, HotKey, Picture16 and Picture24 properties;
<li>Add the controls you want to display in each page (you can add any control: TreeView, TextBox, CommandButton, ...);
<li>Use ButtonClicked method to handle the correspondent button click. This method receive 3 parameters about the button clicked: lnNumber, lcCaption and lcPicture24.</li></ol>
<p><em>*** Note that at run time, the control will create a button for each page and will use Caption, HotKey, Picture16 and Picture24 page properties as the source of caption and picture button properties. ***</em></p>
<p>&nbsp;</p>
<p><strong>To use ToolBox:</strong>
<ol>
<li>Add a ThemedToolBox object from ThemedControls.vcx to your form;
<li>Click with right mouse button in ThemedToolBox and choose Edit from shortcut menu to edit the control;
<li>Click in the empty control area to select the Panes pagreframe object;
<li>Set the PageCount property to the number of titles that you want to display;
<li>In the Properties Window, activate each page and set Caption property;
<li>Add the controls you want to display in each page (you can add any control: TreeView, TextBox, CommandButton, ...);
<li>Use TitleClicked method to handle the correspondent title click. This method receive a parameter named lcTitle containing the name of title clicked.</li></ol>
<p><em>*** Note that at run time, the control will create a title for each page and will use Caption page property as the source of caption title property. ***</em></p>
<p>&nbsp;</p>
<p><strong>To use ZoomNavBar:</strong>
<ol>
<li>Add a ThemedZoomNavBar object from ThemedControls.vcx to your form;
<li>In the Init method, place the code to add the buttons that you want to display:<br>
<p><pre>DoDefault()<br>With This<br>&nbsp;&nbsp; .AddButton("Printers","Manage your printers.","Printer96.png")<br>&nbsp;&nbsp; .AddButton("Display","Change the display settings.","Monitor96.png")<br>&nbsp;&nbsp; .AddButton("Explorer","Show computer's files and folders.","Folder96.png")<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; .AddButton("Separator")<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; .AddButton("ControlPanel","Change your OS settings.","ControlPanel96.png")<br>&nbsp;&nbsp; .AddStackButton("ControlPanel","Button1","Add/Remove programs","Software32.png")<br>&nbsp;&nbsp; .AddStackButton("ControlPanel","Button2","Hardware settings","Hardware32.png")<br>&nbsp;&nbsp; .AddStackButton("ControlPanel","Button3","Network settings","Network32.png")<br>Endwith</pre>
<li>Use AddButton method to add a button and AddStackButton to add an option to a button menu.<br>Sintax:<br><pre>AddButton( cButtonName, cToolTip, cImagePathAndName )<br>AddStackButton( cParentButtonName, cButtonName, cToolTip, cImagePathAndName )</pre>
<li>Use ButtonClicked and StackButtonClicked to handle the correspondent button click:<br><pre>Lparameters lcName<br>Do Case<br>&nbsp;&nbsp; Case lcName=="Printers"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apiShellExecute(0, "Open", "Control.exe", "Printers", "", 1)<br>&nbsp;&nbsp; Case lcName=="Display"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apiShellExecute(0, "Open", "Control.exe", "Desk.cpl", "", 1)<br>&nbsp;&nbsp; Case lcName=="Explorer"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apiShellExecute(0, "Explore", "", "", "", 1)<br>&nbsp;&nbsp; Otherwise<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Messagebox("Button '"+lcName+"' was clicked!")<br>Endcase</pre>
<p></p></li></ol>
<p>
<p>&nbsp; <p>If you have questions, suggestions or want to report bugs, feel free to contact me.</p>
<p>&nbsp;</p>
<p>Emerson Santon Reed<br><a href="mailto:emerson_reed@hotmail.com">emerson_reed@hotmail.com</a></p>
</body>

2484
utile/ctl32/Themes.xml Normal file

File diff suppressed because it is too large Load Diff

295
utile/ctl32/buttons.vc2 Normal file
View File

@@ -0,0 +1,295 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="buttons.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS button AS container
*< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="imgBackgroundLeft" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="imgBackgroundMiddle" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="imgBackgroundRight" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="cmdFocus" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="shpMouseHandler" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="imgIcon" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="lblCaption" UniqueID="" Timestamp="" />
*<DefinedPropArrayMethod>
*m: changetheme && Occurs when theme change.
*m: initthemedcontrol
*m: setimages && Internal to the class.
*p: custombuilder
*p: imgleftfocused
*p: imgleftnotfocused
*p: imgmiddlefocused
*p: imgmiddlenotfocused
*p: imgrightfocused
*p: imgrightnotfocused
*p: initialised
*p: lblfocusedcolor
*p: lblnotfocusedcolor
*p: type && Specify the button type: 0 - Normal or 1 - Hot Tracking.
*p: version
*p: _memberdata && XML Metadata for customizable properties
*</DefinedPropArrayMethod>
HIDDEN imgleftfocused,imgleftnotfocused,imgmiddlefocused,imgmiddlenotfocused,imgrightfocused,imgrightnotfocused,initialised,lblfocusedcolor,lblnotfocusedcolor
PROTECTED Init,Resize
*<PropValue>
BackStyle = 0
BorderWidth = 0
custombuilder = Double click here to open Builder
Height = 32
imgleftfocused = ("")
imgleftnotfocused = =""
imgmiddlefocused = =""
imgmiddlenotfocused = ("")
imgrightfocused = =""
imgrightnotfocused = =""
initialised = .F.
lblfocusedcolor = 0
lblnotfocusedcolor = 0
Name = "button"
type = 0
version = 3.5.0
Width = 160
_memberdata = <VFPData>
<memberdata name="buttoncolor" type="property" display="ButtonColor"/>
<memberdata name="changetheme" type="method" display="ChangeTheme"/>
<memberdata name="setimages" type="method" display="SetImages"/>
<memberdata name="imgleftfocused" type="property" display="ImgLeftFocused"/>
<memberdata name="imgrightfocused" type="property" display="ImgRightFocused"/>
<memberdata name="imgmiddlefocused" type="property" display="ImgMiddleFocused"/>
<memberdata name="imgleftnotfocused" type="property" display="ImgLeftNotFocused"/>
<memberdata name="imgrightnotfocused" type="property" display="ImgRightNotFocused"/>
<memberdata name="imgmiddlenotfocused" type="property" display="ImgMiddleNotFocused"/>
<memberdata name="version" type="property" display="Version"/>
<memberdata name="initialised" type="property" display="Initialised"/>
<memberdata name="custombuilder" type="property" display="CustomBuilder" script="Local lnControls, laObjects[1]&#xA;m.lnControls = Aselobj(m.laObjects)&#xA;If m.lnControls # 0&#xA; Local loObject, lcClassLib, loBuilder&#xA; m.loObject = m.laObjects[1]&#xA; m.lcClassLib = Addbs(Justpath(m.loObject.ClassLibrary))+&quot;ThemedControlsBuilders.vcx&quot;&#xA; Set Classlib To (m.lcClassLib) Additive&#xA; m.loBuilder = Createobject(&quot;ButtonBuilder&quot;, m.loObject)&#xA; m.loBuilder.Show()&#xA;Endif"/>
<memberdata name="lblfocusedcolor" type="property" display="LblFocusedColor"/>
<memberdata name="lblnotfocusedcolor" type="property" display="LblNotFocusedColor"/>
<memberdata name="type" type="property" display="Type"/>
<memberdata name="initthemedcontrol" type="method" display="InitThemedControl"/>
</VFPData>
*</PropValue>
ADD OBJECT 'cmdFocus' AS commandbutton WITH ;
Caption = "", ;
Left = 0, ;
Name = "cmdFocus", ;
Style = 1, ;
TabIndex = 1, ;
Top = -20
*< END OBJECT: BaseClass="commandbutton" />
ADD OBJECT 'imgBackgroundLeft' AS image WITH ;
BackStyle = 0, ;
Left = 0, ;
Name = "imgBackgroundLeft", ;
Top = -20
*< END OBJECT: BaseClass="image" />
ADD OBJECT 'imgBackgroundMiddle' AS image WITH ;
BackStyle = 0, ;
Left = 0, ;
Name = "imgBackgroundMiddle", ;
Top = -20
*< END OBJECT: BaseClass="image" />
ADD OBJECT 'imgBackgroundRight' AS image WITH ;
BackStyle = 0, ;
Left = 0, ;
Name = "imgBackgroundRight", ;
Top = -20
*< END OBJECT: BaseClass="image" />
ADD OBJECT 'imgIcon' AS image WITH ;
BackStyle = 0, ;
Height = 24, ;
Left = 3, ;
Name = "imgIcon", ;
Top = 4, ;
Width = 24
*< END OBJECT: BaseClass="image" />
ADD OBJECT 'lblCaption' AS label WITH ;
BackStyle = 0, ;
Caption = "Caption", ;
FontBold = .T., ;
FontSize = 8, ;
Height = 16, ;
Left = 31, ;
Name = "lblCaption", ;
TabIndex = 2, ;
Top = 8, ;
Width = 132
*< END OBJECT: BaseClass="label" />
ADD OBJECT 'shpMouseHandler' AS shape WITH ;
BackStyle = 0, ;
BorderStyle = 0, ;
Left = 0, ;
Name = "shpMouseHandler", ;
Top = -20
*< END OBJECT: BaseClass="shape" />
PROCEDURE changetheme && Occurs when theme change.
With _Screen.ThemesManager
If This.Type==0
This.ImgLeftFocused = .GetMember("Button.Left.Focused.Picture")
This.ImgMiddleFocused = .GetMember("Button.Middle.Focused.Picture")
This.ImgRightFocused = .GetMember("Button.Right.Focused.Picture")
This.ImgLeftNotFocused = .GetMember("Button.Left.NotFocused.Picture")
This.ImgMiddleNotFocused = .GetMember("Button.Middle.NotFocused.Picture")
This.ImgRightNotFocused = .GetMember("Button.Right.NotFocused.Picture")
Else
This.imgBackgroundLeft.Picture = .GetMember("Button.Left.HotTracking.Picture")
This.imgBackgroundMiddle.Picture = .GetMember("Button.Middle.HotTracking.Picture")
This.imgBackgroundRight.Picture = .GetMember("Button.Right.HotTracking.Picture")
Endif
This.LblFocusedColor = .GetMember("Button.Focused.FontColor")
This.LblNotFocusedColor = .GetMember("Button.NotFocused.FontColor")
This.SetImages(.F.)
Endwith
ENDPROC
PROTECTED PROCEDURE Init
Thisform.ShowTips = .T.
With This
.Initialised = .T.
.Resize()
*
* Reorder objects
.imgBackgroundMiddle.ZOrder(0)
.imgBackgroundLeft.ZOrder(0)
.imgBackgroundRight.ZOrder(0)
.imgIcon.ZOrder(0)
.lblCaption.ZOrder(0)
.cmdFocus.Caption = This.lblCaption.Caption
.cmdFocus.ZOrder(0)
.shpMouseHandler.ZOrder(0)
*
.InitThemedControl()
Endwith
ENDPROC
HIDDEN PROCEDURE initthemedcontrol
If Not Vartype(_Screen.ThemesManager)=="O"
_Screen.Newobject("ThemesManager","ThemesManager","ThemedControls.vcx")
Endif
This.ChangeTheme()
ENDPROC
PROTECTED PROCEDURE Resize
If This.Initialised
With This.imgBackgroundLeft
.Height = This.Height
.Left = 0
.Top = 0
.Width = 2
Endwith
*
With This.imgBackgroundMiddle
.Stretch = 2
.Height = This.Height
.Left = 2
.Top = 0
.Width = This.Width - 4
Endwith
*
With This.imgBackgroundRight
.Height = This.Height
.Left = This.Width - 2
.Top = 0
.Width = 2
Endwith
*
With This.cmdFocus
.Height = This.Height - 6
.Left = 3
.Top = 3
.Width = This.Width - 6
Endwith
*
With This.shpMouseHandler
.Height = This.Height
.Left = 0
.Top = 0
.Width = This.Width
Endwith
*
With This.imgIcon
.Height = 24
.Left = 3
.Top = 4
.Width = 24
Endwith
*
With This.lblCaption
.Height = 16
.Left = 31
.Top = 8
.Width = This.Width - 34
Endwith
Endif
ENDPROC
PROCEDURE setimages && Internal to the class.
Lparameters llFocus
With This
If This.Type==0
If llFocus
.imgBackgroundLeft.Picture = .ImgLeftFocused
.imgBackgroundMiddle.Picture = .ImgMiddleFocused
.imgBackgroundRight.Picture = .ImgRightFocused
Else
.imgBackgroundLeft.Picture = .ImgLeftNotFocused
.imgBackgroundMiddle.Picture = .ImgMiddleNotFocused
.imgBackgroundRight.Picture = .ImgRightNotFocused
Endif
Else
Store llFocus To ;
.imgBackgroundLeft.Visible, ;
.imgBackgroundMiddle.Visible, ;
.imgBackgroundRight.Visible
Endif
If llFocus
.lblCaption.ForeColor = .LblFocusedColor
Else
.lblCaption.ForeColor = .LblNotFocusedColor
Endif
.cmdFocus.Visible = .F.
.cmdFocus.Visible = .T.
Endwith
ENDPROC
PROCEDURE cmdFocus.Click
This.Parent.Click()
ENDPROC
PROCEDURE cmdFocus.KeyPress
Lparameters nKeyCode, nShiftAltCtrl
If nKeyCode==13
Nodefault
This.Parent.Click()
Endif
ENDPROC
PROCEDURE shpMouseHandler.Click
This.Parent.cmdFocus.SetFocus()
This.Parent.Click()
ENDPROC
PROCEDURE shpMouseHandler.MouseEnter
Lparameters nButton, nShift, nXCoord, nYCoord
This.Parent.SetImages(.T.)
ENDPROC
PROCEDURE shpMouseHandler.MouseLeave
Lparameters nButton, nShift, nXCoord, nYCoord
This.Parent.SetImages(.F.)
ENDPROC
ENDDEFINE

4557
utile/ctl32/ctl32.h Normal file

File diff suppressed because it is too large Load Diff

39
utile/ctl32/ctl32.prg Normal file
View File

@@ -0,0 +1,39 @@
********************************************************************************
*!* ctl32.prg
********************************************************************************
*!* This is the main file for the ctl32 classes. This gets called by
*!* each and every class in the Init event.
#Include ctl32.h
*!* Adding this file location to the path list. ADDITIVE is not used, it seems
*!* to have problems with expressions, so to avoid using macro substitution:
If .F.
Local m.lcPath As String
m.lcPath = Addbs(Justpath(Sys(16)))
If Empty(Set("Path")) Then
Set Path To (m.lcPath)
Else
If Not m.lcPath $ Set("Path") Then
Set Path To (Set("Path") + ";" + m.lcPath)
Endif
Endif
*!* Load the main visual classes VCX file:
If Not "CTL32.VCX" $ Upper(Set("Classlib")) Then
Set Classlib To m.lcPath + "ctl32.vcx" Additive
Endif
Endif
*!* Load ctl32 modules:
Do ctl32_api.prg
Do ctl32_classes.prg
Do ctl32_functions.prg
Do ctl32_structures.prg
Do ctl32_vfp2c32.prg
Return

25
utile/ctl32/ctl32.txt Normal file
View File

@@ -0,0 +1,25 @@
ctl32 Classes README FILE - Carlos Alloatti - calloatti@gmail.com
ctl32_scontainer scrollable container by Carlos Alloatti & Malcolm Greene
http://www.ctl32.com.ar/
TESTED ONLY IN VFP9, Windows 2000, XP, Vista
This classes are free to use, please contribute reporting bugs,
proposing changes and updates.
To use these classes you only need the following files added them to your project:
ctl32.h (excluded)
ctl32.prg
ctl32.vct
ctl32.vcx
ctl32_api.prg
ctl32_classes.prg
ctl32_functions.prg
ctl32_structures.prg
ctl32_vfp2c32.prg
vfpx.vct
vfpx.vcx

3282
utile/ctl32/ctl32.vc2 Normal file

File diff suppressed because it is too large Load Diff

1956
utile/ctl32/ctl32_api.prg Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,594 @@
********************************************************************************
*!* ctl32_classes.prg
********************************************************************************
#Include ctl32.h
If Not Sys(16) $ Upper(Set("Procedure")) Then
Set Procedure To Sys(16) Additive
Endif
********************************************************************************
Define Class ctl32_menu As Custom
Height = 0
MenuId = 0
Protected _MemberData
_MemberData = '<VFPData>' + ;
'<memberdata name="" type="property" display=""/>' + ;
'</VFPData>'
Enddefine
********************************************************************************
Define Class ctl32_menuitem As Custom
BarBreak = ""
Break = ""
CanRaiseEvents = ""
Caption = ""
Checked = FALSE
Container = ""
DefaultItem = FALSE
DesignMode = ""
Enabled = FALSE
Events = ""
MenuId = 0
Index = ""
IsParent = ""
MdiList = ""
MdiListItem = ""
MenuId = 0
MenuItems = ""
MergeOrder = ""
MergeType = ""
Mnemonic = ""
Name = "MenuItem"
OwnerDrawn = ""
RadioCheck = FALSE
Shortcut = ""
ShowShortcut = ""
Site = ""
Tag = ""
Visible = ""
ItemID = 0
Picture = ""
PictureObject = FALSE
PictureId = 0
DisabledPicture = ""
DisabledPictureObject = FALSE
DisabledPictureId = 0
DownPicture = ""
DownPictureObject = FALSE
DownPictureId = 0
SubMenuId = 0
Protected _MemberData
_MemberData = '<VFPData>' + ;
'<memberdata name="" type="property" display=""/>' + ;
'</VFPData>'
Procedure SubMenuId_Assign
Lparameters m.vNewVal
*!* Destroy any previous submenu:
If This.SubMenuId > 0 Then
apiDestroyMenu(This.SubMenuId)
Endif
This.SubMenuId = m.vNewVal
If This.ItemID = 0 Then
Return
Endif
*!* update menu item submenu info:
Local ;
m.lcMenuItemInfo As String,;
m.loMenuItemInfo As _MENUITEMINFO
m.loMenuItemInfo = Createobject("_MENUITEMINFO")
m.loMenuItemInfo.fMask = MIIM_SUBMENU
m.loMenuItemInfo.hSubMenu = This.SubMenuId
m.lcMenuItemInfo = m.loMenuItemInfo.Value
apiSetMenuItemInfo(This.MenuId, This.ItemID, MF_BYCOMMAND, @m.lcMenuItemInfo)
m.loMenuItemInfo = .Null.
Release m.loMenuItemInfo
Endproc
Procedure Picture_Assign
Lparameters m.vNewVal
*!* Here we store the value to use, HBMMENU_CALLBACK
*!* If a numeric system bitmap is choosen, we use that
Local m.hbmpItem As Integer
m.hbmpItem = 0
Do Case
Case Vartype(m.vNewVal) = "N"
This.Picture = ""
This.PictureId = m.vNewVal
m.hbmpItem = This.PictureId
Case Vartype(m.vNewVal) = "C"
This.Picture = m.vNewVal
If File(m.vNewVal)
This.PictureObject = LoadPicture(m.vNewVal)
This.PictureId = This.PictureObject.Handle
Else
This.PictureId = 0
Endif
If ctlGetOsVersion() < NTDDI_VISTA
m.hbmpItem = HBMMENU_CALLBACK
Endif
Otherwise
This.Picture = ""
This.PictureId = 0
If ctlGetOsVersion() < NTDDI_VISTA
m.hbmpItem = HBMMENU_CALLBACK
Endif
Endcase
If This.ItemID = 0 Then
Return
Endif
Local m.lcMenuItemInfo As String
Local m.loMenuItemInfo As _MENUITEMINFO
m.loMenuItemInfo = Createobject("_MENUITEMINFO")
m.loMenuItemInfo.fMask = MIIM_BITMAP
m.loMenuItemInfo.hbmpItem = m.hbmpItem
m.lcMenuItemInfo = m.loMenuItemInfo.Value
apiSetMenuItemInfo(This.MenuId, This.ItemID, MF_BYCOMMAND, @m.lcMenuItemInfo)
m.loMenuItemInfo = .Null.
Endproc
Procedure Caption_Assign
Lparameters vNewVal
This.Caption = m.vNewVal
Endproc
Procedure Caption_Access
Return This.Caption
Endproc
Procedure DefaultItem_Assign
Lparameters vNewVal
If Vartype(m.vNewVal) = "N" Then
If m.vNewVal = 0 Then
m.vNewVal = FALSE
Else
m.vNewVal = TRUE
Endif
Endif
This.DefaultItem = m.vNewVal
If This.ItemID = 0 Then
Return
Endif
If This.DefaultItem = TRUE Then
apiSetMenuDefaultItem(This.MenuId, This.ItemID, MF_BYCOMMAND)
Else
apiSetMenuDefaultItem(This.MenuId, -1, MF_BYPOSITION)
Endif
Endproc
Procedure Enabled_Assign
Lparameters vNewVal
If Vartype(m.vNewVal) = "N" Then
If m.vNewVal = 0 Then
m.vNewVal = FALSE
Else
m.vNewVal = TRUE
Endif
Endif
This.Enabled = m.vNewVal
If This.ItemID = 0 Then
Return
Endif
If This.Enabled = TRUE Then
apiEnableMenuItem(This.MenuId, This.ItemID, Bitor(MF_BYCOMMAND, MF_ENABLED))
Else
apiEnableMenuItem(This.MenuId, This.ItemID, Bitor(MF_BYCOMMAND, MF_GRAYED))
Endif
Endproc
Procedure Checked_Assign
Lparameters vNewVal
If Vartype(m.vNewVal) = "N" Then
If m.vNewVal = 0 Then
m.vNewVal = FALSE
Else
m.vNewVal = TRUE
Endif
Endif
This.Checked = m.vNewVal
If This.ItemID = 0 Then
Return
Endif
If This.Checked = TRUE Then
apiCheckMenuItem(This.MenuId, This.ItemID , Bitor(MF_BYCOMMAND, MF_CHECKED))
Else
apiCheckMenuItem(This.MenuId, This.ItemID , Bitor(MF_BYCOMMAND, MF_UNCHECKED))
Endif
Endproc
Procedure RadioCheck_Assign
Lparameters vNewVal
If Vartype(m.vNewVal) = "N" Then
If m.vNewVal = 0 Then
m.vNewVal = FALSE
Else
m.vNewVal = TRUE
Endif
Endif
This.RadioCheck = m.vNewVal
If This.ItemID = 0 Then
Return
Endif
*!* Get current fType, we set fMask to MIIM_FTYPE
Local ;
m.lcMenuItemInfo As String, ;
m.loMenuItemInfo As _MENUITEMINFO, ;
m.lfType As Integer
m.loMenuItemInfo = Createobject("_MENUITEMINFO")
*!* Build MenuItemInfo structure:
m.loMenuItemInfo.fMask = MIIM_FTYPE
m.lcMenuItemInfo = m.loMenuItemInfo.Value
If apiGetMenuItemInfo(This.MenuId, This.ItemID , MF_BYCOMMAND, @m.lcMenuItemInfo) <> 0 Then
m.loMenuItemInfo.Value = m.lcMenuItemInfo
If This.RadioCheck = TRUE Then
m.loMenuItemInfo.fType = Bitor(MFT_RADIOCHECK, m.loMenuItemInfo.fType)
Else
m.loMenuItemInfo.fType = Bitxor(MFT_RADIOCHECK, Bitor(MFT_RADIOCHECK, m.loMenuItemInfo.fType))
Endif
m.lcMenuItemInfo = m.loMenuItemInfo.Value
apiSetMenuItemInfo(This.MenuId, This.ItemID , MF_BYCOMMAND, m.lcMenuItemInfo)
m.loMenuItemInfo = .Null.
Endif
Endproc
Enddefine
********************************************************************************
Define Class ctl32_statusbar_panel As Custom
Height = 16
Width = 120
*-- Specifies the icon displayed for a Form at run time when the Form is minimized.
ctlicon = ""
ctlcaption = ""
ctlformat = 0
*-- Specifies the text that appears as a ToolTip for a control.
ctltooltiptext = ""
ctlindex = 0
*-- Right x value position for Panel
_right = -1
_oicon = ""
*-- Specifies if an object is visible or hidden.
ctlvisible = .T.
*-- Specifies if a control is automatically resized to fit its contents.
ctlautosize = .T.
_width = 0
*-- Specifies the alignment of text associated with a control.
ctlalignment = 0
ctlwidth = ""
ctlname = ""
Name = "ctl32_statusbar_panel"
Procedure ctlIcon_assign
Lparameters vNewVal
Local lnHandle
This.ctlicon = m.vNewVal
This._oicon = .Null.
*!* 2006-07-17 Now takes icon handle too //Anton
Do Case
Case Vartype(This.ctlicon) = T_NUMERIC
m.lnHandle = m.vNewVal
Case Vartype(This.ctlicon) = T_CHARACTER And File(This.ctlicon)
This._oicon = LoadPicture(This.ctlicon)
m.lnHandle = This._oicon.Handle
Otherwise
m.lnHandle = 0
Endcase
apiSendMessageInteger(This.Parent._ControlHWnd, SB_SETICON, This.ctlindex, m.lnHandle)
If This.Parent._ControlHWnd <> 0 And This.ctlindex <> 0 And This.Parent._Creating = FALSE Then
This.Parent.ctlResizePanels()
Endif
Endproc
Procedure ctlcaption_assign
Lparameters vNewVal
*!* 2006-06-27 Added Transform()
This.ctlcaption = Alltrim(Transform(m.vNewVal))
Local lcPadLeft, lcPadRight, lcCaption
m.lcCaption = m.vNewVal
*!* we add spaces so text does not fit and tooltips show
Do Case
Case This.ctlalignment = 1 And This.ctlautosize = FALSE && Right
m.lcPadLeft = TABCHAR + TABCHAR
m.lcPadRight = Space(1)
Case This.ctlalignment = 2 And This.ctlautosize = FALSE && Center
m.lcPadLeft = TABCHAR
m.lcPadRight = Space(0)
Otherwise && Left
m.lcPadLeft = Space(0)
m.lcPadRight = Space(10)
*!* Add one space to left if this is PanelMessage and
*!* ctlAlignment is left, so it separates the text a little from border
If This.ctlindex = 0
m.lcPadLeft = m.lcPadLeft + Space(1)
Endif
Endcase
*!* If changing indicator panels Caption, let tmrUpdater update captions:
If This.Name = "PanelOvr" Then
This.Parent._OldOVR = Not Insmode()
Endif
If This.Name = "PanelNum" Then
This.Parent._OldNUM = Not Numlock()
Endif
If This.Name = "PanelCaps" Then
This.Parent._OldCAPS = Not Capslock()
Endif
*!* If setting Caption for Message Panel
If This.ctlindex = 0
This.Parent._OldMessage = Sys(2015)
Endif
m.lcCaption = m.lcPadLeft + m.lcCaption + m.lcPadRight + NULA
*!* Do not set Panel Caption for ProgressBar:
If This.ctlindex <> 1 Then
apiSendMessageString(This.Parent._ControlHWnd, SB_SETTEXTA, This.ctlindex , m.lcCaption)
Endif
If This.Parent._ControlHWnd <> 0 And This.ctlindex <> 0 And This.Parent._Creating = FALSE Then
This.Parent.ctlResizePanels()
Endif
Endproc
Procedure ctlformat_assign
*!* Property only valid for PanelDate
Lparameters vNewVal
This.ctlformat = m.vNewVal
If This.Name = "PanelDate" Then
If This.ctlformat > 0 Then
This.ctlcaption = ctlGetDateFormat(This.ctlformat)
Else
This.ctlcaption = ""
Endif
Endif
Endproc
Procedure ctltooltiptext_assign
Lparameters vNewVal
This.ctltooltiptext = m.vNewVal
If Len(m.vNewVal) > 0 Then
m.vNewVal = Space(1) + This.ctltooltiptext + Space(1)
Endif
apiSendMessageString(This.Parent._ControlHWnd,SB_SETTIPTEXTA, This.ctlindex, m.vNewVal)
Endproc
Procedure ctlvisible_assign
Lparameters vNewVal
If Vartype(m.vNewVal) = "N" Then
If m.vNewVal = 0 Then
m.vNewVal = FALSE
Else
m.vNewVal = TRUE
Endif
Endif
If Vartype(m.vNewVal) <> "L" Then
Messagebox("Parameter must be Logical: " + Program(), 16)
Return
Endif
This.ctlvisible = m.vNewVal
If This.Parent._ControlHWnd <> 0 And This.Parent._Creating = FALSE Then
This.Parent.ctlResizePanels()
Endif
Endproc
*-- Called when creating the statusbar to update all data of Panels
Procedure _updateall
This.ctlcaption = This.ctlcaption
This.ctlformat = This.ctlformat
This.ctlicon = This.ctlicon
This.ctltooltiptext = This.ctltooltiptext
This.ctlvisible = This.ctlvisible
Endproc
Procedure ctlautosize_assign
Lparameters vNewVal
If Vartype(m.vNewVal) = "N" Then
If m.vNewVal = 0 Then
m.vNewVal = FALSE
Else
m.vNewVal = TRUE
Endif
Endif
*!* Index 0 is first Panel, PanelMessage, that should always have ctlAutosize = FALSE
If This.ctlindex = 0 Then
This.ctlautosize = FALSE
Else
This.ctlautosize = m.vNewVal
*!* Reset caption to get rid of center/right codes if ctlAutosize is TRUE
This.ctlcaption = This.ctlcaption
Endif
Endproc
Procedure ctlalignment_assign
Lparameters vNewVal
This.ctlalignment = m.vNewVal
*!* If message panel, force update
If This.ctlindex = 0
This.Parent._OldMessage = Sys(2015)
Endif
This.ctlcaption = This.ctlcaption
Endproc
Procedure ctlname_access
Return This.Name
Endproc
Procedure ctlname_assign
Lparameters vNewVal
This.Name = m.vNewVal
Endproc
Procedure ctlwidth_access
Return This.Width
Endproc
Procedure ctlwidth_assign
Lparameters vNewVal
This.Width = m.vNewVal
Endproc
Procedure Destroy
This._oicon = .Null.
Endproc
Enddefine
********************************************************************************
Define Class ctl32_statusbar_toolbar As Toolbar
Caption = "ctl32_statusbar_toolbar"
Height = 16
Left = 0
Top = 51
Visible = .F.
Width = 32028
ShowWindow = 1
Name = "ctl32_statusbar_toolbar"
Add Object ctlHeightShape As Shape With ;
Top = 3, ;
Left = 5, ;
Height = 13, ;
Width = 16384, ;
Name = "ctlHeightShape"
Procedure Init
*!* Hide the toolbar thru API so it is still there but invisible
With This
.Dock(TOOL_BOTTOM, 0, 0)
.Visible = TRUE
apiShowWindow(.HWnd, SW_HIDE)
Endwith
Endproc
Procedure ctlHeightShape.Click
This.Parent.Dock(3, 0, 0)
Endproc
Procedure ctlHeightShape.Init
If ctlGetOsVersion() >= NTDDI_VISTA && Vista
This.Height = 13
Else
This.Height = 17
Endif
Endproc
Enddefine
********************************************************************************
Define Class ctl32_statusbar_timer As Timer
Height = 23
Width = 23
Interval = 100
_Interval = 100
_IntervalTrace = 10000
Name = "ctl32_statusbar_timer"
Procedure Timer
*!* 20070701 Added trace aware timer, suggested by ajh
If Wvisible("trace") Or ;
Wvisible("debugger") Or ;
Wvisible("call") Or ;
Wvisible("watch") Or ;
Wvisible("locals")
If This.Interval # This._IntervalTrace
This.Interval = This._IntervalTrace
Endif
Else
If This.Interval # This._Interval
This.Interval = This._Interval
Endif
Endif
This.Parent.ctlUpdatePanels()
Endproc
Enddefine
********************************************************************************
*!* END ctl32_classes
********************************************************************************

View File

@@ -0,0 +1,212 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="ctl32_common.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS _util AS custom
*< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" />
#INCLUDE "ctl32.h"
*<DefinedPropArrayMethod>
*m: _hinstance
*m: _hosthwnd
*m: _isthemeactive
*m: _objtoclient
*m: _osversion
*m: _strformatbytesize
*m: _themestatus
*m: _vfpwndproc
*p: ctlabout
*p: ctlversion
*</DefinedPropArrayMethod>
*<PropValue>
ctlabout = ctl32_util - Carlos Alloatti
ctlversion = 20061010
Name = "_util"
*</PropValue>
PROCEDURE Init
Local Array laDeclaredDlls(1,3)
Local lnLen
m.lnLen = Adlls(m.laDeclaredDlls)
*!* win32api is used instead of the library name, check these:
*!* blogs.msdn.com/calvin_hsia/archive/2006/04/27/585305.aspx
*!* blogs.msdn.com/calvin_hsia/archive/2006/04/24/582479.aspx
*!* "User32.dll, Gdi32.dll, Kernel32.dll , Advapi32.dll and Mpr.dll are searched (in that order)"
If Ascan(m.laDeclaredDlls, [GetWindowLong], 1, m.lnLen , 2, 15) = 0
Declare Integer GetWindowLong In win32api As GetWindowLong;
Integer HWnd, ;
Integer nIndex
Endif
If This._OSVersion() >= CON_OS_WINXP Then
If Ascan(m.laDeclaredDlls, [IsThemeActive], 1, m.lnLen , 2, 15) = 0
Declare Integer IsThemeActive In uxtheme.Dll As IsThemeActive
Endif
Endif
If Ascan(m.laDeclaredDlls, [StrFormatByteSize], 1, m.lnLen , 2, 15) = 0
Declare Integer StrFormatByteSize In shlwapi;
integer dw,;
string szBuf,;
integer uiBufSize
Endif
ENDPROC
PROCEDURE _hinstance
*!* The GetWindowLong function retrieves information about the specified window.
*!* GWL_HINSTANCE retrieves a handle to the application instance.
Return GetWindowLong(_vfp.HWnd, GWL_HINSTANCE)
ENDPROC
PROCEDURE _hosthwnd
*!* the control must have a parent window. In the case of a standard form, its the
*!* hWnd of the form. If we have a Top Level Form, we have
*!* to find the hWnd of the "inner" window of the Form
Local m.nhwnd
If ThisForm.ShowWindow = CON_SHOWWIN_ASTOPLEVELFORM Or ThisForm.ScrollBars > 0 Then
*!* Get hWnd of client window of Top Level Form //Craig Boyd//
#If Version(CON_VER_NUM) >= 900
m.nhwnd = Sys(2327, Sys(2325, Sys(2326, ThisForm.HWnd)))
#Else
m.nhwnd = GetWindow(ThisForm.HWnd, GW_CHILD)
#Endif
Else
m.nhwnd = ThisForm.HWnd
Endif
Return m.nhwnd
ENDPROC
PROCEDURE _isthemeactive
*!* Tests if a visual style for the current application is active.
Return (This._OSVersion() >= CON_OS_WINXP) And (IsThemeActive() = 1)
ENDPROC
PROCEDURE _objtoclient
*!* This replaces OBJTOCLIENT that has bugs with pageframes
Parameters toControl, tcPosition
Local lnPosition As Integer
m.tcPosition = Upper(m.tcPosition)
m.lnPosition = 0
Do Case
Case m.tcPosition $ [TB]
Do While Not Upper(m.toControl.BaseClass) == [FORM]
If Pemstatus(m.toControl, [Top], CON_PEMSTAT_DEFINED) Then
m.lnPosition = m.lnPosition + m.toControl.Top
Endif
If Upper(m.toControl.BaseClass) == [PAGE] Then
If m.toControl.Parent.TabOrientation = CON_TABOR_TOP Then && Top
m.lnPosition = m.lnPosition + ;
m.toControl.Parent.Height - ;
m.toControl.Parent.PageHeight - ;
m.toControl.Parent.BorderWidth * 2
Else
m.lnPosition = m.lnPosition + 1
Endif
Endif
m.toControl = m.toControl.Parent
Enddo
If m.tcPosition == [B] Then
m.lnPosition = m.lnPosition + This.Height
Endif
Case m.tcPosition $ [LR]
Do While Not Upper(m.toControl.BaseClass) == [FORM]
If Pemstatus(m.toControl, [Left], CON_PEMSTAT_DEFINED) Then
m.lnPosition = m.lnPosition + m.toControl.Left
Endif
If Upper(m.toControl.BaseClass) == [PAGE]
If m.toControl.Parent.TabOrientation = CON_TABOR_LEFT Then && Left
m.lnPosition = m.lnPosition + ;
m.toControl.Parent.Width - ;
m.toControl.Parent.PageWidth - ;
m.toControl.Parent.BorderWidth * 2
Else
m.lnPosition = m.lnPosition + 1
Endif
Endif
m.toControl = m.toControl.Parent
Enddo
If m.tcPosition == [R] Then
m.lnPosition = m.lnPosition + This.Width
Endif
Endcase
Return m.lnPosition
ENDPROC
PROCEDURE _osversion
*!* Returns a numeric value representing the operating system version
*!* Check ctl32.h for possible values
*!* ie CON_OS_WINXPSP2 = 5010200
Return Val(Os(3)) * 1000000 + Val(Os(4)) * 10000 + Val(Os(8)) * 100 + Val(Os(9))
ENDPROC
PROCEDURE _strformatbytesize
*!* Converts a numeric value into a string that represents the number expressed
*!* as a size value in bytes, kilobytes, megabytes, or gigabytes, depending on the size.
Lparameters tnSize
Local lcBuffer
m.lcBuffer = Space(254)
StrFormatByteSize(m.tnSize, @m.lcBuffer, Len(m.lcBuffer))
m.lcBuffer = Alltrim(m.lcBuffer)
* Remove chr(0)
m.lcBuffer = Left(m.lcBuffer, Len(m.lcBuffer)-1)
Return m.lcBuffer
ENDPROC
PROCEDURE _themestatus
*!* Returns the global status of Themes for a VFP Form
Return ;
This._OSVersion() >= CON_OS_WINXP ;
And IsThemeActive() = 1 ;
And _Screen.Themes ;
And Thisform.Themes
ENDPROC
PROCEDURE _vfpwndproc
*!* The GetWindowLong function retrieves information about the specified window.
*!* GWL_WNDPROC retrieves the address of the window procedure,
*!* or a handle representing the address of the window procedure.
*!* You must use the CallWindowProc function to call the window procedure.
Return GetWindowLong(_vfp.HWnd, GWL_WNDPROC)
ENDPROC
ENDDEFINE

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,52 @@
*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="ctl32_statusbar_fals.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS ctl32_statusbar AS custom
*< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" />
*<DefinedPropArrayMethod>
*m: ctlclick
*m: newtooltip
*p: ctlicon
*p: ctlmessage
*a: ctlpanels[10,0]
*</DefinedPropArrayMethod>
*<PropValue>
ctlicon =
ctlmessage =
Name = "ctl32_statusbar"
*</PropValue>
PROCEDURE ctlclick
ENDPROC
PROCEDURE Init
Lparameters tnPanelCount
For I = 1 To tnPanelCount
This.ctlpanels(I) = Newobject("ctl32_statusbar_panel","ctl32_statusbar_fals")
Endfor
ENDPROC
PROCEDURE newtooltip
ENDPROC
ENDDEFINE
DEFINE CLASS ctl32_statusbar_panel AS custom
*< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" />
*<DefinedPropArrayMethod>
*p: ctlcaption
*</DefinedPropArrayMethod>
*<PropValue>
ctlcaption =
Name = "ctl32_statusbar_panel"
*</PropValue>
ENDDEFINE

Some files were not shown because too many files have changed in this diff Show More