Files
roafacturare/docs/cercetare/buton_comutator_picture.md
Marius Mutu d9f5ca4226 docs: planurile, proiectarile si rapoartele de lucru intra in versionare
Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git,
nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de
cercetare pe care se sprijina modificarile din cod. O stergere acolo era
definitiva.

Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au
fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele
fisierelor de test la care se refereau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:17:17 +03:00

147 lines
7.7 KiB
Markdown

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