*--DynamicBackColor Changes in Grids set safety OFF set talk OFF set exact ON set near OFF CLOSE TABLES all CLOSE DATABASES all CREATE TABLE tpolicy(po_number c(25), po_status c(3), po_name c(20)) APPEND BLANK REPLACE po_name WITH "John T. Smith" REPLACE po_number WITH "123456" REPLACE po_status WITH "CXP" APPEND BLANK REPLACE po_name WITH "Sally A. Taylor" REPLACE po_number WITH "789012" REPLACE po_status WITH "NB" APPEND BLANK REPLACE po_name WITH "Craig Abernathy" REPLACE po_number WITH "AAB123" REPLACE po_status WITH "REN" APPEND BLANK REPLACE po_name WITH "Chris Johnson" REPLACE po_number WITH "890123" REPLACE po_status WITH "AP" sele 0 CREATE TABLE vstatus (st_status c(3), st_attrib c(16)) APPEND BLANK REPLACE st_status WITH "CXP" REPLACE st_attrib WITH "RGB(255,128,192)" APPEND BLANK REPLACE st_status WITH "NB" REPLACE st_attrib WITH "RGB(255,255,0)" APPEND BLANK REPLACE st_status WITH "AP" REPLACE st_attrib WITH "RGB(128,255,255)" COPY TO ARRAY _vstatus FIELDS ST_STATUS, ST_ATTRIB FOR !EMPTY(ST_STATUS) SELE tpolicy GO top oform = createobj('testform') oform.show() oform.SetPolicyGridColor() oform.refresh() read events CLOSE tables ALL return DEFINE CLASS testform AS form Top = 0 Left = 0 Height = 227 Width = 461 DoCreate = .T. Caption = "Test Highlight Change " *-- Specifies the grid's selected row background color. highlightbackcolor = .F. *-- Specifies whether the selected row is highlighted and also if it remains highlighted when user changes focus to another control on the form. highlightstyle = .F. gridbackcolor = .F. gridforecolor = .F. Name = "TESTFORM" ADD OBJECT grid1 AS grid WITH ; Anchor = 10, ; ColumnCount = 3, ; Height = 200, ; Left = 24, ; Panel = 1, ; RecordSource = "tpolicy", ; RecordSourceType = 1, ; Top = 12, ; Width = 410, ; Themes = .F., ; HighlightBackColor = RGB(0,128,192), ; HighlightForeColor = RGB(0,0,0), ; SelectedItemBackColor = RGB(0,128,192), ; SelectedItemForeColor = RGB(0,0,0), ; HighlightStyle = 2, ; Name = "grid1", ; Column1.ControlSource = "tpolicy.po_number", ; Column1.Width = 154, ; Column1.Name = "Column1", ; Column2.ControlSource = "tpolicy.po_status", ; Column2.Name = "Column2",; Column3.ControlSource = "tpolicy.po_name", ; Column3.Width = 154, ; Column3.Name = "Column3" PROCEDURE setpolicygridcolor WITH this.grid1 FOR nColumnID = 1 TO .columncount colorvalue = thisform.getpolicygridcolor(.recordsource,.columns(nColumnID).controlsource) .Columns(nColumnID).dynamicbackcolor = colorvalue .Columns(nColumnID).Controls[2].BACKCOLOR = THISFORM.HIGHLIGHTBACKCOLOR ENDFOR ENDWITH ENDPROC PROCEDURE getpolicygridcolor LPARAMETERS tcolortable, tcolorfield EXTERNAL ARRAY _vstatus EXTERNAL ARRAY _vtype defaultcolorvalue = "RGB(255,255,255)" IF EMPTY(tcolortable) .OR. TYPE('tcolortable') <> "C" .OR. !USED(tcolortable) RETURN defaultcolorvalue ENDIF IF TYPE('tcolorfield') <> "C" .OR. EMPTY(tcolorfield) RETURN defaultcolorvalue ENDIF IF AT('.',tcolorfield) > 0 tcolorfield = SUBSTR(tcolorfield,AT('.',tcolorfield)+1) ENDIF tcolorfield = UPPER(ALLTRIM(tcolorfield)) SELECT (tcolortable) DO CASE CASE tcolorfield = "PO_SUSP" RETURN "IIF(!EMPTY(po_status),IIF(ASCAN(_vstatus,po_status)>0,IIF(!EMPTY(_vstatus(ASCAN(_vstatus,po_status)+1)),EVALUATE(_vstatus(ASCAN(_vstatus,po_status)+1)),RGB(255,255,255)),RGB(255,255,255)),RGB(255,255,255))" CASE tcolorfield = "PO_STATUS" RETURN "IIF(!EMPTY(po_status),IIF(ASCAN(_vstatus,po_status)>0,IIF(!EMPTY(_vstatus(ASCAN(_vstatus,po_status)+1)),EVALUATE(_vstatus(ASCAN(_vstatus,po_status)+1)),RGB(255,255,255)),RGB(255,255,255)),RGB(255,255,255))" CASE tcolorfield = "PO_TYPE" RETURN "IIF(!EMPTY(po_type),IIF(ASCAN(_vtype,po_type)>0,IIF(!EMPTY(_vtype(ASCAN(_vtype,po_type)+2)),EVALUATE(_vtype(ASCAN(_vtype,po_type)+2)),RGB(255,255,255)),RGB(255,255,255)),RGB(255,255,255))" ENDCASE RETURN defaultcolorvalue ENDPROC PROCEDURE highlight_row THISFORM.LOCKSCREEN = .T. PRIVATE llsethighlight llsethighlight = .F. WITH THISFORM.grid1 FOR lnColumn = 1 TO .COLUMNCOUNT PRIVATE loCurrentControl STORE NULL TO loCurrentControl FOR EACH loControl IN .COLUMNS(lnColumn).CONTROLS IF loControl.NAME = loControl.PARENT.CURRENTCONTROL loCurrentControl = loControl ENDIF ENDFOR IF TYPE("loCurrentControl") = "O" AND NOT ISNULL(loCurrentControl) IF LOWER(loCurrentControl.BASECLASS) = "textbox" .OR. LOWER(loCurrentControl.BASECLASS) = "editbox" IF PEMSTATUS(loCurrentControl, "BackColor", 5 ) && Some controls in the column (i.e. Image) may not have .BackColor Property IF EMPTY(.COLUMNS(lnColumn).DYNAMICBACKCOLOR); OR EVALUATE(.COLUMNS(lnColumn).DYNAMICBACKCOLOR) = THISFORM.gridbackcolor .Columns(lnColumn).Sparse = .T. ELSE .COLUMNS(lnColumn).SPARSE = .F. * llsethighlight = .T. && change the highlightstyle on the grid ENDIF ENDIF ENDIF ENDIF ENDFOR IF llsethighlight DEBUGOUT "clear" .HIGHLIGHTSTYLE = 0 && do not show the highlight - we emulate a highlight ELSE DEBUGOUT "restore" .HIGHLIGHTSTYLE = THISFORM.HIGHLIGHTSTYLE && set the highlight back to the default ENDIF ENDWITH THISFORM.LOCKSCREEN = .F. ENDPROC PROCEDURE Destroy DODEFAULT() CLEAR EVENTS ENDPROC PROCEDURE Init DODEFAULT() WITH this.grid1 thisform.highlightbackcolor = .highlightbackcolor thisform.highlightstyle = .highlightstyle thisform.gridbackcolor = .backcolor thisform.gridforecolor = .forecolor ENDWITH this.highlight_row() ENDPROC PROCEDURE grid1.AfterRowColChange LPARAMETERS nColIndex thisform.highlight_row() ENDPROC ENDDEFINE>I am trying to get this to work. The syntax works in another form, but on this one I keep getting the message "Expression is invalid. Use a valid expression for DYNAMICBACKCOLOR property." The strange this is that if I step through it, I don't get the message, only when it just runs. This code is in the AfterRowColChange event. vSbvPromoDestinations is a view, if that makes a difference. I am trying this because I have a few grids on the form, on one tab I have two grids, the lower being dependent on the upper. When swithcing between them, when I move the record pointer on the upper grid, the view controlling the other grid is requeried and the grid refreshed, but the record marker doesn't move. So I thought I'd get rid of it and use this.
>WITH This > .Tag = STR(RECNO('vSbvPromoDestinations')) > > .SetAll("DynamicBackColor", "IIF(RECNO('vSbvPromoDestinations') = VAL(ALLTRIM(.Tag)), ; > RGB(255,255,128), RGB(255,255,255))", "Column") > > .Refresh() >*.colAirportCode.DynamicBackColor = RGB(0,128,255) >ENDWITH >>