PUBLIC gcWords gcWords = "these_these are_are some_some words_words created_created to_to populate_populate the_the checkbox_checkbox controls_controls" lo = CREATEOBJECT("myClass") lo.visible = .t. READ EVENTS DEFINE CLASS myClass AS Form Caption = "Checkbox Search Test" AutoCenter = .t. Width = 250 Height = 300 PROCEDURE Destroy CLEAR EVENTS ENDPROC PROCEDURE Init LOCAL lnI, lcName, lo * Add checkboxes FOR lnI = 1 TO 10 lcName = "checkbox" + TRANSFORM(lnI - 1) thisForm.AddObject(lcName, "myCheckbox") lo = thisForm.&lcName lo.Left = 5 lo.Top = ((lnI + 1) * lo.Height) lo.Visible = .t. NEXT * Add search string thisForm.AddObject("Label", "Label") thisForm.Label.Caption = "Search:" thisForm.Label.AutoSize = .t. thisForm.Label.Visible = .t. thisForm.Label.Left = 5 thisForm.Label.Top = 7 * Add textbox thisForm.AddObject("txtSearch", "myTextbox") thisform.txtSearch.Top = 5 thisForm.txtSearch.Left = thisForm.Label.left + thisForm.Label.Width + 5 thisForm.txtSearch.Visible = .t. thisForm.txtSearch.SetFocus ENDPROC ENDDEFINE DEFINE CLASS myTextbox as TextBox PROCEDURE InteractiveChange LOCAL lnI FOR lnI = 1 TO thisForm.ControlCount IF PEMSTATUS(thisForm.Controls[lnI], "mth_highlight", 5) thisForm.Controls[lnI].mth_highlight(ALLTRIM(this.Value)) ENDIF NEXT ENDDEFINE DEFINE CLASS myLabel AS Label BorderStyle = 0 BorderWidth = 0 ENDDEFINE DEFINE CLASS myCheckbox AS Container lo = .NULL. loLbl = .NULL. BorderStyle = 0 BorderWidth = 0 Width = 300 Height = 20 PROCEDURE Init LOCAL lcCheckBox, lcLabel * Checkbox lcCheckbox = SYS(2015) this.AddObject(lcCheckbox, "CheckBox") this.lo = this.&lcCheckBox this.lo.Caption = SPACE(0) this.lo.AutoSize = .t. this.lo.Visible = .t. * Label for display lcLabel = SYS(2015) this.AddObject(lcLabel, "Label") this.loLbl = this.&lcLabel this.loLbl.Caption = GETWORDNUM(gcWords, 1 + INT(VAL(RIGHT(this.Name, 1)))) this.loLbl.AutoSize = .t. this.loLbl.Left = this.lo.left + this.lo.width + 5 this.loLbl.Visible = .t. ENDPROC PROCEDURE mth_highlight LPARAMETERS tcSearchText LOCAL lnI, lnAt, lcText * Remove any previous highlighting this.mth_unhighlight * Iterate while there are things to highlight lnI = 1 lcText = this.loLbl.Caption DO WHILE LEN(lcText) > 0 * Search for another instance lnAt = ATC(tcSearchText, lcText) IF lnAt = 0 * All done this.loLbl.visible = (lnI = 1) EXIT ENDIF * Display the label portions IF lnAt = 1 * It's at the beginning, only one label this.mth_new_label(@lnI, LEFT(lcText, LEN(tcSearchText)), .t.) ELSE * It's somewhere in the middle, two labels required this.mth_new_label(@lnI, LEFT(lcText, lnAt - 1), .f.) this.mth_new_label(@lnI, SUBSTR(lcText, lnAt, LEN(tcSearchText)), .t.) ENDIF * Move past that content lcText = SUBSTR(lcText, lnAt + LEN(tcSearchText)) ENDDO * Is there text remaining? IF lnI != 1 AND NOT EMPTY(lcText) * Yes this.mth_new_label(@lnI, lcText, .f.) ENDIF ENDPROC PROCEDURE mth_new_label LPARAMETERS lnI, tcText, tlHighlight * Make sure we have a label IF TYPE("this.loLbls[" + TRANSFORM(lnI) + "]") != "O" DIMENSION this.loLbls[lnI] lcLabel= SYS(2015) this.AddObject(lcLabel, "Label") this.loLbls[lnI] = this.&lcLabel ENDIF * Set the content this.loLbls[lnI].Caption = tcText this.loLbls[lnI].Left = IIF(lnI = 1, this.loLbl.left, this.loLbls[lnI - 1].Left + this.loLbls[lnI - 1].Width - 2) this.loLbls[lnI].AutoSize = .t. this.loLbls[lnI].Visible = .t. this.loLbls[lnI].BackColor = IIF(tlHighlight, RGB(0,255,0), this.loLbl.BackColor) this.loLbls[lnI].ForeColor = IIF(tlHighlight, RGB(0, 0, 0), this.loLbl.ForeColor) * Move to next item lnI = lnI + 1 ENDPROC PROCEDURE mth_unhighlight LOCAL lnI this.loLbl.visible = .t. IF TYPE("this.loLbls[1]") = "U" this.AddProperty("loLbls[1]", .NULL.) ENDIF FOR lnI = 1 TO ALEN(this.loLbls, 1) IF TYPE("this.loLbls[lnI]") = "O" TRY this.RemoveObject(this.loLbls[lnI].Name) CATCH ENDTRY ENDIF this.loLbls[lnI] = .NULL. NEXT DIMENSION this.loLbls[1] this.loLbls[1] = .f. ENDPROC ENDDEFINE