6.5 KiB
Căutare în codul din librăriile/formele VFP (.vcx/.vct, .scx/.sct, ...)
Cum se caută cod-sursă (proceduri, metode, parametri) care nu stă în fișiere .prg, ci
în interiorul fișierelor binare VFP: librării de clase (.vcx+.vct), forme (.scx+.sct),
rapoarte (.frx+.frt), meniuri (.mnx+.mnt), baze de date (.dbc+.dct).
De ce e nevoie de asta
Un .vcx este de fapt o tabelă DBF: codul metodelor stă în câmpuri memo în .vct. Un
grep direct pe .vct găsește textul, dar îl vede ca fișier binar (octeți \0 între linii),
fără numere de linie utile și greu de citit. Soluția: convertim binarul în reprezentarea lui
TEXT (.vc2, .sc2, …) — un PRG-style lizibil, cu metode sortate alfabetic — și căutăm
în text cu grep/Grep.
Regula de aur: textul generat e doar pentru citire/căutare. Modificările de cod se fac tot în IDE-ul VFP (vezi
CLAUDE.md). Nu edita.vcx/.vctpe text și nu pune textul înapoi în binar pentru aceste scopuri.
Unelte disponibile (verificate)
| Unealtă | Cale | Rol | Recomandare |
|---|---|---|---|
| FoxBin2Prg | D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE |
Binar VFP ⇄ text bidirecțional (.vc2/.sc2/.fr2/.mn2/.dc2/.lb2) |
De folosit. Complet, fidel, include corpul metodelor, parametri, comentarii |
| vcx2prg | D:\ROA\UTIL\vcx2prg\x2prg.prg |
Doar .vcx → .prg compilabil |
Alternativă; mai vechi, doar clase, necesită IDE VFP deschis pentru a rula forma |
| prgtovcx | D:\ROA\UTIL\prgtovcx\prgtovcx.PRG |
Invers: .prg → .vcx |
Nu pentru căutare (e direcția opusă) |
FoxBin2Prg e prima alegere: rulează din linia de comandă fără IDE deschis (EXE compilat), acoperă toate tipurile de container, și produce text mult mai fidel decât vcx2prg.
Dacă
FoxBin2Prg.EXElipsește, se compilează o singură dată: deschideD:\ROA\UTIL\foxbin2prg\foxbin2prg.pj2în VFP 9 și Build > Build Executable. Lângă EXE trebuie să existefilename_caps.exeși fișiereleprops*.txt(sunt deja în folder).
Mod recomandat: scriptul vcx2txt.ps1
D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 automatizează tot: copiază binarul + memo-ul într-un
cache care oglindește structura proiectului (ca să nu murdărească arborele SVN), rulează
FoxBin2Prg, păstrează doar fișierul text. E incremental (sare peste ce e deja la zi).
Pentru ROAAUTO, scriptul trebuie parametrizat cu proiectul curent și un cache separat (nu-l amesteca cu cel al altor proiecte ROA, ex. ROAACNPRO):
# DOAR fișierele proiectului ROAAUTO (recomandat, rapid) -> cache text propriu
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO `
-CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto
# include și rapoartele (.frx) și meniurile (.mnx)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO `
-CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto -Types vcx,scx,frx,mnx
# conversie punctuală a unui fișier sau folder (chiar dacă NU e în proiect)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Source D:\ROA\ROAAUTO\COMUN\clase\caut.vcx
# rebuild curat (șterge cache-ul întâi) / forțează reconversia
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO `
-CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto -Clean
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO `
-CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto -Force
Rezultatul ajunge în D:\ROA\UTIL\foxbin2prg\_textcache_roaauto\ cu aceeași structură de
directoare ca proiectul (ex.: _textcache_roaauto\Clase\odevize.vc2,
_textcache_roaauto\comun\clase\_frm_base.vc2). Apoi:
# cu unealta Grep (preferat) sau grep:
grep -rn "PROCEDURE do_calcul_tarife" "D:\ROA\UTIL\foxbin2prg\_textcache_roaauto"
grep -rln "factura_salvare" "D:\ROA\UTIL\foxbin2prg\_textcache_roaauto" # ce clase ating subiectul
Flux tipic pentru o problemă: rulează scriptul cu parametrii de mai sus o dată (populează
cache-ul), apoi caută cu Grep în _textcache_roaauto. La sesiuni următoare rescrie doar ce
s-a schimbat (incremental). Dacă ai nevoie de o librărie din COMUN\ care nu e în proiect,
convertește-o punctual cu -Source.
Alternativă manuală (fără script)
FoxBin2Prg scrie textul lângă sursă. Ca să nu murdărești Clase/, copiază perechea
binar+memo într-un folder temporar și convertește acolo:
# .vcx -> .vc2 (cType gol = extensia decide direcția BIN2PRG)
Copy-Item D:\ROA\ROAAUTO\Clase\odevize.vcx, D:\ROA\ROAAUTO\Clase\odevize.vct D:\tmp\
& 'D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE' 'D:\tmp\odevize.vcx' '' '' '' '1' '0' '1'
# => D:\tmp\odevize.vc2
Pozițiile parametrilor folosite: fișier, cType, cTextName, lGenText, cDontShowErrors=1, cDebug=0, cDontShowProgress=1. Lasă cType gol — extensia (.vcx) determină direcția.
(Nu da explicit "BIN2PRG" pentru un singur fișier: în acel mod EXE-ul așteaptă un director.)
Detalii complete de parametri: D:\ROA\UTIL\foxbin2prg\docs\FoxBin2Prg_Run.md.
Soluție rapidă „murdară" (un singur fișier, fără conversie)
Pentru o verificare rapidă „există metoda X undeva în librărie?", grep merge direct pe .vct
(o vede ca binar, dar găsește potrivirile):
grep -c "PROCEDURE" "D:\ROA\ROAAUTO\Clase\odevize.VCT"
grep -a -o "PROCEDURE [a-zA-Z0-9_]*" "D:\ROA\ROAAUTO\Clase\odevize.VCT"
Bun pentru „da/nu" și nume de metode; pentru citit corpul/contextul, folosește conversia în text.
Corespondență extensii binar → text
| Container | Binar (+memo) | Text |
|---|---|---|
| Librărie clase | .vcx + .vct |
.vc2 |
| Formă | .scx + .sct |
.sc2 |
| Raport | .frx + .frt |
.fr2 |
| Etichetă | .lbx + .lbt |
.lb2 |
| Meniu | .mnx + .mnt |
.mn2 |
| Bază de date | .dbc + .dct |
.dc2 |
Note
- Codul aplicației stă mai ales în
Clase\*.vcx; cea mai mare parte din.vcx-uri sunt înCOMUN\(framework partajat — veziCLAUDE.md). _textcache_roaauto\e regenerabil și e în afara arborelui SVN — poate fi șters oricând.- Conversia nu necesită IDE-ul VFP deschis (folosește EXE-ul compilat).