7.7 KiB
Cercetare: buton comutator creion/discheta (decizia 9, plan #13)
Verificat pe cod la 09.08.2026. Metoda: vfp_symbols.ps1 (-Class, -Find, -Where, -Grep -CodeOnly)
peste indexul ROAFACTURARE, plus Grep/Read directe pe .vc2.
1. Clase de buton in COMUN\clase\cmd_butoane.vc2 — salvare / modificare
Fisierul e o insiruire de DEFINE CLASS ... AS buton OF "_cmd_base.vcx" (butoane simple) si
... AS cmd_buton OF "_cmd_base.vcx" (variante). Doar doua clase au legatura directa:
but_modifica—cmd_butoane.vc2:184-198184: DEFINE CLASS but_modifica AS buton OF "_cmd_base.vcx" 188: caction = inainte_de_do_modifica 189: cpicturedown = modific_jos.bmp 190: cpictureup = modific_sus.bmp 193: Picture = ..\grafice\modific_sus.bmp 194: ToolTipText = "Modificare (CTRL+M)" 195: Visible = .F.but_salveaza—cmd_butoane.vc2:340-352340: DEFINE CLASS but_salveaza AS buton OF "_cmd_base.vcx" 344: caction = do_salvare 345: cpicturedown = save_jos.bmp 346: cpictureup = save_sus.bmp 348: Picture = ..\grafice\save_sus.bmp 349: ToolTipText = "Salvare"
Nu exista o clasa but_salvare (fara "ea") — numele real e but_salveaza. Nicio alta clasa din
fisier (but_reset, but_reface, but_retur, cmd_modifica etc.) foloseste imagini de
discheta sau de creion.
2. Clasa efectiva a lui but_modifica in formularele de facturare
Cautat in COMUN\clase\ofacturare_comun.vc2, COMUN\clase\ofacturare.vc2,
Clase\ofundal_facturare.vc2 (ofacturare_comun.vc2 e cel corect; Clase\ofacturare.vc2 din
prompt nu exista — clasa reala e in COMUN\clase\ofacturare.vc2).
ofacturare_comun.vc2:1424-1432—frm_facturi(lista de facturi),ADD OBJECT 'but_modifica1' AS but_modifica WITH ... Picture = ..\grafice\modific_sus.bmp(override explicit, egal cu default-ul clasei).cactionnu e suprascris pe instanta -> ramaneinainte_de_do_modificadin clasa. Metodainainte_de_do_modifica(referita si in plan la J) e laofacturare_comun.vc2:4925-4934si azi deschide unxmenu(), nu comuta imaginea.ofacturare_comun.vc2:1434-1443—But_modifica2pe acelasifrm_facturi, totAS but_modifica, cucaction = do_modifica_explicatie; faraPicturepropriu (mosteneste creionul).COMUN\clase\ofacturare.vc2:4313, 11192, 19472, 22734— patru instanteADD OBJECT 'But_modifica1' AS but_modifica, apartinandfrm_articole_compuse(:4212-5216),frm_facturare_articole(:10968-15739— formularul de compunere de azi),frm_nomrute(:19357-19551) sifrm_rute(:22510-22821). Niciuna nu arePicturepe instanta.- Nicio instanta
but_salveaza/but_salvaregasita in niciunul din cele trei fisiere cautate. Formularele de facturare de azi nu au un buton dedicat de "salvare antet" — antetul se salveaza azi prinfrm_modifica_facturacu bife (ofacturare_comun.vc2:5262-5774, vezi si planul, sectiunea I), nu printr-un butonbut_salveazaseparat.
Concluzie pe punctul 2: but_modifica1/But_modifica2 de pe frm_facturi si toate cele patru
But_modifica1 din ofacturare.vc2 sunt instante ale clasei but_modifica din
cmd_butoane.vc2, fara suprascriere de comportament — ele raman butoane simple de deschidere, nu
comutatoare.
3. Precedent de schimbare a Picture la runtime (comutator modifica/salveaza)
Exista precedent, si e exact tiparul cerut. COMUN\clase\rulaje.vc2, metoda
frm_rulaje.se_modifica_assign (assign-method pe proprietatea se_modifica a formularului),
rulaje.vc2:4716-4773:
4745: If m.llEditMode && TREC IN MODUL EDITARE
4747: With Thisform.but_modifica1
4748: .cpicturedown = "save_jos.bmp"
4749: .cpictureup = "save_sus.bmp"
4750: .Picture = "save_sus.bmp"
4751: .ToolTipText = "Salvare"
4752: .Enabled = .T.
4753: .Refresh()
4754: Endwith
4755: Else
4760: With Thisform.but_modifica1
4761: .cpicturedown = "MODIFICA2.BMP"
4762: .cpictureup = "MODIFICA1.BMP"
4763: .Picture = "MODIFICA1.BMP"
4764: .ToolTipText = "Modificare"
4765: .Enabled = .T.
4766: ENDWITH
4769: Endif
but_modifica1 pe frm_rulaje e instantiat ADD OBJECT 'but_modifica1' AS but_modifica WITH ...
(rulaje.vc2:727-737, clasa but_modifica din cmd_butoane.vcx, fara Picture propriu pe
instanta — pleaca de la creion, cf. clasa). Tiparul confirmat: la comutare se rescriu impreuna
.cpicturedown, .cpictureup si .Picture (nu doar .Picture — altfel hover-ul din
buton.MouseEnter/MouseLeave, _cmd_base.vc2:88-97, ar reveni la iconita veche la urmatorul
mouse-over), plus .ToolTipText si .Refresh().
Nu exista alt precedent care sa comute intre creion si discheta pe acelasi buton; celelalte hit-uri
pe .Picture = gasite in suita (baza.vc2, otouchscreen.vc2, ferestre_seturi_indicatori.vc2
etc.) sunt fie hover MouseEnter/Leave standard (this.Picture = this.cPictureDown/Up), fie
schimbari de iconita fara legatura cu modificare/salvare (tab-uri, bife, animatii).
4. Imaginea de discheta pe disc si rezolvarea caii
Fisiere confirmate pe disc (Get-ChildItem recursiv in D:\ROA\ROAFACTURARE):
COMUN\grafice\save_sus.bmp
COMUN\grafice\save_jos.bmp
COMUN\grafice\modific_sus.bmp
COMUN\grafice\modific_jos.bmp
COMUN\grafice\modifica1.bmp
COMUN\grafice\modifica2.bmp
Nu exista niciun save*.bmp/modific*.bmp sub D:\ROA\ROAFACTURARE\Grafice (folderul propriu al
proiectului) — toate traiesc in COMUN\grafice.
Rezolvarea caii: clasa foloseste cale relativa la definirea proprietatii (..\grafice\save_sus.bmp,
rezolvata de VFP fata de .vcx-ul clasei la Init). Codul de runtime din rulaje.vc2 seteaza insa
nume de fisier fara cale ("save_sus.bmp", "MODIFICA1.BMP"), care se rezolva prin
SET PATH — verificat in Programe\roafacturare.prg:85-108: lcPath include atat
gcAppPath + 'GRAFICE;' cat si gcAppPath + 'COMUN\GRAFICE;', SET PATH TO &lcPath ADDITIVE. Deci
o alocare .Picture = "save_sus.bmp" la runtime se rezolva corect, indiferent daca fisierul e in
Grafice\ sau COMUN\Grafice\, atata timp cat numele fara cale e folosit (nu resursa inclusa in
EXE — nu s-a gasit nicaieri mecanism de resurse compilate pentru aceste bmp-uri).
5. Metoda de biblioteca do_activeaza/do_dezactiveaza pe clase de buton
Neverificat -> verificat, raspuns: nu exista pe clasele de buton. Cautat in
COMUN\clase\_cmd_base.vc2 (clasele _cmdbase, buton, cmd_buton) — nicio metoda
do_activeaza/do_dezactiveaza. Mecanismul exista doar pe clase de container/camp, nu de
buton, cf. si planului insusi (docs\plan_13_unificare_formular_facturare.md, sectiunea I):
ct_clb_cautare.do_activeaza/do_dezactiveaza (caut_ora.vc2:780-806, dar neapelate azi in
ofacturare_comun.vc2) si clb_tx_data.dezactiveaza()/reactiveaza() (lb_tx.vc2:521-538,
singura reteta completa: ReadOnly + TabStop + butonul de calendar). Pe butoane, controlul se
face direct pe .Enabled/.Visible (asa cum face si se_modifica_assign din rulaje.vc2 mai sus).
Rezumat pentru implementare
- Clasa de folosit pentru discheta:
but_salveaza(cmd_butoane.vc2:340-352) — dar tiparul dinrulaje.vc2nu instantiaza a doua clasa; comuta o singura instantabut_modificaintre cele doua seturi de imagini prin.cpicturedown/.cpictureup/.Picture. E reteta direct aplicabila cerintei din decizia 9. - Numele de fisier de folosit:
save_sus.bmp/save_jos.bmp(discheta),modific_sus.bmp/modific_jos.bmpsauMODIFICA1.BMP/MODIFICA2.BMP(creion — doua perechi echivalente coexista pe disc;rulaje.vc2foloseste a doua pereche, clasa foloseste prima). - Fara cale in fata numelui de fisier — se rezolva prin
SET PATH.