diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..e7a8e93 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,19 @@ +# AGENTS.md + + +Regulile complete de lucru ROA (livrare, comentarii, modificari minime, testare, delegare): `COMUN\docs\reguli_lucru.md`. Punctul 7 ruteaza fiecare zona atinsa. + +Backstop de rutare: cand atingi o zona de mai jos, incarca skill-ul care o detine (el are +procedura si criteriile care blocheaza "gata"); docurile sunt doar referinta conditionata a +skill-ului. + +- editezi `.vc2`/`.sc2`/`.prg` cu diacritice, cauti in `.vcx`/`.scx`, adaugi membri de clasa -> skill `roa-vfp-text-edit` +- rulezi sau depanezi teste headless ori UI -> skill `roa-vfp-headless-test` +- commit / `svn update` / `roa_sync` in COMUN -> skill `roa-git-svn-commit` +- scrii sau publici scripturi de migrare Oracle, reexporti un pachet -> skill `roa-oracle-migration` +- actualizarea ROA nu se termina sau tablespace plin -> skill `roa-oracle-diagnostic` +- acces la un Oracle de productie (tunel SSH + TNS + DSN) -> skill `roa-oracle-production-access` +- garzi pe valori NULL din Oracle in VFP -> skill `roa-vfp-null-guards` +- `GO` pe un `Recno()` capturat sau primit ca parametru -> skill `roa-vfp-go-recno` +- procedura PL/SQL cu `SELECT ... INTO` apelata din VFP (randuri pierdute tacut) -> skill `roa-oracle-sqlexec-no-data` + diff --git a/CLAUDE.md b/CLAUDE.md index fc60aca..a69811c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,3 +37,21 @@ Indexul (`_symbols.tsv`) se reconstruiește singur când textul e mai nou, deci ## Reguli de lucru si testare Înainte de orice modificare de cod sau testare, citește `COMUN\docs\reguli_lucru.md` (obligatoriu — reguli de livrare, diff ca fișier + aprobare înainte de write-back, convenții per zonă). Fără commit fără review: Marius vede întâi diff-ul. + + +Regulile complete de lucru ROA (livrare, comentarii, modificari minime, testare, delegare): `COMUN\docs\reguli_lucru.md`. Punctul 7 ruteaza fiecare zona atinsa. + +Backstop de rutare: cand atingi o zona de mai jos, incarca skill-ul care o detine (el are +procedura si criteriile care blocheaza "gata"); docurile sunt doar referinta conditionata a +skill-ului. + +- editezi `.vc2`/`.sc2`/`.prg` cu diacritice, cauti in `.vcx`/`.scx`, adaugi membri de clasa -> skill `roa-vfp-text-edit` +- rulezi sau depanezi teste headless ori UI -> skill `roa-vfp-headless-test` +- commit / `svn update` / `roa_sync` in COMUN -> skill `roa-git-svn-commit` +- scrii sau publici scripturi de migrare Oracle, reexporti un pachet -> skill `roa-oracle-migration` +- actualizarea ROA nu se termina sau tablespace plin -> skill `roa-oracle-diagnostic` +- acces la un Oracle de productie (tunel SSH + TNS + DSN) -> skill `roa-oracle-production-access` +- garzi pe valori NULL din Oracle in VFP -> skill `roa-vfp-null-guards` +- `GO` pe un `Recno()` capturat sau primit ca parametru -> skill `roa-vfp-go-recno` +- procedura PL/SQL cu `SELECT ... INTO` apelata din VFP (randuri pierdute tacut) -> skill `roa-oracle-sqlexec-no-data` + diff --git a/Clase/ofundal_registratura.vc2 b/Clase/ofundal_registratura.vc2 index d76c20f..526184e 100644 --- a/Clase/ofundal_registratura.vc2 +++ b/Clase/ofundal_registratura.vc2 @@ -161,8 +161,11 @@ DEFINE CLASS pg_meniu_princ AS pg_meniu OF "..\comun\clase\ofundal.vcx" grid_registratura.cPers_contact.Name = "cPers_contact", ; grid_registratura.cPers_contact.Text1.Name = "Text1", ; grid_registratura.Name = "grid_registratura", ; + grid_registratura.RecordMark = .T., ; Ck_data.Alignment = 0, ; + Ck_data.Left = 117, ; Ck_data.Name = "Ck_data", ; + Ck_data.Top = 46, ; But_nou1.Name = "But_nou1", ; But_sterge1.Name = "But_sterge1", ; Clb_tx_simplu1.Lb_simplu1.Name = "Lb_simplu1", ; @@ -173,14 +176,18 @@ DEFINE CLASS pg_meniu_princ AS pg_meniu OF "..\comun\clase\ofundal.vcx" Ck_nume.Alignment = 0, ; Ck_nume.Name = "Ck_nume", ; Ck_numar.Alignment = 0, ; + Ck_numar.Left = 117, ; Ck_numar.Name = "Ck_numar", ; + Ck_numar.Top = 32, ; Cmd_reset1.Name = "Cmd_reset1", ; Cmd_cauta1.Name = "Cmd_cauta1", ; _lbbase1.Name = "_lbbase1", ; Ck_tipdoc.Alignment = 0, ; Ck_tipdoc.Name = "Ck_tipdoc", ; Ck_sters.Alignment = 0, ; - Ck_sters.Name = "Ck_sters" + Ck_sters.Left = 203, ; + Ck_sters.Name = "Ck_sters", ; + Ck_sters.Top = 32 *< END OBJECT: ClassLib="ferestre_registratura.vcx" BaseClass="container" /> ADD OBJECT 'Page3.CT_DATE_GENERALE1' AS ct_date_generale WITH ; diff --git a/Clase/registry.vc2 b/Clase/registry.vc2 new file mode 100644 index 0000000..bcd1391 --- /dev/null +++ b/Clase/registry.vc2 @@ -0,0 +1,924 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.21" SourceFile="registry.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +* +* +DEFINE CLASS filereg AS registry OF "registry.vcx" + *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> + + #INCLUDE "registry.h" + * + *m: getapplication && Retrieves application key. + *m: getapppath && Checks and returns path of application associated with a particular extension (e.g., XLS, DOC). + *m: getlatestversion && Returns latest version for a specified application. + * + + * + Name = "filereg" + * + + PROCEDURE getapplication && Retrieves application key. + LPARAMETERS cExtnKey,cAppKey,lServer + + LOCAL nErrNum,cOptName + cOptName = "" + + * lServer - checking for OLE server. + IF TYPE("m.lServer") = "L" AND m.lServer + THIS.cAppPathKey = OLE_PATH_KEY + ELSE + THIS.cAppPathKey = APP_PATH_KEY + ENDIF + + * Open extension app key + m.nErrNum = THIS.OpenKey(m.cExtnKey+THIS.cAppPathKey) + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Get application path + nErrNum = THIS.GetKeyValue(cOptName,@cAppKey) + + * Close application path key + THIS.CloseKey() + + RETURN m.nErrNum + + ENDPROC + + PROCEDURE getapppath && Checks and returns path of application associated with a particular extension (e.g., XLS, DOC). + * Checks and returns path of application + * associated with a particular extension (e.g., XLS, DOC). + LPARAMETER cExtension,cExtnKey,cAppKey,lServer + LOCAL nErrNum,cOptName + cOptName = "" + + * Check Extension parameter + IF TYPE("m.cExtension") # "C" OR LEN(m.cExtension) > 3 + RETURN ERROR_BADPARM + ENDIF + m.cExtension = "."+m.cExtension + + * Open extension key + nErrNum = THIS.OpenKey(m.cExtension) + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Get key value for file extension + nErrNum = THIS.GetKeyValue(cOptName,@cExtnKey) + + * Close extension key + THIS.CloseKey() + + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + RETURN THIS.GetApplication(cExtnKey,@cAppKey,lServer) + + ENDPROC + + PROCEDURE getlatestversion && Returns latest version for a specified application. + LPARAMETER cClass,cExtnKey,cAppKey,lServer + + LOCAL nErrNum,cOptName + cOptName = "" + + * Open class key (e.g., Excel.Sheet) + nErrNum = THIS.OpenKey(m.cClass+CURVER_KEY) + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Get key value for file extension + nErrNum = THIS.GetKeyValue(cOptName,@cExtnKey) + + * Close extension key + THIS.CloseKey() + + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + RETURN THIS.GetApplication(cExtnKey,@cAppKey,lServer) + + ENDPROC + +ENDDEFINE + +DEFINE CLASS foxreg AS registry OF "registry.vcx" + *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> + + #INCLUDE "registry.h" + * + *m: enumfoxoptions + *m: getfoxoption && Retrieves an option from FoxPro registry settings. + *m: setfoxoption && Sets an option from FoxPro registry settings. + * + + * + Name = "foxreg" + * + + PROCEDURE enumfoxoptions + LPARAMETER aFoxOpts + RETURN THIS.EnumOptions(@aFoxOpts,THIS.cVFPOptPath,THIS.nUserKey,.F.) + + ENDPROC + + PROCEDURE getfoxoption && Retrieves an option from FoxPro registry settings. + LPARAMETER cOptName,cOptVal + RETURN THIS.GetRegKey(cOptName,@cOptVal,THIS.cVFPOptPath,THIS.nUserKey) + + ENDPROC + + PROCEDURE setfoxoption && Sets an option from FoxPro registry settings. + LPARAMETER cOptName,cOptVal + RETURN THIS.SetRegKey(cOptName,cOptVal,THIS.cVFPOptPath,THIS.nUserKey) + + ENDPROC + +ENDDEFINE + +DEFINE CLASS odbcreg AS registry OF "registry.vcx" + *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> + + #INCLUDE "registry.h" + * + *m: enumodbcdata && Enumerates through ODBC data sources. + *m: enumodbcdrvrs && Enumerates through ODBC drivers. + *m: getodbcdrvrs && Retrieves ODBC drivers. + *m: loadodbcfuncs && Loads ODBC registry functions. + * + + * + Name = "odbcreg" + * + + PROCEDURE enumodbcdata && Enumerates through ODBC data sources. + LPARAMETER aDrvrOpts,cDataSource + LOCAL cSourceKey + cSourceKey = ODBC_DATA_KEY+cDataSource + RETURN THIS.EnumOptions(@aDrvrOpts,m.cSourceKey,HKEY_CURRENT_USER,.F.) + + ENDPROC + + PROCEDURE enumodbcdrvrs && Enumerates through ODBC drivers. + LPARAMETER aDrvrOpts,cODBCDriver + LOCAL cSourceKey + cSourceKey = ODBC_DRVRS_KEY+m.cODBCDriver + RETURN THIS.EnumOptions(@aDrvrOpts,m.cSourceKey,HKEY_LOCAL_MACHINE,.F.) + + ENDPROC + + PROCEDURE getodbcdrvrs && Retrieves ODBC drivers. + LPARAMETERS aDrvrs,lDataSources + LOCAL nODBCEnv,nRetVal,dsn,dsndesc,mdsn,mdesc + + lDataSources = IIF(TYPE("m.lDataSources")="L",m.lDataSources,.F.) + + * Load API functions + nRetVal = THIS.LoadODBCFuncs() + IF m.nRetVal # ERROR_SUCCESS + RETURN m.nRetVal + ENDIF + + * Get ODBC environment handle + nODBCEnv=VAL(SYS(3053)) + + * -- Possible error messages + * 527 "cannot load odbc library" + * 528 "odbc entry point missing" + * 182 "not enough memory" + + IF INLIST(nODBCEnv,527,528,182) + * Failed + RETURN ERROR_ODBCFAIL + ENDIF + + DIMENSION aDrvrs[1,IIF(m.lDataSources,2,1)] + aDrvrs[1] = "" + + DO WHILE .T. + dsn=space(100) + dsndesc=space(100) + mdsn=0 + mdesc=0 + + * Return drivers or data sources + IF m.lDataSources + nRetVal = SQLDataSources(m.nODBCEnv,SQL_FETCH_NEXT,@dsn,100,@mdsn,@dsndesc,255,@mdesc) + ELSE + nRetVal = SQLDrivers(m.nODBCEnv,SQL_FETCH_NEXT,@dsn,100,@mdsn,@dsndesc,100,@mdesc) + ENDIF + + DO CASE + CASE m.nRetVal = SQL_NO_DATA + nRetVal = ERROR_SUCCESS + EXIT + CASE m.nRetVal # ERROR_SUCCESS AND m.nRetVal # 1 + EXIT + OTHERWISE + IF !EMPTY(aDrvrs[1]) + IF m.lDataSources + DIMENSION aDrvrs[ALEN(aDrvrs,1)+1,2] + ELSE + DIMENSION aDrvrs[ALEN(aDrvrs,1)+1,1] + ENDIF + ENDIF + dsn = ALLTRIM(m.dsn) + aDrvrs[ALEN(aDrvrs,1),1] = UPPER(LEFT(m.dsn,LEN(m.dsn)-1)) + IF m.lDataSources + dsndesc = ALLTRIM(m.dsndesc) + aDrvrs[ALEN(aDrvrs,1),2] = LEFT(m.dsndesc,LEN(m.dsndesc)-1) + ENDIF + ENDCASE + ENDDO + RETURN nRetVal + + ENDPROC + + PROCEDURE loadodbcfuncs && Loads ODBC registry functions. + IF THIS.lLoadedODBCs + RETURN ERROR_SUCCESS + ENDIF + + * Check API file containing functions + + IF EMPTY(THIS.cODBCDLLFile) + RETURN ERROR_NOODBCFILE + ENDIF + + LOCAL henv,fDirection,szDriverDesc,cbDriverDescMax + LOCAL pcbDriverDesc,szDriverAttributes,cbDrvrAttrMax,pcbDrvrAttr + LOCAL szDSN,cbDSNMax,pcbDSN,szDescription,cbDescriptionMax,pcbDescription + + DECLARE Short SQLDrivers IN (THIS.cODBCDLLFile) ; + Integer henv, Integer fDirection, ; + String @ szDriverDesc, Integer cbDriverDescMax, Integer pcbDriverDesc, ; + String @ szDriverAttributes, Integer cbDrvrAttrMax, Integer pcbDrvrAttr + + IF THIS.lhaderror && error loading library + RETURN -1 + ENDIF + + DECLARE Short SQLDataSources IN (THIS.cODBCDLLFile) ; + Integer henv, Integer fDirection, ; + String @ szDSN, Integer cbDSNMax, Integer @ pcbDSN, ; + String @ szDescription, Integer cbDescriptionMax,Integer pcbDescription + + THIS.lLoadedODBCs = .T. + + RETURN ERROR_SUCCESS + + ENDPROC + +ENDDEFINE + +DEFINE CLASS oldinireg AS registry OF "registry.vcx" + *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> + + #INCLUDE "registry.h" + * + *m: getinientry && Retrieves information from INI entry. + *m: getinisection && Retrieves information from INI section. + *m: loadinifuncs && Loads functions needed for reading INI files. + *m: writeinientry && Writes a specific INI entry. + * + + * + Name = "oldinireg" + * + + PROCEDURE getinientry && Retrieves information from INI entry. + LPARAMETER cValue,cSection,cEntry,cINIFile + + * Get entry from INI file + LOCAL cBuffer,nBufSize,nErrNum,nTotParms + nTotParms = PCOUNT() + + * Load API functions + nErrNum= THIS.LoadINIFuncs() + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Parameter checks here + IF m.nTotParms < 3 + m.cEntry = 0 + ENDIF + + m.cBuffer=space(2000) + + IF EMPTY(m.cINIFile) + * WIN.INI file + m.nBufSize = GetWinINI(m.cSection,m.cEntry,"",@cBuffer,LEN(m.cBuffer)) + ELSE + * Private INI file + m.nBufSize = GetPrivateINI(m.cSection,m.cEntry,"",@cBuffer,LEN(m.cBuffer),m.cINIFile) + ENDIF + + IF m.nBufSize = 0 &&could not find entry in INI file + RETURN ERROR_NOINIENTRY + ENDIF + + m.cValue=LEFT(m.cBuffer,m.nBufSize) + + ** All is well + RETURN ERROR_SUCCESS + + ENDPROC + + PROCEDURE getinisection && Retrieves information from INI section. + LPARAMETERS aSections,cSection,cINIFile + LOCAL cINIValue, nTotEntries, i, nLastPos + cINIValue = "" + IF TYPE("m.cINIFile") # "C" + cINIFile = "" + ENDIF + + IF THIS.GetINIEntry(@cINIValue,cSection,0,m.cINIFile) # ERROR_SUCCESS + RETURN ERROR_FAILINI + ENDIF + + nTotEntries=OCCURS(CHR(0),m.cINIValue) + DIMENSION aSections[m.nTotEntries] + nLastPos = 1 + FOR i = 1 TO m.nTotEntries + nTmpPos = AT(CHR(0),m.cINIValue,m.i) + aSections[m.i] = SUBSTR(m.cINIValue,m.nLastPos,m.nTmpPos-m.nLastPos) + nLastPos = m.nTmpPos+1 + ENDFOR + + RETURN ERROR_SUCCESS + + ENDPROC + + PROCEDURE loadinifuncs && Loads functions needed for reading INI files. + * Loads funtions needed for reading INI files + IF THIS.lLoadedINIs + RETURN ERROR_SUCCESS + ENDIF + + DECLARE integer GetPrivateProfileString IN Win32API ; + AS GetPrivateINI string,string,string,string,integer,string + + IF THIS.lhaderror && error loading library + RETURN -1 + ENDIF + + DECLARE integer GetProfileString IN Win32API ; + AS GetWinINI string,string,string,string,integer + + DECLARE integer WriteProfileString IN Win32API ; + AS WriteWinINI string,string,string + + DECLARE integer WritePrivateProfileString IN Win32API ; + AS WritePrivateINI string,string,string,string + + THIS.lLoadedINIs = .T. + + * Need error check here + RETURN ERROR_SUCCESS + + ENDPROC + + PROCEDURE writeinientry && Writes a specific INI entry. + LPARAMETER cValue,cSection,cEntry,cINIFile + + * Get entry from INI file + LOCAL nErrNum + + * Load API functions + nErrNum = THIS.LoadINIFuncs() + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + IF EMPTY(m.cINIFile) + * WIN.INI file + nErrNum = WriteWinINI(m.cSection,m.cEntry,m.cValue) + ELSE + * Private INI file + nErrNum = WritePrivateINI(m.cSection,m.cEntry,m.cValue,m.cINIFile) + ENDIF + + ** All is well + RETURN IIF(m.nErrNum=1,ERROR_SUCCESS,m.nErrNum) + + ENDPROC + +ENDDEFINE + +DEFINE CLASS registry AS custom + *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> + + #INCLUDE "registry.h" + * + *m: closekey && Closes a registry key. + *m: deletekey && Deletes a registry key. + *m: deletekeyvalue && Deletes value from registry key. + *m: enumkeys && Enumerates through a registry key. + *m: enumkeyvalues && Enumerates through values of a registry key + *m: enumoptions && Enumerates through all entries for a key and populates array. + *m: getkeyvalue && Obtains a value from a registry key. + *m: getregkey && Gets a registry key setting. + *m: iskey && Checks to see if a key exists. + *m: loadregfuncs && Loads funtions needed for Registry. + *m: openkey && Opens a registry key. + *m: setkeyvalue && Sets a key value. + *m: setregkey && Sets a registry key setting. + *p: capppathkey && Application path registry key. + *p: cinidllfile && DLL file for INI functions. + *p: codbcdllfile && DLL file for ODBC functions. + *p: cregdllfile && DLL file for registry functions. + *p: cvfpoptpath && Registry path to VFP options settings. + *p: lcreatekey && Whether to create key if one does not already exist. + *p: ldisallowexpanded + *p: lhaderror && Whether an error occurred. + *p: lhasdllloaded + *p: lloadeddlls && Whether registry key functions loaded. + *p: lloadedinis && Whether INI functions loaded. + *p: lloadedodbcs && Whether ODBC functions loaded. + *p: ncurrentkey && Current registry key. + *p: ncurrentos && Current operating system code. + *p: nuserkey && User registry key. + * + + * + capppathkey = + cinidllfile = + codbcdllfile = + cregdllfile = + cvfpoptpath = + Name = "registry" + ncurrentkey = 0 + ncurrentos = 0 + nuserkey = 0 + * + + PROCEDURE closekey && Closes a registry key. + * Closes a registry key + =RegCloseKey(THIS.nCurrentKey) + THIS.nCurrentKey =0 + + ENDPROC + + PROCEDURE deletekey && Deletes a registry key. + * This routine deletes a Registry Key + LPARAMETER nUserKey,cKeyPath + LOCAL nErrNum + nErrNum = ERROR_SUCCESS + + * Delete key + m.nErrNum = RegDeleteKey(m.nUserKey,m.cKeyPath) + RETURN m.nErrNum + + ENDPROC + + PROCEDURE deletekeyvalue && Deletes value from registry key. + LPARAMETER cOptName,cKeyPath,nUserKey + LOCAL cOption,nErrNum + cOption = cOptName + nErrNum = ERROR_SUCCESS + + * Open key + m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey) + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Delete the key value + m.nErrNum = RegDeleteValue(THIS.nCurrentKey,m.cOption) + + * Close key + THIS.CloseKey() && close key + RETURN m.nErrNum + + ENDPROC + + PROCEDURE Destroy + IF !THIS.lHasDllLoaded + CLEAR DLLS RegOpenKey + CLEAR DLLS RegCreateKey + CLEAR DLLS RegDeleteKey + CLEAR DLLS RegDeleteValue + CLEAR DLLS RegCloseKey + CLEAR DLLS RegSetValueEx + CLEAR DLLS RegQueryValueEx + CLEAR DLLS RegEnumKey + CLEAR DLLS RegEnumKeyEx + CLEAR DLLS RegEnumValue + ENDIF + ENDPROC + + PROCEDURE enumkeys && Enumerates through a registry key. + LPARAMETERS aKeyNames + LOCAL nKeyEntry,cNewKey,cbuf,nbuflen,cRetTime, nKeySize, nErrCode + nKeyEntry = 0 + DIMENSION aKeyNames[1] + DO WHILE .T. + nKeySize = 0 + cNewKey = SPACE(100) + nKeySize = LEN(m.cNewKey) + cbuf=space(100) + nbuflen=len(m.cbuf) + cRetTime=space(100) + + m.nErrCode = RegEnumKeyEx(THIS.nCurrentKey,m.nKeyEntry,@cNewKey,@nKeySize,0,@cbuf,@nbuflen,@cRetTime) + + DO CASE + CASE m.nErrCode = ERROR_EOF + EXIT + CASE m.nErrCode # ERROR_SUCCESS + EXIT + ENDCASE + + cNewKey = ALLTRIM(m.cNewKey) + cNewKey = LEFT(m.cNewKey,LEN(m.cNewKey)-1) + IF !EMPTY(aKeyNames[1]) + DIMENSION aKeyNames[ALEN(aKeyNames)+1] + ENDIF + aKeyNames[ALEN(aKeyNames)] = m.cNewKey + nKeyEntry = m.nKeyEntry + 1 + ENDDO + + IF m.nErrCode = ERROR_EOF AND m.nKeyEntry # 0 + m.nErrCode = ERROR_SUCCESS + ENDIF + RETURN m.nErrCode + + ENDPROC + + PROCEDURE enumkeyvalues && Enumerates through values of a registry key + * Enumerates through values of a registry key + LPARAMETER aKeyValues + + LOCAL lpszValue,lpcchValue,lpdwReserved + LOCAL lpdwType,lpbData,lpcbData + LOCAL nErrCode,nKeyEntry + + STORE 0 TO nKeyEntry + + IF TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0 + RETURN ERROR_BADKEY + ENDIF + + * Sorry, Win32s does not support this one! + IF THIS.nCurrentOS = OS_W32S + RETURN ERROR_BADPLAT + ENDIF + + DO WHILE .T. + + STORE 0 TO lpdwReserved,lpdwType,nErrCode + STORE SPACE(256) TO lpbData, lpszValue + STORE LEN(lpbData) TO m.lpcchValue + STORE LEN(lpszValue) TO m.lpcbData + + nErrCode=RegEnumValue(THIS.nCurrentKey,m.nKeyEntry,@lpszValue,; + @lpcchValue,m.lpdwReserved,@lpdwType,@lpbData,@lpcbData) + + DO CASE + CASE m.nErrCode = ERROR_EOF + EXIT + CASE m.nErrCode # ERROR_SUCCESS + EXIT + ENDCASE + + nKeyEntry = m.nKeyEntry + 1 + + * Set array values + DIMENSION aKeyValues[m.nKeyEntry,2] + aKeyValues[m.nKeyEntry,1] = LEFT(m.lpszValue,m.lpcchValue) + DO CASE + CASE lpdwType = REG_SZ + aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1) + CASE lpdwType = REG_EXPAND_SZ AND !THIS.lDisAllowExpanded + aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1) + CASE lpdwType = REG_BINARY + * Don't support binary + aKeyValues[m.nKeyEntry,2] = REG_BINARY_LOC + CASE lpdwType = REG_DWORD + * You will need to use ASC() to check values here. + aKeyValues[m.nKeyEntry,2] = LEFT(m.lpbData,m.lpcbData-1) + OTHERWISE + aKeyValues[m.nKeyEntry,2] = REG_UNKNOWN_LOC + ENDCASE + ENDDO + + IF m.nErrCode = ERROR_EOF AND m.nKeyEntry#0 + m.nErrCode = ERROR_SUCCESS + ENDIF + RETURN m.nErrCode + + ENDPROC + + PROCEDURE enumoptions && Enumerates through all entries for a key and populates array. + * Enumerates through all entries for a key and populates array + LPARAMETER aRegOpts,cOptPath,nUserKey,lEnumKeys + LOCAL iPos,cOption,nErrNum + iPos = 0 + cOption = "" + nErrNum = ERROR_SUCCESS + + IF PCOUNT()<4 OR TYPE("m.lEnumKeys") # "L" + lEnumKeys = .F. + ENDIF + + * Open key + m.nErrNum = THIS.OpenKey(m.cOptPath,m.nUserKey) + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Enumerate through keys + IF m.lEnumKeys + * Enumerate and get key names + nErrNum = THIS.EnumKeys(@aRegOpts) + ELSE + * Enumerate and get all key values + nErrNum = THIS.EnumKeyValues(@aRegOpts) + ENDIF + + * Close key + THIS.CloseKey() &&close key + RETURN m.nErrNum + + ENDPROC + + PROCEDURE Error + LPARAMETERS nError, cMethod, nLine + THIS.lhaderror = .T. + =MESSAGEBOX(MESSAGE()) + + ENDPROC + + PROCEDURE getkeyvalue && Obtains a value from a registry key. + * Obtains a value from a registry key + * Note: this routine only handles Data strings (REG_SZ) + LPARAMETER cValueName,cKeyValue + + LOCAL lpdwReserved,lpdwType,lpbData,lpcbData,nErrCode + STORE 0 TO lpdwReserved,lpdwType + STORE SPACE(256) TO lpbData + STORE LEN(m.lpbData) TO m.lpcbData + + DO CASE + CASE TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0 + RETURN ERROR_BADKEY + CASE TYPE("m.cValueName") #"C" + RETURN ERROR_BADPARM + ENDCASE + + m.nErrCode=RegQueryValueEx(THIS.nCurrentKey,m.cValueName,; + m.lpdwReserved,@lpdwType,@lpbData,@lpcbData) + + * Check for error + IF m.nErrCode # ERROR_SUCCESS + RETURN m.nErrCode + ENDIF + + * Make sure we have a data string data type + IF m.lpdwType # REG_SZ AND m.lpdwType # REG_EXPAND_SZ + RETURN ERROR_NONSTR_DATA + ENDIF + + m.cKeyValue = LEFT(m.lpbData,m.lpcbData-1) + *!* RETURN ERROR_SUCCESS &&intoarce 0 + RETURN m.cKeyValue + ENDPROC + + PROCEDURE getregkey && Gets a registry key setting. + * This routine gets a registry key setting + * ex. THIS.GetRegKey("ResWidth",@cValue,; + * "Software\Microsoft\VisualFoxPro\4.0\Options",; + * HKEY_CURRENT_USER) + LPARAMETER cOptName,cOptVal,cKeyPath,nUserKey + LOCAL iPos,cOption,nErrNum + iPos = 0 + cOption = "" + nErrNum = ERROR_SUCCESS + + * Open registry key + m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey) + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Get the key value + nErrNum = THIS.GetKeyValue(cOptName,@cOptVal) + + * Close registry key + THIS.CloseKey() &&close key + RETURN m.nErrNum + + ENDPROC + + PROCEDURE Init + LOCAL laTmpDLLs,lnDlls + DIMENSION laTmpDLLs[1] + THIS.nUserKey = HKEY_CURRENT_USER + THIS.cVFPOptPath = VFP_OPTIONS_KEY1 + _VFP.VERSION + VFP_OPTIONS_KEY2 + DO CASE + CASE _DOS OR _UNIX OR _MAC + RETURN .F. + CASE ATC("Windows 3",OS(1)) # 0 + THIS.nCurrentOS = OS_W32S + CASE ATC("Windows NT",OS(1)) # 0 + THIS.nCurrentOS = OS_NT + THIS.cRegDLLFile = DLL_ADVAPI_NT + THIS.cINIDLLFile = DLL_KERNEL_NT + THIS.cODBCDLLFile = DLL_ODBC_NT + OTHERWISE + * Windows 95 + THIS.nCurrentOS = OS_WIN95 + THIS.cRegDLLFile = DLL_ADVAPI_WIN95 + THIS.cINIDLLFile = DLL_KERNEL_WIN95 + THIS.cODBCDLLFile = DLL_ODBC_WIN95 + ENDCASE + + * Check if DLLs already loaded so we don't unload when done. + lnDlls = ADLLS(laTmpDLLs) + IF lnDlls > 0 + IF ASCAN(laTmpDLLs,"RegOpenKey",-1,-1,-1,1)#0 + THIS.lHasDllLoaded=.T. + ENDIF + ENDIF + + ENDPROC + + PROCEDURE iskey && Checks to see if a key exists. + * Checks to see if a key exists + LPARAMETER cKeyName,nRegKey + LOCAL nErrNum + * Open extension key + nErrNum = THIS.OpenKey(m.cKeyName,m.nRegKey) + IF m.nErrNum = ERROR_SUCCESS + * Close extension key + THIS.CloseKey() + ENDIF + + RETURN m.nErrNum = ERROR_SUCCESS + + ENDPROC + + PROCEDURE loadregfuncs && Loads funtions needed for Registry. + * Loads funtions needed for Registry + LOCAL nHKey,cSubKey,nResult + LOCAL hKey,iValue,lpszValue,lpcchValue,lpdwType,lpbData,lpcbData + LOCAL lpcStr,lpszVal,nLen,lpdwReserved + LOCAL lpszValueName,dwReserved,fdwType + LOCAL iSubKey,lpszName,cchName + + IF THIS.lLoadedDLLs + RETURN ERROR_SUCCESS + ENDIF + + DECLARE Integer RegOpenKey IN Win32API ; + Integer nHKey, String @cSubKey, Integer @nResult + + IF THIS.lhaderror && error loading library + RETURN -1 + ENDIF + + DECLARE Integer RegCreateKey IN Win32API ; + Integer nHKey, String @cSubKey, Integer @nResult + + DECLARE Integer RegDeleteKey IN Win32API ; + Integer nHKey, String @cSubKey + + DECLARE Integer RegDeleteValue IN Win32API ; + Integer nHKey, String cSubKey + + DECLARE Integer RegCloseKey IN Win32API ; + Integer nHKey + + DECLARE Integer RegSetValueEx IN Win32API ; + Integer hKey, String lpszValueName, Integer dwReserved,; + Integer fdwType, String lpbData, Integer cbData + + DECLARE Integer RegQueryValueEx IN Win32API ; + Integer nHKey, String lpszValueName, Integer dwReserved,; + Integer @lpdwType, String @lpbData, Integer @lpcbData + + DECLARE Integer RegEnumKey IN Win32API ; + Integer nHKey,Integer iSubKey, String @lpszName, Integer @cchName + + DECLARE Integer RegEnumKeyEx IN Win32API ; + Integer nHKey,Integer iSubKey, String @lpszName, Integer @cchName,; + Integer dwReserved,String @lpszName, Integer @cchName,String @cchName + + DECLARE Integer RegEnumValue IN Win32API ; + Integer hKey, Integer iValue, String @lpszValue, ; + Integer @lpcchValue, Integer lpdwReserved, Integer @lpdwType, ; + String @lpbData, Integer @lpcbData + + THIS.lLoadedDLLs = .T. + + * Need error check here + RETURN ERROR_SUCCESS + + ENDPROC + + PROCEDURE openkey && Opens a registry key. + * Opens a registry key + LPARAMETER cLookUpKey,nRegKey,lCreateKey + + LOCAL nSubKey,nErrCode,nPCount,lSaveCreateKey + nSubKey = 0 + nPCount = PCOUNT() + + IF TYPE("m.nRegKey") # "N" OR EMPTY(m.nRegKey) + m.nRegKey = HKEY_CURRENT_USER + ENDIF + + * Load API functions + nErrCode = THIS.LoadRegFuncs() + IF m.nErrCode # ERROR_SUCCESS + RETURN m.nErrCode + ENDIF + + lSaveCreateKey = THIS.lCreateKey + IF m.nPCount>2 AND TYPE("m.lCreateKey") = "L" + THIS.lCreateKey = m.lCreateKey + ENDIF + + IF THIS.lCreateKey + * Try to open or create registry key + nErrCode = RegCreateKey(m.nRegKey,m.cLookUpKey,@nSubKey) + ELSE + * Try to open registry key + nErrCode = RegOpenKey(m.nRegKey,m.cLookUpKey,@nSubKey) + ENDIF + + THIS.lCreateKey = m.lSaveCreateKey + + IF nErrCode # ERROR_SUCCESS + RETURN m.nErrCode + ENDIF + + THIS.nCurrentKey = m.nSubKey + RETURN ERROR_SUCCESS + + ENDPROC + + PROCEDURE setkeyvalue && Sets a key value. + * This routine sets a key value + * Note: this routine only handles data strings (REG_SZ) + LPARAMETER cValueName,cValue + LOCAL nValueSize,nErrCode + + DO CASE + CASE TYPE("THIS.nCurrentKey")#'N' OR THIS.nCurrentKey = 0 + RETURN ERROR_BADKEY + CASE TYPE("m.cValueName") #"C" OR TYPE("m.cValue")#"C" + RETURN ERROR_BADPARM + *!* CASE EMPTY(m.cValueName) + *!* RETURN ERROR_BADPARM + ENDCASE + + * Make sure we null terminate this guy + cValue = m.cValue+CHR(0) + nValueSize = LEN(m.cValue) + + * Set the key value here + m.nErrCode = RegSetValueEx(THIS.nCurrentKey,m.cValueName,0,; + REG_SZ,m.cValue,m.nValueSize) + + * Check for error + IF m.nErrCode # ERROR_SUCCESS + RETURN m.nErrCode + ENDIF + + RETURN ERROR_SUCCESS + + ENDPROC + + PROCEDURE setregkey && Sets a registry key setting. + * This routine sets a registry key setting + * ex. THIS.SetRegKey("ResWidth","640",; + * "Software\Microsoft\VisualFoxPro\6.0\Options",; + * HKEY_CURRENT_USER) + LPARAMETER cOptName,cOptVal,cKeyPath,nUserKey,lCreateKey + LOCAL iPos,cOptKey,cOption,nErrNum + iPos = 0 + cOption = "" + nErrNum = ERROR_SUCCESS + + * Open registry key + m.nErrNum = THIS.OpenKey(m.cKeyPath,m.nUserKey,m.lCreateKey) + IF m.nErrNum # ERROR_SUCCESS + RETURN m.nErrNum + ENDIF + + * Set Key value + nErrNum = THIS.SetKeyValue(m.cOptName,m.cOptVal) + + * Close registry key + THIS.CloseKey() &&close key + RETURN m.nErrNum + + ENDPROC + +ENDDEFINE diff --git a/Clase/roaregistratura.vc2 b/Clase/roaregistratura.vc2 index bee9376..0010867 100644 --- a/Clase/roaregistratura.vc2 +++ b/Clase/roaregistratura.vc2 @@ -4,14 +4,16 @@ *< FOXBIN2PRG: Version="1.21" SourceFile="roaregistratura.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * * -DEFINE CLASS capplication AS wzapplication OF "appwiz.vcx" && Application class. +DEFINE CLASS capplication AS wzapplication OF "..\comun\clase\appwiz.vcx" && Application class. *< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" /> * clastcaption = Microsoft Visual FoxPro clasticon = + Height = 26 Name = "capplication" nformcount = 0 + Width = 69 * PROCEDURE doform diff --git a/roaRegistratura.pj2 b/roaRegistratura.pj2 index 18839b5..9fe40df 100644 --- a/roaRegistratura.pj2 +++ b/roaRegistratura.pj2 @@ -49,6 +49,12 @@ MODIFY PROJECT 'roaRegistratura.pjx' NOWAIT NOSHOW NOPROJECTHOOK loProject = _VFP.Projects('roaRegistratura.pjx') WITH loProject.FILES + .ADD('..\..\share\vfp9\program files\microsoft visual foxpro 9\ffc\_app.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> + .ADD('c:\program files (x86)\microsoft visual foxpro 9\ffc\_base.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> + .ADD('c:\program files (x86)\microsoft visual foxpro 9\ffc\_reports.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> + .ADD('c:\program files (x86)\microsoft visual foxpro 9\ffc\_table.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> + .ADD('c:\program files (x86)\microsoft visual foxpro 9\ffc\_ui.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> + .ADD('c:\program files (x86)\microsoft visual foxpro 9\wizards\_framewk.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('c:\program files (x86)\microsoft visual foxpro 9\wizards\graphics\bottom.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> .ADD('c:\program files (x86)\microsoft visual foxpro 9\wizards\graphics\bottom.msk') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> .ADD('c:\program files (x86)\microsoft visual foxpro 9\wizards\graphics\browse.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> @@ -80,16 +86,10 @@ WITH loProject.FILES .ADD('c:\program files (x86)\microsoft visual foxpro 9\wizards\graphics\top.bmp') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> .ADD('c:\program files (x86)\microsoft visual foxpro 9\wizards\graphics\top.msk') && *< FileMetadata: Type="x" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> .ADD('clase\_app.h') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> - .ADD('clase\_app.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> - .ADD('clase\_base.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('clase\_framewk.h') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> - .ADD('clase\_framewk.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('clase\_reports.h') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> - .ADD('clase\_reports.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('clase\_table.h') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> - .ADD('clase\_table.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('clase\_ui.h') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="0" ID="0" ObjRev="0" User="" /> - .ADD('clase\_ui.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('clase\ferestre_registratura.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('clase\ofundal_registratura.vcx') && *< FileMetadata: Type="V" Cpid="1252" Timestamp="0" ID="0" ObjRev="544" User="" /> .ADD('clase\outlook2003bar.vcx') && *< FileMetadata: Type="V" Cpid="0" Timestamp="0" ID="0" ObjRev="544" User="" />