# 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`.