>>
>>*-- DECLARE DLL statements for reading/writing to private INI files
>>DECLARE INTEGER GetPrivateProfileString IN Win32API AS GetPrivStr ;
>> String cSection, String cKey, String cDefault, String @cBuffer, ;
>> Integer nBufferSize, String cINIFile
>>
>>DECLARE INTEGER WritePrivateProfileString IN Win32API AS WritePrivStr ;
>> String cSection, String cKey, String cValue, String cINIFile
>>
>>
>>procedure SaveGridLayout
>>* parameter - grid ID in profile. If not specified, form name and grid name will be used
>>* Note also that it is good style to include form name at the start of the grid layout saving signature.
>>lparameters pcGridID
>>
>>local lcGridId, lnCounter, lcValue, lcNameID, loHeader, lnSortingState, tnX
>>if vartype(m.pcGridID) == "C" and !empty(m.pcGridID)
>> m.lcGridId = upper(allt(m.pcGridID))
>>else
>> m.lcGridId = upper(thisform.Name + '_' + this.Name)
>>endif
>>
>>with this
>>* save grid layout into user profile:
>>* 1. Save current record position
>> m.lcNameID = m.lcGridId + "_position"
>> m.lcValue = allt(STR(RECNO(.GetGridAlias()),12,0))
>> =WritePrivStr("Grids", m.lcNameId , ;
>> m.lcValue, CURDIR() + INIFILE)
>>
>>* 2. Save header and row height
>> m.lcNameID = m.lcGridId + "_HRHeight"
>> m.lcValue = allt(STR(.HeaderHeight,10,0)) + ',' + allt(STR(.RowHeight,10,0))
>> =WritePrivStr("Grids", m.lcNameId , ;
>> m.lcValue, CURDIR() + INIFILE)
>>
>>* 3. Save columns layout
>> FOR m.lnCounter = 1 TO .COLUMNCOUNT
>> m.loHeader = .GetColumnHeader(.COLUMNS(m.lnCounter))
>> with .COLUMNS(m.lnCounter)
>> if !empty(.CONTROLSOURCE)
>> m.lcValue = .Width
>> if vartype(m.loHeader) == "O"
>> && save sorting if any
>> if PEMSTATUS(m.loHeader,'state',5)
>> m.lnSortingState = m.loHeader.state
>> else
>> m.lnSortingState = 0
>> endif
>> else
>> m.lnSortingState = 0
>> endif
>> m.lcValue = ALLTR(STR(m.lcValue, 10, 0)) + ',' + ;
>> ALLTR(STR(.COLUMNORDER,10,0))
>>
>> * Save sorting order for sorted column
>> if this.nSortColumn = m.lnCounter AND m.lnSortingState > 0
>> m.lcValue = m.lcValue + ',' + allt(str(m.lnSortingState,2,0))
>> endif
>>
>> m.lcNameId = m.lcGridId + "_" + iif('.' $ .CONTROLSOURCE, ;
>> SUBSTR(.CONTROLSOURCE,AT(".",.CONTROLSOURCE) + 1), ;
>> .CONTROLSOURCE)
>>
>> =WritePrivStr("Grids", m.lcNameId , ;
>> m.lcValue, CURDIR() + INIFILE)
>> endif
>> endwith
>> ENDFOR
>>endwith
>>endproc
>>
>>***************************************************************
>>procedure RestoreGridLayout
>>* parameter - grid ID in profile. If not specified, form name and grid name will be used
>>* Note also that it is good style to include form name at the start of the grid layout saving signature.
>>
>>* Second parameter - set it to .T. in case when you need to restore layout only without change of record number (used in shortcut menu item 'restore original layout')
>>
>>lparameters pcGridID, llDoNotRestoreRecord
>>
>>local lcGridId, lnCounter, lcBuffer, lcValue, lcNameID, loHeader, lnSortingState, lcAlias, tnX, lnPos
>>if vartype(m.pcGridID) == "C" and !empty(m.pcGridID)
>> m.lcGridId = upper(allt(m.pcGridID))
>>else
>> m.lcGridId = upper(thisform.Name + '_' + this.Name)
>>endif
>>
>>with this
>> .nSortColumn = 0 && clear it for future use
>> m.lcAlias = .GetGridAlias()
>>
>> * 1. Restore header and row height
>> m.lcNameID = m.lcGridId + "_HRHeight"
>> m.lcBuffer = SPACE(100) + CHR(0)
>> IF GetPrivStr("Grids", m.lcNameId, "", ;
>> @m.lcBuffer, 100, ;
>> CURDIR() + INIFILE) > 0
>> m.lcValue = val(alltr(m.lcBuffer))
>> if m.lcValue >= 0
>> .HeaderHeight = m.lcValue
>> .OldHeaderHeight = .HeaderHeight
>> endif
>> m.lnPos = at(',',alltr(m.lcBuffer))
>> if m.lnPos > 0
>> m.lcValue = val( substr(alltr(m.lcBuffer), m.lnPos + 1) )
>> if m.lcValue > 0
>> .RowHeight = m.lcValue
>> .OldRowHeight = .RowHeight
>> endif
>> endif
>> ENDIF
>>
>> * 2. Restore columns layout
>> m.lnSortingState = 0
>> local loHeader
>> FOR m.lnCounter = 1 TO .COLUMNCOUNT
>> with .COLUMNS(m.lnCounter)
>> if !empty(.CONTROLSOURCE)
>> m.lcBuffer = SPACE(100) + CHR(0)
>> m.lcNameId = m.lcGridId + "_" + iif('.' $ .CONTROLSOURCE, ;
>> SUBSTR(.CONTROLSOURCE,AT(".",.CONTROLSOURCE) + 1), ;
>> .CONTROLSOURCE)
>>
>> IF GetPrivStr("Grids", m.lcNameId, "", ;
>> @lcBuffer, 100, ;
>> CURDIR() + INIFILE) > 0
>> m.lcValue = val(alltr(m.lcBuffer))
>> if m.lcValue > 0
>> .WIDTH = m.lcValue
>> endif
>> m.lnPos = at(',',alltr(m.lcBuffer),1)
>> if m.lnPos > 0
>> m.lcValue = val( substr(alltr(m.lcBuffer), m.lnPos + 1) )
>> if m.lcValue > 0
>> .COLUMNORDER = m.lcValue
>> endif
>> m.lnPos = at(',',alltr(m.lcBuffer),2)
>> if m.lnPos > 0
>> m.lcValue = val( substr(alltr(m.lcBuffer), m.lnPos + 1) )
>> if m.lcValue > 0
>> this.nSortColumn = m.lnCounter
>> m.lnSortingState = m.lcValue
>> endif
>> endif
>> endif
>> ENDIF && GetPrivStr... > 0
>> endif && !empty(.ControlSource)
>> endwith
>> ENDFOR
>> m.loHeader = ""
>>
>> * 3. Sort column if sorting stored
>> if .nSortColumn > 0 AND m.lnSortingState > 0
>> .SortColumn(.nSortColumn, m.lnSortingState)
>> endif
>>
>> * 4. Restore current record position
>> if !m.llDoNotRestoreRecord
>> if used(m.lcAlias)
>> m.lcNameID = m.lcGridId + "_position"
>> m.lcBuffer = SPACE(100) + CHR(0)
>> IF GetPrivStr("Grids", m.lcNameId, "", ;
>> @m.lcBuffer, 100, ;
>> CURDIR() + INIFILE) > 0
>> m.lcValue = val(alltr(m.lcBuffer))
>> if between(m.lcValue, 1, reccount(m.lcAlias))
>> go (m.lcValue) in (m.lcAlias)
>> endif
>> .nRecno = recno(m.lcAlias)
>> .Refresh()
>> ELSE
>> GO TOP in (m.lcAlias)
>> .Refresh()
>> ENDIF
>> endif
>> endif
>>
>> .RefreshHeaders()
>> .RefreshIndicator()
>>endwith
>>endproc
>>
>Hi Vlad,
>I cant found the GetGridAlias() function.
>ThanksVlad Grynchyshyn, Project Manager, MCP
vgryn@yahoo.com
ICQ #10709245
The professional level of programmer could be determined by level of stupidity of his/her bugs
It is not appropriate to say that question is "foolish". There could be only foolish answers. Everybody passed period of time when knows nothing about something.