Files
comun/docs/cautare_vcx_vct.md

7.3 KiB

Căutare în codul din librăriile/formele VFP (.vcx/.vct, .scx/.sct, ...)

Partajat între proiectele ROA* (companion narativ la PROMPT_cautare_vfp.md din acest folder, care e varianta "prompt de copiat" — acest fișier e ghidul de referință complet, cu exemple).

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, CU O EXCEPȚIE: pentru .vcx/.scx se poate și edita pe text, cu write-back în binar (txt2vcx.ps1) — vezi PROMPT_cautare_vfp.md pasul 3 pentru fluxul complet (ordine obligatorie, encoding, fidelity check). Pentru .frx/.mnx/.dbc nu există write-back — modificările se fac tot în IDE-ul VFP.

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.EXE lipsește, se compilează o singură dată: deschide D:\ROA\UTIL\foxbin2prg\foxbin2prg.pj2 în VFP 9 și Build > Build Executable. Lângă EXE trebuie să existe filename_caps.exe și fișierele props*.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).

Parametrizează scriptul cu proiectul curent și un cache separat per proiect (nu amesteca cache-urile mai multor proiecte ROA):

# DOAR fișierele proiectului curent (recomandat, rapid) -> cache text propriu
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
  -Project '<RADACINA_PROIECT>\<proiect>.pjx' -ProjectRoot '<RADACINA_PROIECT>' `
  -CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>'

# include și rapoartele (.frx) și meniurile (.mnx)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
  -Project '<RADACINA_PROIECT>\<proiect>.pjx' -ProjectRoot '<RADACINA_PROIECT>' `
  -CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>' -Types vcx,scx,frx,mnx

# conversie punctuală a unui fișier sau folder (chiar dacă NU e în proiect, ex. o clasă din COMUN)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Source '<RADACINA_PROIECT>\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 '<RADACINA_PROIECT>\<proiect>.pjx' -ProjectRoot '<RADACINA_PROIECT>' `
  -CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>' -Clean

Exemplu concret (ROAAUTO):

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

Rezultatul ajunge în cache-ul indicat, 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_<nume_proiect>"
grep -rln "factura_salvare" "D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>"   # 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 cache. 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 folderul de clase al proiectului, 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\<proiect>\Clase\odevize.vcx, D:\ROA\<proiect>\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\<proiect>\Clase\odevize.VCT"
grep -a -o "PROCEDURE [a-zA-Z0-9_]*" "D:\ROA\<proiect>\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; o mare parte din .vcx-uri sunt în COMUN\ (framework partajat între toate aplicațiile ROA — vezi CLAUDE.md per proiect).
  • Cache-ul text e regenerabil și e în afara arborelui SVN/git al proiectului — poate fi șters oricând.
  • Conversia nu necesită IDE-ul VFP deschis (folosește EXE-ul compilat).
  • Vezi și conventie_encoding_cp1252.md — capcană de encoding la editarea .sc2/.vc2 (nu doar la căutare).