#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