140 lines
7.3 KiB
Markdown
140 lines
7.3 KiB
Markdown
# 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):
|
|
|
|
```powershell
|
|
# 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
|
|
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:
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```powershell
|
|
# .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):
|
|
|
|
```bash
|
|
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](conventie_encoding_cp1252.md) — capcană de encoding la
|
|
editarea `.sc2`/`.vc2` (nu doar la căutare).
|