Files
roafacturare/docs/cercetare/buton_comutator_picture.md
2026-09-09 22:19:22 +03:00

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-198
    184: 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-352
    340: 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). caction nu e suprascris pe instanta -> ramane inainte_de_do_modifica din clasa. Metoda inainte_de_do_modifica (referita si in plan la J) e la ofacturare_comun.vc2:4925-4934 si azi deschide un xmenu(), nu comuta imaginea.
  • ofacturare_comun.vc2:1434-1443 — But_modifica2 pe acelasi frm_facturi, tot AS but_modifica, cu caction = do_modifica_explicatie; fara Picture propriu (mosteneste creionul).
  • COMUN\clase\ofacturare.vc2:4313, 11192, 19472, 22734 — patru instante ADD OBJECT 'But_modifica1' AS but_modifica, apartinand frm_articole_compuse (:4212-5216), frm_facturare_articole (:10968-15739 — formularul de compunere de azi), frm_nomrute (:19357-19551) si frm_rute (:22510-22821). Niciuna nu are Picture pe instanta.
  • Nicio instanta but_salveaza / but_salvare gasita in niciunul din cele trei fisiere cautate. Formularele de facturare de azi nu au un buton dedicat de "salvare antet" — antetul se salveaza azi prin frm_modifica_factura cu bife (ofacturare_comun.vc2:5262-5774, vezi si planul, sectiunea I), nu printr-un buton but_salveaza separat.

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 din rulaje.vc2 nu instantiaza a doua clasa; comuta o singura instanta but_modifica intre 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.bmp sau MODIFICA1.BMP / MODIFICA2.BMP (creion — doua perechi echivalente coexista pe disc; rulaje.vc2 foloseste a doua pereche, clasa foloseste prima).
  • Fara cale in fata numelui de fisier — se rezolva prin SET PATH.