6.2 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).
Implicit e „project mode": citește roaacnpro.PJX și convertește doar fișierele
.vcx/.scx pe care le folosește efectiv proiectul (~78), nu tot COMUN\ (care are zeci de
librării nefolosite în ROAACNPRO — pierdere de timp). Lista de fișiere vine direct din proiect, deci
e exactă.
# DOAR fișierele proiectului (recomandat, rapid) -> cache text
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1
# include și rapoartele (.frx) și meniurile (.mnx)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -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\ROAACNPRO\COMUN\clase\caut.vcx
# rebuild curat (șterge cache-ul întâi) / forțează reconversia
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Clean
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Force
Parametri utili: -Project <alt.pjx> (alt proiect, ex. importroris.pjx), -Types,
-Source, -Clean, -Force.
Rezultatul ajunge în D:\ROA\UTIL\foxbin2prg\_textcache\ cu aceeași structură de directoare ca
proiectul (ex.: _textcache\Clase\oacnpro.vc2, _textcache\comun\clase\_frm_base.vc2). Apoi:
# cu unealta Grep (preferat) sau grep:
grep -rn "PROCEDURE do_calcul_tarife" "D:\ROA\UTIL\foxbin2prg\_textcache"
grep -rln "factura_salvare" "D:\ROA\UTIL\foxbin2prg\_textcache" # ce clase ating subiectul
Flux tipic pentru o problemă: rulează scriptul fără parametri o dată (populează cache-ul), apoi
caută cu Grep în _textcache. 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\ROAACNPRO\Clase\oacnpro.vcx, D:\ROA\ROAACNPRO\Clase\oacnpro.vct D:\tmp\
& 'D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE' 'D:\tmp\oacnpro.vcx' '' '' '' '1' '0' '1'
# => D:\tmp\oacnpro.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\ROAACNPRO\Clase\oacnpro.VCT"
grep -a -o "PROCEDURE [a-zA-Z0-9_]*" "D:\ROA\ROAACNPRO\Clase\oacnpro.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\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).