Squash al branch-ului de lucru plan13-s2. Cod: clasa noua ofacturare_util (geometrie si utilitare de formular), inrolata in roafacturare.prg; meniul "Facturare (nou)" plat, cu reparatia literalului peste limita VFP de 255 de caractere care impiedica compilarea metodei. Livrare: changelog 2.11.19, marcajul de versiune DB pentru scripturile finale din SCRIPTURI_CLAR\2026\09, inventarul livrarii in docs/livrare_13.md si registrul de erori deschise. Documentatia de lucru a etapei (cercetare, rapoarte, handoff-uri, snapshot-uri de scripturi si backup-uri de rollback) a fost scoasa din arbore. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
7.2 KiB
Sablon .vc2 gol — pornire pentru o biblioteca de clase noua
sablon_vcx_gol.vc2 e punctul de plecare cand trebuie creata o biblioteca .vcx noua in
proiect. Exista pentru ca txt2vcx.ps1 refuza permanent sa creeze un binar .vcx
inexistent (txt2vcx.ps1:203-206, garda nu verifica provenienta binarului, doar existenta lui) —
deci fluxul text->binar nu poate produce singur un .vcx nou de la zero. Solutia e sa pornesti
de la un binar-purtator copiat, peste care aplici acest text.
Continut: antetul FoxBin2Prg (6 linii, obligatoriu identic) + o singura clasa-exemplu
minimala (AS custom, fara obiecte-copil). Am ales varianta cu o clasa, nu biblioteca goala
de-a dreptul, pentru ca n-am gasit nicaieri in proiect un .vcx cu 0 clase de folosit ca
referinta si n-am vrut sa presupun formatul text al unei biblioteci goale fara sa-l vad — o clasa
custom fara copii insa exista deja ca tipar verificat (COMUN\clase\_baza.vc2:114-121, clasa
_custom) si a fost confirmata printr-un test complet text->binar->text in izolare (vezi mai
jos), deci e alegerea provata, nu doar plauzibila.
Procedura, pas cu pas
1. Alege binarul-purtator
Trebuie sa fie o pereche .vcx + .vct existenta (ambele — .vct e memo-ul cu proprietatile
lungi/codul; fara el binarul nu se deschide). Nu presupune care e cea mai mica — verifica:
ls -la Clase/*.vcx Clase/*.vct
Alege perechea cu cel mai mic .vcx. Nu conteaza ce clase contine acum — le stergi la pasul 3.
2. Copiaza si redenumeste
cp Clase/<sursa>.vcx Clase/<nume_nou>.vcx
cp Clase/<sursa>.vct Clase/<nume_nou>.vct
Ambele comenzi, nu doar .vcx — un .vcx fara .vct pereche e un binar corupt pentru VFP.
3. Aplica sablonul si inlocuieste
cp docs/sabloane/sablon_vcx_gol.vc2 Clase/<nume_nou>.vc2
In fisierul copiat, inlocuieste toate aparitiile:
SourceFile="__NUME_BIBLIOTECA__.vcx"->SourceFile="<nume_nou>.vcx"(trebuie sa fie exact numele fisierului.vcxde la pasul 2, cu tot cu extensie).DEFINE CLASS __NumeClasaExemplu__ AS custom-> numele si clasa-parinte reala dorita. Poti schimba si baseclass-ul (AS custom-> ex.AS _frmbase OF "_frm_base.vcx"pentru un formular) si adaugaADD OBJECT/ metode dupa nevoie — respecta constrangerile de mai jos.Name = "__NumeClasaExemplu__"(in blocul*<PropValue>) -> acelasi nume ca laDEFINE CLASS, cele doua trebuie sa coincida.
Spre deosebire de fluxul folosit la crearea lui Clase\ofacturare_util.vcx
(docs\nota_s8b_vcx_util.md), care a luat antetul dintr-o conversie reala ca sa nu-l inventeze,
antetul acestui sablon e deja verificat printr-un test text->binar->text complet (mai jos) —
nu mai trebuie reconfirmat printr-o conversie separata inainte de folosire, doar SourceFile
trebuie sa corespunda numelui ales la pasul 2.
4. Write-back
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\txt2vcx.ps1 `
-TextFile 'D:\ROA\ROAFACTURARE\Clase\<nume_nou>.vc2' `
-ProjectRoot D:\ROA\ROAFACTURARE -CacheRoot D:\ROA\ROAFACTURARE
Fara -Force, fara -NoVerify (fidelity check-ul trebuie sa treaca real). Adauga
-AllowComun doar daca <nume_nou>.vcx ajunge sub COMUN\.
5. Dovada de sincronizare — pe continut, nu pe mtime
txt2vcx.ps1 rescrie mtime-ul textului la refresh de cache, deci mtime-ul egal nu dovedeste
nimic. Reconverteste binarul proaspat scris intr-un cache izolat (diferit de ProjectRoot,
altfel vcx2txt.ps1 isi poate sterge singur binarul sursa — vezi capcana documentata in
docs\nota_s8b_vcx_util.md, sectiunea "Conversie text") si compara pe octeti:
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Source 'D:\ROA\ROAFACTURARE\Clase\<nume_nou>.vcx' `
-ProjectRoot D:\ROA\ROAFACTURARE -CacheRoot '<cale_temporara_izolata>'
diff Clase/<nume_nou>.vc2 <cale_temporara_izolata>/Clase/<nume_nou>.vc2
Zero diferente = dovada reala. Orice diferenta inseamna ca binarul din proiect nu reflecta textul din arbore.
6. Verificari de integritate
grep -c 'ADD OBJECT' Clase/<nume_nou>.vc2
grep -c 'OBJECTDATA:' Clase/<nume_nou>.vc2
Trebuie sa fie egale. Pentru CRLF si diacritice, vezi COMUN\docs\flux-editare-vfp-text.md
si memoria de proiect despre editarea .vc2 in cp1250 (Edit/sed -i corup octetii non-ASCII —
scrie orice modificare text cu un script Python pe disc, latin-1/cp1250 passthrough, CRLF
explicit, niciodata sed -i sau python -c).
7. .pjx ramane manual
.pjx nu e editabil din text (cf. CLAUDE.md proiect). Clase\<nume_nou>.vcx trebuie adaugat
manual in roafacturare.pjx (Project Manager > Classes > Add) — dar doar cand ai nevoie de
Build/Rebuild pentru EXE. Nu e necesar pentru o proba cu vfp9.exe + DO roafacturare.prg, unde
SET CLASSLIB (pasul 8) rezolva clasa prin SET PATH.
8. Inregistrare in roafacturare.prg
Biblioteca trebuie inregistrata ca sa fie vazuta de aplicatie. Exemplu deja existent in fisier,
langa care se adauga o linie similara pentru biblioteca noua (Programe\roafacturare.prg:137-139):
SET CLASSLIB TO ocriterii.vcx ADDITIVE
SET CLASSLIB TO ofacturare_util.vcx ADDITIVE
Set Classlib To ctl32_statusbar.vcx Additive
Clase\ e deja pe SET PATH (Programe\roafacturare.prg:89), deci fara cale completa. Aceasta
editare nu e facuta automat de acest sablon — se face separat, cu aprobare, cand biblioteca
noua chiar trebuie incarcata de aplicatie.
Constrangeri FoxBin2Prg de retinut (au picat fidelity check-ul in trecut)
ADD OBJECTla nivelul unei clase sunt ordonate ASCII/colationat case-insensitive peObjPath(ex.Cw10intreCw1siCw2), inclusiv obiectele de top-nivel.- Proprietatile in interiorul unui bloc
ADD OBJECT/*<PropValue>sunt in ordine alfabetica. - Ultima proprietate dintr-un bloc nu are
, ;la final (vezi ultima linie din bloculADD OBJECTdin sablon — n-are virgula). - Numarul de
ADD OBJECT== numarul de*< OBJECTDATA:(0 = 0 in sablonul de baza). - Liniile goale din corpul unui
PROCEDURE/inainte de unPROCEDUREla nivel de clasa se indenteaza cu un TAB; liniile goale dintre blocuriADD OBJECTconsecutive raman neindentate (verificat direct pe text regenerat,docs\nota_s8b_vcx_util.mdpunctul 3). - Encoding cp1250 pentru diacritice, CRLF (
\r\n) pe fiecare linie, inclusiv ultima (ENDDEFINE\r\n, fara linie goala dupa la finalul fisierului).
Ce s-a probat si cum
Test complet text -> binar -> text, izolat in scratchpad, fara sa atinga arborele
D:\ROA\ROAFACTURARE: copiat un binar-purtator existent intr-un proiect-fals in scratchpad,
aplicat sablonul (cu SourceFile/nume de clasa concrete), rulat txt2vcx.ps1 cu
-ProjectRoot/-CacheRoot catre acel proiect-fals — fidelity check trecut din prima
incercare (spre deosebire de frm_cursuri_valutare, care a avut nevoie de 3 corectii). Apoi
reconvertit binarul proaspat cu vcx2txt.ps1 intr-un cache izolat separat si comparat cu
diff — zero diferente. Detalii complete si comenzile exacte: docs\nota_s8b_sablon_vc2.md.
Neprobat: adaugarea in .pjx si deschiderea reala in designer/rulare (pasii 7-8 raman
descrisi, nu executati — n-ar fi trebuit sa atinga arborele real fara aprobare).