Example program - Using OBJECT notation on forms
This example program shows how to use OBJECT notation to controls grids and trees. OBJECT notation can also be used with tabs and list boxes.
In the forms Enter() event the grid is populated and some cells are colored. OBJECT notation is used here for the form, the grid control and for a particular cell on the grid. Objects can be passed to and returned from subroutines as exemplified in the 'CellText() routine. Note that this subroutine has a default parameter, a feature introduced in KCML 5.02.
Also in the Enter() event a three level tree is constructed using Add() methods and its first and thirst levels expanded using Expand(). The 'BoldTree() subroutine recursively descends the tree from the top set bold attributes on all the elements and setting the node icon to either a folder open icon if a node has children or to a stop sign icon if it is a leaf.
Finally there is an example of using FOR OBJECT to iterate over the collect of all the controls on a form. If the 3rd button, the help button which is labelled 'click me', is pressed, its event handler will iterate over each control in turn using FOR OBJECT and change the color and text of the control, provided it is a button, verified by checking its id to be between 1 and 9.
REM Form object demonstration
REM
REM This program highlights many of features available
REM when using the OBJECT syntax with forms programming.
REM
DEFFORM formobj()={.form,.form$,.Style=0x50c000c4,.Width=273,.Height=210,.Text$="Form objects demonstration",.Id=1024},\
{.ok,.button$,.Style=0x50010001,.Left=217,.Top=6,.Width=50,.Height=14,.Text$="OK",.__Anchor=5,.Id=1},\
{.cancel,.button$,.Style=0x50010000,.Left=217,.Top=23,.Width=50,.Height=14,.Text$="Cancel",.__Anchor=5,.Id=2},\
{.help,.button$,.Style=0x50010000,.Left=217,.Top=44,.Width=50,.Height=14,.Text$="&Click me",.__Anchor=5,.Id=9},\
{.gridControl1,.kcmlgrid$,.Style=0x50010430,.Left=15,.Top=10,.Width=170,.Height=61,.Id=1000,.Rows=5,.Cols=5,.Col1={.Row=0,.Col=1,.ColWidth=53}},\
{.treeControl1,.tree$,.Style=0x50810007,.Left=15,.Top=84,.Width=170,.Height=113,.Id=1001,.HasPictures=1},\
{.textControl1,.static$,.Style=0x50000000,.Left=195,.Top=86,.Width=71,.Height=85,.Id=1002},\
{.cmdButton1,.button$,.Style=0x50010000,.Left=197,.Top=183,.Width=66,.Height=19,.Text$="Delete node",.Id=1003,.Click()}
LOCAL DIM OBJECT t3
DEFEVENT formobj.Enter()
LOCAL DIM OBJECT f, OBJECT c, OBJECT cell, OBJECT m, OBJECT t1, OBJECT t2
REM Get an object reference to a form, a control and a grid cell.
OBJECT f = formobj
OBJECT c = formobj.gridControl1
OBJECT cell = formobj.gridControl1.Cell(1, 1)
REM Use the cell object to set some properties.
cell.Text$ = "Cell(1,1)"
cell.BackColor = &.Red
cell.TextColor = &.Yellow
REM Use a different cell now
OBJECT cell = formobj.gridControl1.Cell(2, 1)
REM Pass the cell to a subroutine. We are only passing one argument this time.
'celltext(OBJECT cell)
REM Pass two cells two the same subroutine.
'celltext(OBJECT c.Cell(3, 1), OBJECT c.Cell(1, 1))
REM Now get back the middle cell of a grid from a subroutine.
OBJECT m = 'middlecell(OBJECT c)
m.Text$ = "Middle"
REM Now have a look at trees.
OBJECT c = f.treeControl1
OBJECT t1 = c.Add("Root", 0)
OBJECT t2 = t1.Add("Child", 0)
OBJECT t3 = t1.Add("Child2", 0)
t2.Add("One", 0)
t2.Add("Two", 0)
t3.Add("Four", 0)
t3.Add("Five", 0)
REM expose first level
t1.Expand()
t3.Expand()
t3.Text$ = "Revised child2"
REM Set every item of the tree to bold
'boldtree(OBJECT t1)
REM Some of the methods for tree item objects
t2.Select()
t3.Collapse()
END EVENT
DEFEVENT formobj.help.Click()
REM Set all default button controls (OK, Cancel, Help) to have red text
REM these buttons have special reserved magic ID numbers
FOR OBJECT c IN formobj
IF (c.Id >= 1 AND c.Id <= 9)
a$ = c.Text$
c.Text$ = a$ & " (id = " & c.Id & ")"
c.TextColor = &.Red
END IF
NEXT OBJECT c
REM and disable ourselves
..Enabled = FALSE
END EVENT
DEFEVENT formobj.cmdButton1.Click()
REM drop child 2
IF (OBJECT t3 <> NULL)
t3.Delete()
OBJECT t3 = NULL
END IF
..Enabled = FALSE
END EVENT
FORM END formobj
formobj.Open()
END
DEFSUB 'celltext(OBJECT cell, OBJECT copy = NULL)
REM If copy is specified then copy the text to cell, else use a NULL text.
IF (OBJECT copy <> NULL)
cell.Text$ = "Copy of " & copy.Text$
ELSE
cell.Text$ = "NULL"
END IF
END SUB
DEFSUB 'middlecell(OBJECT grid)
REM Return the middle cell of a grid as an object.
LOCAL DIM OBJECT cell
OBJECT cell = grid.Cell((grid.Rows - 1) / 2 + 1, (grid.Cols - 1) / 2 + 1)
RETURN OBJECT cell
END SUB
DEFSUB 'boldtree(OBJECT c)
REM Recursively set each item to bold.
LOCAL DIM OBJECT child
WHILE (OBJECT c <> NULL) DO
c.Bold = TRUE
OBJECT child = c.Child
IF (OBJECT child <> NULL)
REM node has a child
c.Image = &.FolderClosed
c.OpenImage = &.FolderOpen
REM recurse over children
'boldtree(OBJECT child)
ELSE
REM leaf node, mark with stop sign
c.Image = &.Stop
c.OpenImage = &.Stop
END IF
OBJECT c = c.Next
WEND
END SUB