Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
SetAll and DynamicBackColor problem
Message
From
22/09/2005 13:28:37
 
General information
Forum:
Visual FoxPro
Category:
Forms & Form designer
Environment versions
Visual FoxPro:
VFP 7 SP1
OS:
Windows XP SP2
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01052066
Message ID:
01052076
Views:
17
I recently spent a few days going nuts over the same thing. Here is an example we worked out with Cetin and Nick's help here on the UT:
*--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
>
>
>Please help, it's driving me nuts!
>
>Thanks,
>Dana
.·*´¨)
.·`TCH
(..·*

010000110101001101101000011000010111001001110000010011110111001001000010011101010111001101110100
"When the debate is lost, slander becomes the tool of the loser." - Socrates
Vita contingit, Vive cum eo. (Life Happens, Live With it.)
"Life is not measured by the number of breaths we take, but by the moments that take our breath away." -- author unknown
"De omnibus dubitandum"
Previous
Reply
Map
View

Click here to load this message in the networking platform