Files
comun/programe/ogrid_latimi.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

105 lines
3.2 KiB
Plaintext

#DEFINE SYSMETRIC_VSCROLLBARWIDTH 5 && Width of a vertical scroll bar
#DEFINE SYSMETRIC_WINDOWBORDERWIDTH 10 && Width of a window border
*!* 22.08.2026
*!* marius.mutu
*!* distribuie - imparte spatiul liber sau lipsa dintr-un grid proportional cu latimile de
*!* referinta (baseline) ale coloanelor vizibile; baseline-ul se captureaza per coloana, dupa
*!* Name, la prima intalnire a fiecarei coloane pe fiecare grid, si nu se mai modifica dupa aceea
Define Class oGridLatimi As Custom
nLatimeMinima = 30 && sub acest prag coloana nu mai afiseaza nimic lizibil
oBaseline = .Null.
Procedure Init
This.oBaseline = Createobject('Collection')
Endproc
Procedure distribuie
Lparameters toGrid
Local lnColCount, lnI, lnUltimaCol, lnLatimeUtila, lnSpatiuLiber, lnSumBaseline, lnSumaAlocata, lnTarget
Local lcGridKey, lnKeyIndex, llModificat
Local loBaselineGrid, loCol
If Vartype(m.toGrid) <> 'O'
Return .F.
Endif
lnColCount = toGrid.ColumnCount
If m.lnColCount <= 0
Return .F.
Endif
* baseline separat per grid, identificat prin adresa obiectului - un al doilea grid nu mosteneste baseline-ul primului
lcGridKey = Sys(1272, m.toGrid)
lnKeyIndex = This.oBaseline.Getkey(m.lcGridKey)
If m.lnKeyIndex = 0
loBaselineGrid = Createobject('Collection')
This.oBaseline.Add(m.loBaselineGrid, m.lcGridKey)
Else
loBaselineGrid = This.oBaseline.Item(m.lnKeyIndex)
Endif
* coloana noua sau intalnita prima data pe acest grid - latimea ei curenta devine referinta
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible And loBaselineGrid.Getkey(loCol.Name) = 0
loBaselineGrid.Add(loCol.Width, loCol.Name)
Endif
Endfor
* coloanele scoase cu RemoveObject nu mai sunt in toGrid.Columns - se ignora automat, baseline-ul lor ramane neatins
lnSumBaseline = 0
lnUltimaCol = 0
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible
lnSumBaseline = m.lnSumBaseline + loBaselineGrid.Item(loCol.Name)
lnUltimaCol = m.lnI
Endif
Endfor
If m.lnUltimaCol = 0 Or m.lnSumBaseline <= 0
Return .F.
Endif
lnLatimeUtila = toGrid.Width
If toGrid.ScrollBars = 2 Or toGrid.ScrollBars = 3
lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_VSCROLLBARWIDTH)
Endif
If toGrid.BorderStyle = 1
lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_WINDOWBORDERWIDTH) * 2
Endif
lnSpatiuLiber = m.lnLatimeUtila - m.lnSumBaseline
llModificat = .F.
lnSumaAlocata = 0
For lnI = 1 To m.lnColCount
loCol = toGrid.Columns(m.lnI)
If loCol.Visible And m.lnI <> m.lnUltimaCol
lnTarget = loBaselineGrid.Item(loCol.Name) + Round(m.lnSpatiuLiber * loBaselineGrid.Item(loCol.Name) / m.lnSumBaseline, 0)
lnTarget = Max(m.lnTarget, This.nLatimeMinima)
lnSumaAlocata = m.lnSumaAlocata + m.lnTarget
If loCol.Width <> m.lnTarget
loCol.Width = m.lnTarget
llModificat = .T.
Endif
Endif
Endfor
* ultima coloana vizibila primeste restul exact, ca sa nu ramana pixeli goi din rotunjire
loCol = toGrid.Columns(m.lnUltimaCol)
lnTarget = Max(m.lnLatimeUtila - m.lnSumaAlocata, This.nLatimeMinima)
If loCol.Width <> m.lnTarget
loCol.Width = m.lnTarget
llModificat = .T.
Endif
Return m.llModificat
Endproc
Enddefine