#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
This commit is contained in:
104
programe/ogrid_latimi.prg
Normal file
104
programe/ogrid_latimi.prg
Normal file
@@ -0,0 +1,104 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user