Files
comun/docs/cautare_vcx_vct.md
2026-06-15 12:50:06 +03:00

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/.vct pe 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.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).

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 în COMUN\ (framework partajat — vezi CLAUDE.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).