Formatting text

29 views
Skip to first unread message

Jostein Bakke

unread,
Dec 27, 2025, 7:07:55 AM12/27/25
to TheDBCommunity
Perhaps a luxury-problem?:
I have some news-articles stored in a table, where the texts in the articles are saved in a memo-field.  (And a pointer to a PDF-file in another field – forget that.)  Using the memo-field I can search for whatever.  Lets, for simplicity sake, say that I want a list over all the articles that contain then name George.  In a report I want to display some of the text before and after the search-word, so that it is easy to se the context of the search-word(s). This I have done.

Now the question: Is it possible to format the text (using ObjectPAL) so that the search-word is bold (within the tekst)?  (…and then George did this and that…)

Jostein Bakke

Kevin Zawicki

unread,
Dec 27, 2025, 8:07:01 AM12/27/25
to TheDBCommunity
There is no automatic way to do this...

I have done this is a few ways.

 

You can use a formatted memo field type and parse the test to find the words and then select the word and make it bold.

 

Find the text and select it (in OPAL).

 

Look at these types of commands (examples):

active.action(MoveRightWord)

active.action(SelectLeftWord)

 

 

Then look at something like this (snipped code)

method FontFormatKeys(var eventInfo KeyEvent) logical

 var

  ky                   string

  fs        smallInt

  retval logical

 endvar

 

 ky = eventinfo.vchar()

 retval = true

 

 if eventInfo.isControlKeyDown() = true then

  retval = false

 

  fs = active.Font.Style

  switch

   case ky = "B":

    active.Font.Style = fs.bitXOR(FontAttribBold)

 

   case ky = "U":

    active.font.style = fs.bitXOR(FontAttribUnderline)

 

   case ky = "I":

    active.font.style = fs.bitXOR(FontAttribItalic)

 

   case ky = "K":

    active.font.style = fs.bitXOR(FontAttribStrikeOut)

 

   case ky = "N":

    active.font.style = FontAttribNormal

 

   case ky = "VK_UP":

    active.font.size = active.font.size + 1

 

   case ky = "VK_DOWN":

    if active.font.size > 1 then

     active.font.size = active.font.size - 1

    endif

 

   otherwise:

    retval = true

 

  endswitch

 

 endif

 

 return retval

endMethod

 

 

Other methods include doing this outside of Paradox and pasting an RTF into the Fmemo field. This got a little trickier in the new MS Office, when it changed to XML internal format.

 Or

In OPAL parse the plain text and create a HTML doc and display in browser.

 

 


Jostein Bakke

unread,
Dec 27, 2025, 10:20:52 AM12/27/25
to TheDBCommunity
Thanks a lot for the answer. I should have mentioned what I have tried:

I have tried the RTF-approach. I read in a template RTF-file into an array, like this:
[1]  {\rtf1\ansi\deff0
[2]  {\fonttbl\f0\fswiss\fcharset0\fprq2 Arial;}
[3]  Etc…

[6]  Text1
[7]  }{\f0\fs28\b\cf1
[8]  Text2
[9]  }{\f0\cf1  
[10]  Text3
[11]  }}
Item 6, 8 and 10 are changed into the «before the bold»-part of the text, item 8 is the bold part, end item 10 is the after-part (not bold).
I have tried to save this file into en RTF-file (successfully! – it will open as a rtf-file), however Paradox don't think it is a RTF-file.  I cannot get it back to a memo-variable (readFromRTFFile() will just show all the ansi-characters).

I have also tried to put the string into a field, and made objectPAL select the text I want to make bold (works OK), however I cannot find a code that works on the SELECTED text («active» will work on the field).  
(I have also tried to open the pop-up-menu for the field, but MouseRightUp won't invoke it. (Planned to use sendKeys()…).

Do you have an example of a code that works?

BTW: Merry X-mas!

Jostein Bakke

Kevin Zawicki

unread,
Dec 27, 2025, 11:34:41 AM12/27/25
to TheDBCommunity
...
however I cannot find a code that works on the SELECTED text

active.Font.Style = fs.bitXOR(FontAttribBold)
works on text I have selected, I select the text by mouse or by OPAL, I am in field view mode

Jostein Bakke

unread,
Dec 28, 2025, 3:05:06 AM12/28/25
to TheDBCommunity
That did it!
Actually the simpler code:  active.Font.Style = FontAttribBold   also worked.
Thanks a lot!
Jostein Bakke

Steven Green

unread,
Dec 28, 2025, 9:30:07 AM12/28/25
to TheDBCommunity
just a word of caution here, if you need to write this stuff back to fields in tables.. 

memo fields are not always stable, especially if they are edited frequently
formatted memo fields are way less stable than memo fields, especially if they are edited frequently

Mark Bannister

unread,
Jan 6, 2026, 3:35:35 PMJan 6
to TheDBCommunity
I've got some code  from  somebody/sometime/somewhere  that can programmatically do this.    The mess I just pasted is from an old form where I was playing with formatting the output of the tracer.  It worked but is a mess.  I just cut and pasted the form info here.  Look for the method: cfRtfFormat to get an idea on how it works.  cfFormatLine is a higher level call that might help understand.  MUCH of this you can ignore.


proc cpRemoveFIlterTail(stfilter string) string
var
   myar array[] string
   li1 longint
   strt string
endvar
      stfilter.breakapart(myar,".")
      strt = ""
      for li1 from 1 to myar.size() -1
          strt = strt+iif(strt="","",".")+ myar[li1]
      endfor

      return strt
endproc


method Parse(stfilename string)
   logical
var
answer         logical
  mysettings dynarlo
   txt textstream
   methodar dynarray[] string
   stobject,stmethod,stlinenum,stcode string
   stType,stEvent, strest, stself  string
   liIndent longint
   mytc tcursor
   stline,st1
   ,stfill
   ,sta
              string
   liID
   ,liRecColor
   ,li2
   ,liMethCount longint


   litxtSize longint
   Memo1 memo
   params dynArAtType

   stFilter string
   myfil    dynarray[] string
endvar


try
 Settings(mySettings,true)
SetMouseShape(Mousewait,true)
  ; DelayScreenUpdates(yes)
ErrorTraponwarnings(yes)
   ignorecaseinstringcompares(true)
   liIndent = 0
   liMethCount = 0
   liID = 0
   txt.open(stfilename,"R")
   txt.end()
   msgfld.cmStatusSetup( txt.position(),"Parsing Tracer")


   txt.home()
    mytc.open(dmgetproperty(TraceOutputdm'tablename,"FullName")  )
  ; mytc.dmattach("TraceOutputdm")
   mytc.edit()
   mytc.empty()
   stFilter = ""

   while not txt.eof()
    txt.readline(stline)
      msgfld.cmStatusInc( txt.position() )
     ; stline = cmChompNUll(stline)
      if stline.isblank() then
      loop
      endif
      if txt.eof() then
      quitloop
      endif
      mytc.insertrecord()
      liID = liID + 1
      mytc."ID" = liID
      mytc."BuiltIn" = 0
      mytc."LineFilter" = stFilter + string(liID)
      mytc."LoShow" = 1
      if not mytc.isvalid ( "code",stline) then
      msgstop("YIPE","Invalidi line")
      endif
      mytc."CollapseType" = 0
    ;  stBracket = ""
      switch
      case stline.advmatch("^([^:]*)::([^:]+):([0-9]+)=>(..)",stobject,stmethod,stlinenum,stcode) :
            ;line of code
             if stObject="" then stObject = "Form" endif
            mytc."ObjectName" = stobject
            mytc."MethodName" = rtrim(ltrim(stmethod ))
            mytc."LineNum" = longint(stlineNum)
            mytc."Code" =  ltrim(ltrim(stcode))
            mytc."Indent" = liIndent
            mytc."LineType" = 4
         ;   stBracket = "";stContinueGroup

         case stline.advmatch("^([^:]*):Entering method([^.]+)",stobject,stmethod) :
            ;start of method
             if stObject="" then stObject = "Form" endif
              mytc."ObjectName" = ltrim(rtrim(stobject))
              mytc."MethodName" = rtrim(ltrim(stmethod))
              mytc."Code" = "Entering Method"; cfrtfBold("Entering Method")


                   liIndent = liIndent + 1
                   mytc."Indent" = liIndent
                mytc."LineType" = iif(liIndent=0,1, SpChStartMethodCT)

                stFilter = mytc."LineFilter" +"."
                mytc."CollapseType" = 5

         case stline.advmatch("^([^:]*):Leaving method([^.]+)",stobject,stmethod) :
            ;endof method
             if stObject="" then stObject = "Form" endif
            mytc."ObjectName" = rtrim(ltrim(stobject))
            mytc."MethodName" = ltrim(ltrim(stmethod))
            mytc."Indent" = liIndent

            if mytc."MethodName" = "calcField" then
            ;do what?? huh?
          else
              liIndent = liIndent -iif(liIndent>0,1,0)
            endif

              mytc."Code" = "Leaving Method"; cfrtfBold("Leaving Method")
              mytc."LineType" = SpChEndMethodCT ;iif(liIndent=0,2,10)
             stfilter= cfChopSt(stfilter)  ;remove "."
             mytc."LineFilter" = stfilter
              stfilter= cpRemoveFIlterTail(stfilter)
              if stfilter<>"" then
                 stfilter = stfilter+"."
              endif
              mytc."CollapseType" = 7

          case stline.advmatch("^([^:]+):([^,]+), self = \"([^\"]+)(..)",stType,stevent,stSelf,strest) :
                  mytc."ObjectName" = rtrim(ltrim(stType))
            mytc."MethodName" = ltrim(ltrim(stevent))
                  mytc."Code" = stSelf+"--"+strest
                  mytc."BuiltIn" = 1

               ; stBracket = ""
                mytc."LineType" = 0
         otherwise :
           ; fail(Usererror,"Did not match this string:"+stline)
           mytc."Code" = stline
      endswitch
      if NOT cfFormatLine( mytc,memo1,liRecColor,params) then
      fail(UserError,"")
      endif
      mytc."Display" = memo1
      mytc."RecColor" = liRecColor
   
      mytc.UnlockREcord()
   endwhile
     mytc.endEdit()

      myfil["LoShow"] = "1"

     try
        mytc.setGenFilter(myfil)
     onfail
           errorclear()
     endtry

     mytc.home()
    dmresync("TraceOutputdm",mytc)
     mytc.close()
     txt.close()
answer = true
onfail
errorshow()
  ; libCommon.Errorlogshow(libCommon.Errorlogger())
    ; libCommon.Errorclosetc(,answer)
answer=false
endtry
Settings(mySettings,false)
SetMouseShape(MouseArrow,false)
TraceOutputdm.action(DataBegin)
 msgfld.cmStatusReset()
DelayScreenUpdates(No)
TraceOutputdm.moveto()
return(answer)
endMethod
 Parse ‘ method init(var eventInfo Event)

{Code Mark Bannister
  4-2-2009
  version 2.1 BETA

 Feel free to use copy and abuse
 If you have questions post them on pnews newsgroups  (see www.thedbcommunity.com for info)

}
CurrFontSizeGL = DefaultFontSizeCt
CurrFontColorGl = black
buildTables()
fontorderargl.addlast("Arial")
fontNamesArGl["Arial"] = 0
fontCodearGL["Arial"] ="\\f0\\fswiss\\fcharset0\\fprq2 Arial"

fontOrderArGL.addlast("Wingdings")
FontNamesArGL["Wingdings"] = 1
fontCodearGL["Wingdings"] ="\\f1\\froman\\fcharset2\\fprq2 Wingdings;"

fontOrderArGL.addlast("MS Mincho")
fontNamesArGL["MS Mincho"] = 2
fontCodearGL["MS Mincho"] = "\\f2\\fmodern\\fprq1\\fcharset128 MS Mincho"

foMe.attach()
 

SpecialCharARGL [SpChStartMethodCT] = "\\'84\\'ac" ;start group
SpecialCharARGL [SpChEndMethodCT] ="\\'84\\'af" ;end group
SpecialCharARGL [SpChContinueMethodCT] = "\\'84\\'ab" ;continue group
SpecialCharARGL [SpChContinueCurrentMEthodCT] = "\\'84\\'b0"  ;continue current group

SpecialCharARGL [SpChArrowDownCT] = cfrtfFormat("\\'da","Wingdings",0,1,False,False,False)  ;uncollapsed
SpecialCharARGL [SpChArrowRightCT] = cfrtfFormat("\\'d8","Wingdings",0,RED,False,False,False)  ;collapsed
SpecialCharARGL [SpChArrowUpCT] = cfrtfFormat("\\'d9","Wingdings",0,1,False,False,False)  ;end uncollapsed segment

SpecialCharARGL [SpChExtendMethodCT] = "\\'84\\'aa" ;extend group "-"
SpecialCharARGL [SpChExtendMethodDownCT] = "\\'84\\'b1"  ;extend down
SpecialCharARGL [SpChExtendMehodUpCT] = "\\'84\\'b3" ;extendup

 {
SpecialCharARGL [1] = cfrtfFormat("\\'84\\'ac","MS Mincho",0,1,False,False,False) ;start group
SpecialCharARGL [2] = cfrtfFormat("\\'84\\'af","MS Mincho",0,1,False,False,False)  ;end group
SpecialCharARGL [3] = cfrtfFormat("\\'84\\'ab","MS Mincho",0,1,False,False,False) ;continue group
SpecialCharARGL [4] = cfrtfFormat("\\'84\\'b0","MS Mincho",0,1,False,False,False)  ;continue current group
SpecialCharARGL [5] = cfrtfFormat("\\'da","MS Mincho",0,1,False,False,False)  ;uncollapsed
SpecialCharARGL [6] = cfrtfFormat("\\'d8","MS Mincho",0,1,False,False,False)  ;collapsed
SpecialCharARGL [7] = cfrtfFormat("\\'d9","MS Mincho",0,1,False,False,False)  ;end uncollapsed segment
SpecialCharARGL [8] = cfrtfFormat("\\'84\\'aa","MS Mincho",0,1,False,False,False) ;extend group "-"
SpecialCharARGL [9] = cfrtfFormat("\\'84\\'b1","MS Mincho",0,1,False,False,False)  ;extend down
SpecialCharARGL [10] = cfrtfFormat("\\'84\\'b3","MS Mincho",0,1,False,False,False) ;extendup
}
{ to install MS Mincho font on windows XP
   1. Click on the Start button.
   2. Click on Control Panel.
          * The Control Panel is directly accessible in the standard Start menu but it is inside Settings in the classic Start menu.
   3. Click on "Date, Time, Language and Regional Options."
   4. Select the "Add other languages" task.
          * Or click on "Regional and Language Options" and select the Languages tab.
   5. Check the "Install files for East Asian languages" option and click on the Apply button.
   6. Click Yes when you are asked to restart Windows.
   7. Go to "Add other languages" again and click on the Details button.
   8. Click on the Add button.
   9. Select the language you want to add in the drop-down list of input languages.  You may also change the default input method editor in the drop-down list of keyboard layouts if you prefer another one.
  10. Click OK as many times as you are prompted to and then close "Date, Time, Language and Regional Options."


  RTF spec can be found here
  http://latex2rtf.sourceforge.net/RTF-Spec-1.0.txt
  pdox does not follow it very well and does not support many features
}

endMethod
 init + $ 2 method BuildTables()
var
mytbl table
   stname  string
   mytc tcursor
endvar
try
stname = dmgetproperty(TraceOutputdm'tablename,"FullName")

;this is just in case you replaced the
;datamodel table with something else and accidently saved it.
;
if (stname.lower() <> ":priv:__tracer.db") then
if (msgquestion("IMPORTANT","Table: "+stname+" will be over written.\n\nProceed?") = "Yes" ) then
       fail(UserError,"Did not allow table to be over written.")
   endif
endif
mytbl = create  stName
 with
  "ID":"I",
  "ObjectName":"A100",
  "MethodName":"A100",
  "LineNum":"I",
  "Code":"A255",
  "Indent":"I",
  "BuiltIn" : "S",
  "RecColor" : "I",
  "LineType" :"I",  ;1 start, 2 end, 3 continue
  "LineFilter" : "A100",
  "LoShow" : "S",
  "CollapseType" : "I" , ;
  "display" : "F1"
 key
  "ID"
endCreate
sleep()
onfail
errorshow()
endtry

if NOt  isfile(":priv:parsehilite.db") then
    mytbl=  create ":priv:parsehilite.db"
       with
        "Id":"+",
        "MatchText":"A255",
        "loAdvmatch":"S",
        "matchTextColor":"I",
        "matchRecordColor":"I",
        "loBold":"S",
        "loItalics":"S"
       key
        "Id"
       languageDriver "intl850"
       versionLevel "7"
      endCreate
      sleep()

     mytc.open(":priv:parsehilite.db")
     mytc.edit()
     mytc.InsertREcord()
     mytc."MatchText"="Error"
     mytc."loAdvMatch"=0
     mytc."MatchTextColor" = 0
     mytc."MatchRecordColor" = 65535
     mytc."LoBold" = 1
     mytc."loItalics" = 1
     mytc.unlockRecord()

     mytc.InsertREcord()
     mytc."MatchText"="fail"
     mytc."loAdvMatch"=0
     mytc."MatchTextColor" = 0
     mytc."MatchRecordColor" = 255
     mytc."LoBold" = 1
     mytc."loItalics" = 1
     mytc.unlockRecord()

     mytc.InsertREcord()
     mytc."MatchText"="..elapsed.."
     mytc."loAdvMatch"=1
     mytc."MatchTextColor" = 16711935
     mytc."MatchRecordColor" = blank()
     mytc."LoBold" = 1
     mytc."loItalics" = 0
     mytc.unlockRecord()

     mytc.close()
endif

endMethod
 BuildTables % B method colorme(liIndent longint, stObjectname string, stmethodName string
             , lilineNum longint, stcode string)  string
var
st1, st2,st3
   ,stout     string
   li1 longint
endvar


{
fill(" ",[TraceOutputdm.Indent]*8)+[TraceOutputdm.ObjectName]+"::"
+ [TraceOutputdm.MethodName]
+string([TraceOutputdm.LineNum])+"=>"+[TraceOutputdm.Code]

}


ignorecaseinstringcompares(true)


{
 if (search(MethodName.value,"errorlog")>0) or (search(MethodName.value,"fail(")>0) then
MethodName.color = Yellow
   MethodName.translucent = True
 else
    MethodName.color = White
   MethodName.translucent = Transparent
endif


methodname.font.style = iif(isblank(LineNum.value) ,fontattribbold,fontattribnormal)

methodname.font.color = iif(BuiltIn.value = 1,darkgreen,black)
}
return "HI"
endMethod
 colorme & “ method cfFontColor(stText string, liFontColor longint) string
 return "{\\cf"+ string(cfFontColorIndex(liFontColor))+" "+sttext+"}"

endMethod
 cfFontColor ' „ method cfFontColorIndex(liColor longint) longint
var
   li1 longint
endvar
;send font color and return font index number
;add to table if required
if colorListArgl.size()<1 then
  ColorListarGL[black] = 1
endif

if Not ColorListarGl.contains(licolor) then
   li1 = ColorListarGl.size()+1
   ColorListarGl[licolor] =  li1
endif
return  ColorListarGl[licolor]


endMethod
 cfFontColorIndex ( W method cfMakeColorTable() string
var
   stcolorTbl string
   r,g,b  smallint
   li1 longint
   st1 string
   keyar dynarray[] longint
endvar
stColorTbl = "{\\colortbl; "

foreach st1 in ColorListargl
;key is actually the color number
     keyar[ colorlistargl[ st1 ] ] = longint(st1) ;flip the arrary from [color]= position to [position] = color
endforeach

foreach st1 in keyar


      getRGB( keyar[st1], r,g,b)
      stColortbl = stColortbl+"\\red"+string(r)+"\\green"+string(g)+"\\blue"+string(b)+";"

endforeach
stcolortbl = stcolortbl +"}"
return StColorTbl
endMethod
 cfMakeColorTable ) ž
 method cfRTFBold(stText string) string
;return "{\\b"+sttext+"}"
 return cfRtfFormat(stText,"",CurrFontSizeGL,CurrFontColorGl,True,false,false)
endMethod
 cfRTFBold *   method cfRTFItalic(sttext string) string
;return "{\\i"+sttext+"}"
 return cfRtfFormat(stText,"",CurrFontSizeGL,CurrFontColorGl,False,True,false)
endMethod
 cfRTFItalic + W method cfRTFStrikeOut(stText string) string
return "{\\strike"+sttext+"}"
endMethod
 cfRTFStrikeOut , ¤ method cfRtfUnderline(sttext string) string
;return "{\\ul"+sttext+"}"
 return cfRtfFormat(stText,"",CurrFontSizeGL,CurrFontColorGl,False,false,True)
endMethod
 cfRtfUnderline €@ Const
 DefaultFontSizeCt =   20  ;in half points

 SpChStartMethodCT = 1
 SpChEndMethodCT =2
 SpChContinueMethodCT  = 3
 SpChContinueCurrentMEthodCT = 4
 SpChExtendMethodCT = 8
 SpChExtendMethodDownCT = 9
 SpChExtendMehodUpCT = 10

 SpChArrowRightCT = 6
 SpChArrowDownCT = 5
 SpChArrowUpCT = 7

endConst
 Const - ; method cfRtfFormat(stText string ;text to format
                  ,stFontname string ;arial or symbol
                 ,siFontSize smallint  ;in half points 24 = 12 points
                 ,liFontColor longint  ;longint remember pdox color constants also  red white etc
                 ,loBold logical
                 ,loItalic logical
                 ,loUnderline logical
                 ;,loStrikeout loigcal  strikeout would be supported as well but who usese it - \strike
                 ) string
var
   strt string
endvar
try
  ;create a group of text with this format
 if stFontName="" then
  stFontName = fontorderargl[1]
 endif
  strt = "{\\f"+  string(fontNamesArGl[stfontname])
  if siFontsize < 1 then
     siFontSize = DefaultFontSizeCt    ;fs  standards default is 24 (12 points)
  endif
  strt = strt+ "\\fs"+string(sifontsize)

  if liFontColor  < 1 then
     liFontColor = 1
     ;cf
  endif
  if loBold then
     strt=strt+"\\b"
  endif
   if loItalic then
     strt=strt+"\\i"
  endif
   if loUnderline then
     strt=strt+"\\ul"
  endif
  {
    if loStrikeout then
     strt=strt+"\\strike"
  endif
    }
  strt = strt +"\\cf"+ string(cfFontColorIndex(liFontColor))


 strt = strt +sttext+"}"

onfail
      errorshow()
      strt=""
endtry
return strt
endMethod
 cfRtfFormat . š
 method RTFtoMemo(stRTF string) memo
var
   m1, m2 memo
   b binary
  st1 string
endvar
try
  ;RTF to memo
m1 = blank()
 ; standard rtf header
st1 = "{\\rtf1\\ansi\\deff0" + cfFontTable()



st1 = st1 + cfMakeColorTable()
;fs24 is 12 point font
st1= st1 + "\\pard{\\f0\\fs"+string(DefaultFontSizeCt)+"\\cf1"

strtf = st1 + strtf +"}"

  ;Code from Michel Claveau  www.ponx.org
m2 = memo(stRTF)
m2.WriteToClipBoard()
sleep()
b.ReadFromClipBoard("CF_TEXT")
sleep()
b.WriteToClipBoard("Rich Text Format")
sleep()
m1.ReadFromClipboard() ;mémo formatté

sleep()

onfail
      errorshow()
      m1 = blank()
endtry
return m1
endMethod
 RTFtoMemo €È Var
ColorListarGL  dynarray[] longint
CurrFontSizeGL smallint
CurrFontColorGl longint
hiliteTCGL tcursor
rtlcolorarGL dynarray[] longint  ;paradox rtl color contansts  [color]= value

fontOrderArGL array[] string
fontNamesArGl dynarray[] longint
fontCodearGL dynarray[] string

hilightArGL dynarray[] string

SpecialCharARGL array[10] string

hiliteArgl  array[] longint ; list of records that have find text hilighted

foMe form
endVar
 Var / v
 method MemoToRtf(memoVar memo)  string    ;untested
var
m1,m2 memo
b binary
stvar string
endvar
try
  ;Code from Michel Claveau  www.ponx.org
memovar.WriteToClipBoard() ;mémo formatté
b.ReadFromClipboard("Rich Text Format")
b.WriteToClipBoard("CF_TEXT")
stvar.ReadFromClipboard() ;source rtf
onfail
errorshow()
   stvar =""
endtry
return stvar
endMethod
 MemoToRtf 0 = method hiliteCode(stCode string,litype longint,  var liRecColor longint)   string
var
strt
   ,stmatch
   ,st1,st2,st3
   ,stesc  string
   lomatch logical
    params dynArAtType
endvar

try
  errortraponwarnings(yes)

 liRecColor = 0
if NOT hiliteTCGL.isassigned() then
hiliteTCGL.dmattach("optionsDM")
endif
if liType = 2 or liType = 3 then
   strt = cfrtfBold(stcode)
else
    strt= stcode
endif
scan hiliteTCGL :

hiliteTCGL.copytoarray(params)
   if NOT cmHiliteCodeAlpha(stcode,lomatch ,params) then
    fail(USerError,"")
   endif

      if liRecColor = 0 and lomatch then
            liRecColor = hiliteTCGL."MatchRecordColor"
      endif



endscan
stRt = stcode
onfail
errorshow()
   strt= "HILITEERROR!!!!!!!!!"
endtry
;errortraponwarnings(no)
return stRT


endMethod
 hiliteCode method close(var eventInfo Event)

if eventInfo.isPreFilter() then
;// This code executes for each object on the form

else
;// This code executes only for the form
  if hiliteTCGL.isassigned() then
      hiliteTCGL.close()
     endif
endIf

endMethod
 close + 1 Q
method cmColorConstants()
var
mytc tcursor
endvar
try
if   rtlcolorarGL.size() = 0 then
      enumRTLConstants(":priv:__ccparse.db")
      sleep()
      mytc.open( ":priv:__ccparse.db" )
      sleep()
      scan mytc :
       if mytc."GroupName" <> "Colors"   then
        loop
       endif
       if   longint(mytc."Value") < 0 or mytc."ConstantName" ="clTranslucent" or mytc."ConstantName" ="clTransparent" then
        loop
       endif
         rtlcolorarGL[ mytc."ConstantName" ]= longint(mytc."Value")
      endscan
endif
onfail
errorshow()
endtry
endMethod
 cmColorConstants 2 ¹ method cfPickcolor(livalue longint )  longint
var
mypop popupmenu
   st1 string
endvar
  cmColorConstants()
  foreach st1 in rtlcolorarGL
  mypop.addtext( st1 )
  endforeach
  mypop.addtext("None")
  mypop.addtext("Cancel")
  st1 = mypop.show()
  switch
  case st1="None" :
    return blank()
   case   st1="" or st1="Cancel" :
  return livalue
  otherwise :
  return rtlcolorarGL[ st1 ]
  endswitch

endMethod
 cfPickcolor 3 Š
 method Settings(var mysettings dynarlo,storing Logical)

{Store common settings and restore them later
}
try
   if storing then
      mysettings["isErrorTrapOnWarnings"] = isErrorTrapOnWarnings()
      mysettings["isIgnoreCaseinLocate"] = isIgnoreCaseinLocate()
      mysettings["isIgnoreCaseinStringCompares"]= isIgnoreCaseinStringCompares()
      mysettings["isAdvancedWildCardsinLocate"] = isAdvancedWildCardsinLocate()
      mysettings["isblankzero"] = isBlankZero()

   ELSE  ;\\restoring

      ErrorTrapOnWarnings(mysettings["isErrorTrapOnWarnings"])

      IgnoreCaseinLocate(mysettings["isIgnoreCaseinLocate"])

      IgnoreCaseinStringCompares(mysettings["isIgnoreCaseinStringCompares"])

      AdvancedWildCardsinLocate(mysettings["isAdvancedWildCardsinLocate"])

      BlankAsZero(mysettings["isblankzero"])



   ENdif
onfail

   errorshow()
endtry

endMethod
 Settings €m Type
dynarlo = dynarray[] logical
dynArAtType = dynarray[] AnyTYpe
arLongType = array[] longint
endType
 Type 4 method cmAdvanceMatchEscape ( stdata    String ) String
      ; escape reserved stuff
      var
           stanswer                     String
           stchar
              , stlist                  String
           myar                         Array [ ] String
           i longint
      endVar
      try
              ;characters to escape
           stlist = "\\ ( ) [ ] \" ^ $ . @ * + ? |"
           stlist.breakapart ( myar , " " )
           stanswer = stdata
           for i from 1 to myar.size ( )
                stanswer = cmSubstitutestringst ( myar [ i ] , "\\" + myar [ i ] , stanswer )
           endFor
      onFail
           errorshow ( "cmAdvancematchEscape" )
           stdata = "Error"
      endTry
      return stanswer
EndMethod
 cmAdvanceMatchEscape 5 ‘ method cmSubstituteStringST ( stFindinString String
                             , stReplaceWith String
                             , stString String
                             ) String
{ in string STstring
 find all occurances of stFindinString and replace with stReplacewith
 }
      var
           answer                       String
           mysettings dynarlo
           pos
              , nextPos                 LongInt
           stFront
              , stBack                  String
      endVar
      try
           Settings ( mySettings , true )
           SetMouseShape ( Mousewait , true )
           ;  DelayScreenUpdates(yes)
           ErrorTraponwarnings ( yes )
           answer = ""
           pos = stString.searchex ( stFindInString )
           while pos > 0
                stBack = ""
                stFront = ""
                if pos > 1 then
                     stFront = stString.substr ( 1 , pos - 1 )
                else
                     stFront = ""
                endIf
                nextPos = pos + stFindInString.sizeex ( )
                if Nextpos < stString.sizeex ( ) + 1 then
                     stBack = stString.substr ( nextpos , stString.sizeex ( ) + 1 )
                else
                     stBack = ""
                endIf
                answer = answer + stfront + stReplacewith
                stString = stback
                pos = stString.searchex ( stFindInString )
           endWhile
           if answer <> "" then
                answer = answer + stBack
           else
                answer = stString ;no matches made
           endIf
           ;  answer = ststring
      onFail
           errorshow ( )
           answer = "<ERROR>"
      endTry
      Settings ( mySettings , false )
         ;SetMouseShape(MouseArrow,false)
         ;DelayScreenUpdates(No)
      return ( answer )
EndMethod
 cmSubstituteStringST 6 õ
 method cfFontTable() string
var

strt, st1 string
   li1 longint
endvar

strt = "{\\fonttbl"
for li1 from 1 to fontOrderArGL.size()
strt = strt+  fontcodeargl[ fontOrderArGL[li1] ]+";"
endfor
strt= strt+"}"
return strt
endMethod
 cfFontTable 7 8 {
3-2008 added findagain CTRL-A
3-18-2005 fixed it so that if you are sitting on a match it will not bother
   seraching  added findinUI to do this
    added ignorecaseinstringcompares

8-24-04 mytime set to time always
2-13-04  fixed so numpad works

2-14-2003  added searmetc -- very similiar
;changes here need to be made there


}

CONST
   DELAYTIME = 1000
ENDCONST

var
;   stLastFindGL string
endvar


proc findinUI(var ui uiobject ;object searching

              ,stFinding     string; what we are looking for
              ,stFindingPlus  string ;find plus pattern stuff
              ,loFindAgain logical
              ) logical
var
   answer         logical
   mysettings   dynarlo
     sthold         string
   ;  mytc           tcursor
endvar


try
   answer = false

    stHold = TraceOutputDM.display.value

       if   loFindAgain then
            answer = ui.locateNextPattern("Display",stFindingplus)
       else
             if stFinding.size() < sthold.size() then
             ;if we match already then don't keep going
                if stFinding = sthold.substr(1,stfinding.size()) then
                   answer = true
                endif
            endif
              if NOt answer then
                answer = ui.locatePattern("Display",stfindingplus)
             endif
       endif



   
onfail
 errorshow()
     ; libCommon.Errorclosetc(mytc,answer)
   answer=false
endtry

return(answer)

endproc



Proc writeMsg(const finding string, status string)
var
   hold          string
endvar

switch
      case status = "found" :
           ;\\ findfld.value = findfld.value + mykey
          findbox.color = white
         findfld.toggleFindBtn( True)
         findfld.setTimer( DELAYTIME )

      case status = "partial" :

         findbox.color = white
         findfld.toggleFindBtn( True)
          findfld.setTimer( DELAYTIME )

      case Status = "clear" :

             findfld.value=""
              findbox.color = white
              findfld.toggleFindBtn(false)
           
      otherwise :  ;\\not found

         findfld.toggleFindBtn( false )
         findbox.color = 6711039
endswitch
findfld.value =  finding

endproc

method searchme(var eventInfo KeyEvent) logical
{


 }
var
   ui             uiobject
   holdWild,holdcase,holdwarn       logical
   vhold
     ,chold
     ,finding       string
   foundit           logical
   myform                    form
   objname              string
   j,i                   smallint
     ;\\ mytc                         tcursor

   myflds                        array[] anytype
   isnum                       logical

   msgui            uiobject

    mysettings  dynarlo
    loFindAgain             logical
endvar

try
vhold = eventinfo.vchar()
cHold = eventInfo.char()
foundit = true
ui.attach(self.fullname)   ;\\self should be the object that called us
loFindAgain = False

findFld.killtimer()
finding = ""
switch
     
      case EventInfo.iscontrolkeydown() AND ((CHold = "A" ) or vhold="A" ) :
           ;find again
           loFindAgain = True
           chold =""
           vhold=""
           UnHiliteFindText()
           finding = findfld.value
         ;don't do a thing
      case Vhold = "VK_ESCAPE" or Vhold="VK_DELETE"
            or (EventInfo.iscontrolkeydown() AND VHold = "Z" )  ;search box
             :
         finding = ""


         vhold = ""
           chold=""
            writemsg("","clear") ;clears msg
   
         eventinfo.seterrorcode(usererror+1) ;\\this
          UnHiliteFindText()

      case EventInfo.iscontrolkeydown()
         OR EventInfo.IsAltKEydown()
         OR (vHold<>"" AND cHold="") :  ;\\pass it back unchanged
         vhold = ""
           chold = ""
         finding = ""
         if subject.name = "findfld" then
         else
          ; writemsg(msgui,ui,"clear","","") ;clears msg
         endif
      otherwise :
                finding = findfld.value + chold

endswitch


if finding <> "" or loFindAgain then

     ;\\ beep()
     ;\\beep()
   try

      Settings(mySettings,true)


      errortraponwarnings(no)
      ignoreCaseinlocate(Yes)
      advancedWildcardsInLocate(No)
      IgnoreCaseinStringCompares(true)




      eventinfo.seterrorcode(usererror+2) ;\\this disables default behavior of calling object
      eventinfo.setControlKeyDown(False)
      eventinfo.setAltkeydown(false)




    ;  message("finding \""+finding+"\". <ESC> to restart.")
      errortraponwarnings(no)
      foundit = true
      delayscreenupdates(yes)


       ;  stLastFindGL =  finding+".."
        IF not findInUI(ui,finding,finding+"..",loFindAgain) then
           ;   stLastFindGL =  ".."+finding+".."
             if NOT findInUI(ui,finding,".."+finding+"..",loFindAgain) then

                  writemsg(finding,"notfound")
             
               foundit = false
            else
               writemsg(finding,"partial")
               
            endif
         else
            writemsg(finding,"found")
           
         Endif

      if NOt foundit then
         unHiliteFindText()
      endif

      delayscreenupdates(no)


   onfail
      errorshow()
      foundit = false
   endtry

endif ;\\  if searching
if mysettings.size()>0 then
 Settings(mySettings,false)
endif
;mytime = time()
setMouseShape(MouseArrow,false)

onfail
  ; libcommon.Errorlogshow(libcommon.errorlogger())
  errorshow()
   foundit = false
endtry


return(foundit)


endMethod
 searchme - 8 method HiliteFindText( stWord string) logical
var

    mysettings dynarlo
      loAnswer   logical

  ;    stnewword,stRtf,stcode string
      mytc tcursor
     lihold    longint
   ;   loMatch logical
endvar

try
Settings(mySettings,true)
  errortraponwarnings(yes)
   ColorListarGl.empty()
      ignorecaseinstringcompares(true)
    mytc.open(dmgetproperty(TraceOutputdm'tablename,"FullName")  )
  ; dmattach(mytc,"TraceOutputdm")
   mytc.edit()
   dmget("TraceOutputdm","ID",liHold)

   UnhiliteFindText()
;   mytc.forceRefresh()

    mytc.qlocate(lihold)
      hiliteArgl.addlast( mytc."ID" )
   cmHiliteFindTextAlpha(mytc,stword)

    mytc.Unlockrecord()
 cmSynctc(mytc)
try
   mytc.qlocate(lihold)
onfail
      errorclear()
endtry

  dmresync( "TraceOutputdm",mytc)
     mytc.close()
; TraceOutputdm.action(DataRefresh)

  loanswer= true
onfail
errorshow()
   loanswer = false
endtry
  Settings(mySettings,false)
 setMouseShape(mouseArrow,false)
 return loAnswer

endMethod
 HiliteFindText 9 ) method UnHiliteFindText() logical
var

    mysettings dynarlo
      loAnswer   logical
     li1, lihold longint
     memo1 memo
     params dynArAtType
     lireccolor longint
     mytc tcursor
endvar

try
Settings(mySettings,true)
  errortraponwarnings(yes)
     mytc.open(dmgetproperty(TraceOutputdm'tablename,"FullName")  )

   mytc.edit()
   dmget("TraceOutputdm","ID",liHold)
   for li1 from 1 to hiliteargl.size()
      mytc.qlocate(hiliteargl[li1])
       if not cfFormatLine(mytc,memo1,lireccolor,params) then
           fail(USerError+1,"")
        endif
        mytc."Display" = memo1
        mytc."RecColor" = liRecColor
        mytc.Unlockrecord()
   endfor
  hiliteargl.empty()
; dmresync( "TraceOutputdm",mytc)
cmSynctc(myt               ÿ c)
try
   mytc.qlocate(lihold)
onfail
      errorclear()
endtry

dmresync( "TraceOutputdm",mytc)
   mytc.close()
   TraceOutputdm.action(DataRefresh )
  loanswer= true
onfail
errorshow()
   loanswer = false
endtry
  Settings(mySettings,false)

 return loAnswer

endMethod

 UnHiliteFindText : method cmSubstituteMemo ( stFindinString memo
                             , stReplaceWith memo
                             , stString memo
                             ) Memo
{ in string STstring
 find all occurances of stFindinString and replace with stReplacewith
 }
      var
           answer                       Memo
           mysettings dynarlo
           pos
              , nextPos                 LongInt
           stFront
              , stBack                  memo
      endVar
      try
           Settings ( mySettings , true )
           SetMouseShape ( Mousewait , true )
           ;  DelayScreenUpdates(yes)
           ErrorTraponwarnings ( yes )
           answer = ""
           pos = stString.searchex ( stFindInString )
           while pos > 0
                stBack = ""
                stFront = ""
                if pos > 1 then
                     stFront = stString.substr ( 1 , pos - 1 )
                else
                     stFront = ""
                endIf
                nextPos = pos + stFindInString.sizeex ( )
                if Nextpos < stString.sizeex ( ) + 1 then
                     stBack = memo( stString.substr ( nextpos , stString.sizeex ( ) + 1 ) )
                else
                     stBack = ""
                endIf
                answer = answer + stfront + stReplacewith
                stString = stback
                pos = stString.searchex ( stFindInString )
           endWhile
           if answer.size() > 0 then
                answer = answer + stBack
           else
                answer = stString ;no matches made
           endIf
           ;  answer = ststring
      onFail
           errorshow ( )
           answer = "<ERROR>"
      endTry
      Settings ( mySettings , false )
         ;SetMouseShape(MouseArrow,false)
         ;DelayScreenUpdates(No)
      return ( answer )

endMethod
 cmSubstituteMemo ; method cfFormatLine(var mytc tcursor,var rtMemo memo, var liRecColor longint,Extraparams dynArAtType ) logical
var
li2 longint
   stfill string
   st1, st2  string
   ;rtMemo memo
   loAnswer
   ,loMatch  logical

   stObject
   ,stMethod
   ,stLineNum
                        string
endvar

try
 stfill=""
   for li2 from 2 to (mytc."Indent")

      stfill  = stfill+ SpecialCharARGL[3]+"  "

   endfor



    switch
    case  mytc."LineType" = SpChContinueCurrentMEthodCT :
        stfill = stfill+ SpecialCharARGL[ mytc."LineType" ]+  SpecialCharARGL[8]+   SpecialCharARGL[8]
   {
     case  ( mytc."LineType" = SpChExtendMethodDownCT or  mytc."LineType" = SpChExtendMehodUpCT) and mytc."Indent">1  :
         stfill = stfill+ SpecialCharARGL[4]+  SpecialCharARGL[8]+ SpecialCharARGL[ mytc."LineType" ]

    case mytc."LineType" = SpChExtendMethodDownCT or  mytc."LineType" = SpChExtendMehodUpCT :
          stfill = stfill + SpecialCharARGL[ mytc."LineType" ]
         }
      case mytc."LineType"< 1 :
     

      otherwise :
     stfill  = stfill+SpecialCharARGL[ mytc."LineType" ]
   endswitch


 stfill = cfrtfFormat(stfill ,"MS Mincho",0,1,False,False,False)



   {   for li2 from 2 to (mytc."Indent")
      if mytc."Indent" = li2 then
            switch
            case   mytc."LineType"= 4 :
               stfill = stfill+SpecialCharARGL[ mytc."LineType" ]+   SpecialCharARGL[8]+   SpecialCharARGL[8]

              case mytc."LineType" = 1 or  mytc."LineType" = 2 :
                  stfill  = stfill+ SpecialCharARGL[3]+"....."+  SpecialCharARGL[ mytc."LineType" ]  ;"|"

              case  mytc."LineType" > 0 :
              stfill= stfill+  SpecialCharARGL[ mytc."LineType" ]
            endswitch
           
         else
      stfill  = stfill+ SpecialCharARGL[3]+"....."  ;"|"
         endif
      endfor  }




     st2 = hilitecode(mytc."Code",mytc."LineType",liRecColor)
   
     stObject =  mytc."ObjectName"
     stMethod =  mytc."MethodName"
     stLineNum = string( mytc."LineNum")
      if Extraparams.size() > 1 then
      if NOt  cmHiliteCodeAlpha(st2,lomatch,Extraparams) then
          fail(USerError+1,"")
         endif
         if NOt  cmHiliteCodeAlpha(stObject,lomatch,Extraparams) then
          fail(USerError+1,"")
         endif
         if NOt  cmHiliteCodeAlpha(stMethod,lomatch,Extraparams) then
          fail(USerError+1,"")
         endif
         if NOt  cmHiliteCodeAlpha(stLineNum,lomatch,Extraparams) then
          fail(USerError+1,"")
         endif

     endif

      st1 =stfill
               + iif(mytc."CollapseType" = 0,"",SpecialCharARGL[ mytc."CollapseType" ] )
               +cfRTFItalic(stObject)
               +"::"
+ cfrtfBold(stMethod)
+cfFontColor(stLineNum,blue)+"=>"
               + st2

     if mytc."CollapseType" > 0 then
    ; beep()
     endif

if mytc."BuiltIn" =1 then
      st1 =cfFontColor(st1,DarkBlue)
      endif

    rtMemo = memo( RTFtoMemo(st1 ) )
    lOAnswer = True
onfail
errorshow()
   rtmemo="PARESEERROR"
   loAnswer = False
endtry
 return loAnswer
endMethod
 cfFormatLine < L method cmHiliteCodeAlpha(var stcode string, var loMatch logical , params dynArAtType)   logical
var
strt
   ,stmatch
   ,st1,st2,st3
   ,stesc  string
   
   loAnswer logical
endvar

try
 ; errortraponwarnings(yes)


lomatch = False
  if (params["loAdvmatch"] = 1) then

         lomatch = stcode.advmatch( "("+ params["MatchText"]  +")" ,stmatch)
  else
    stmatch =  params["MatchText"]
     lomatch= true
  endif
 if  loMatch then
  ;match again
  lomatch = False
  stesc =  cmAdvanceMatchEscape( stmatch )
        if stcode.advmatch("(..)("+stesc+")(..)",st1,st2,st3) then
          lomatch = true

        if Not params.contains("loUnderline") then
           params["loUnderline"] = smallint(0)
        endif
        stcode = st1+cfRTFFormat(st2,"",CurrFontSizeGL,params["MatchTextColor"]
                              ,(params["loBOld"]=1),(params["loItalics"]=1),(params["loUnderline"]=1))
             + st3

  endif
 endif

loAnswer = True
onfail
errorshow()
   loAnswer = False
endtry
;errortraponwarnings(no)
return LoAnswer
endMethod
 cmHiliteCodeAlpha = m method cmHiliteAllFindText(stword string)  logical

var

    mysettings dynarlo
      loAnswer   logical

      stnewword,stRtf,stcode string
      mytc tcursor
      memo1 memo
      liRecColor longint

      params dynArAtType
      loMatch logical
endvar

try
Settings(mySettings,true)
  errortraponwarnings(yes)
   ColorListarGl.empty()
      ignorecaseinstringcompares(true)

 ;  dmattach(mytc,"TraceOutputdm")
  mytc.open(dmgetproperty(TraceOutputdm'tablename,"FullName")  )
   mytc.edit()

   UnhiliteFindText()

   scan mytc :
        if NOT match( mytc."display",".."+stword+"..") then
           loop  ;;;;;;
        endif
         hiliteArgl.addlast( mytc."ID" )

         stcode = hiliteCode(mytc."Code",mytc."LineType",liRecColor)


         params["loAdvmatch"] = smallint(0)
         params["MatchText"] = stword
         params["MatchTextColor"] = 61247; longint(4690683) ;orangey
         params["loBOld"] = smallint(1)
         params["loItalics"] = smallint(1)
         params["loUnderline"] = smallint(1)

        ; cmHiliteCodeAlpha(mytc."Code",lomatch,params)
        if not cfFormatLine(mytc,memo1,lireccolor,params) then
           fail(USerError+1,"")
        endif

          mytc."Display" = memo1
          mytc."RecColor" = liRecColor

          mytc.Unlockrecord()
   endscan
   mytc.EndEdit()
       mytc.close()
 ;  dmresync( "TraceOutputdm",mytc)
 TraceOutputdm.action(DataRefresh)

  loanswer= true
onfail
errorshow()
   loanswer = false
endtry
  Settings(mySettings,false)
 setMouseShape(mouseArrow,false)
 return loAnswer


endMethod
 cmHiliteAllFindText > I method cmHiliteFindTextAlpha(var mytc tcursor, stword string)  logical
var
     memo1 memo
      liRecColor longint

      params dynArAtType
      stcode string
      loAnswer     logical
endvar
try
   stcode = hiliteCode(mytc."Code",mytc."LineType",liRecColor)


   params["loAdvmatch"] = smallint(0)
   params["MatchText"] = stword
   params["MatchTextColor"] =  longint(4690683) ;orangey
   params["loBOld"] = smallint(1)
   params["loItalics"] = smallint(0)
   params["loUnderline"] = smallint(1)

  ; cmHiliteCodeAlpha(mytc."Code",lomatch,params)
  if not cfFormatLine(mytc,memo1,lireccolor,params) then
  fail(USerError+1,"")
  endif

    mytc."Display" = memo1
    mytc."RecColor" = liRecColor
    loAnswer = true
onfail
      errorshow()
      loAnswer = false
endtry
return loAnswer

endMethod
 cmHiliteFindTextAlpha ? É method cmSyncTc(var mytc tcursor) logical
var
   myfil dynarray[] string
   rangear array[] string
   loanswer logical
endvar
try
   traceOutputdm.getrange(rangear)
   if rangear.size() > 1 then
     try
         mytc.setRange(rangear)
     onfail
           errorclear()
     endtry
   endif

   traceoutputdm.getgenfilter(myfil)
   if myfil.size() > 0 then
      try
         mytc.setGenFilter(myfil)
      onfail
            errorclear() ;if errortraponwarnings yes then if
                         ;an empty set will trigger "at begining of table" error
      endtry
   endif

  loanswer = true
onfail
      errorshow()
      loanswer = false
endtry
return loanswer
endMethod
 cmSyncTc @ â ! method getStringBeforeLastInstance(const stOrig string,const stToFind string) string

; Purpose : return a string before last occurence of a specified string
;
; Parameters:
;   stOrig   : original string
;   stToFind : string to find
;
; Return Value: string or empty string if string not found
;
; Test:
;    #1 origString not blank
;    #2 stToFind not blank
;    #3 stToFind smaller than origString
;    #4 stToFind must exist in string
;    #5 stToFind cannot be found at index=1
;
; Version: 1.00 3/6/2005  Submitted R Wiltshire



var
 liSizeOrig,
 liSizeFind,
 liIndex longint
 arPos arLongType
endvar

liSizeOrig = stOrig.sizeEx()
liSizeFind = stToFind.sizeEx()

if liSizeOrig = 0 or        ;Test#1
   liSizeFind = 0 or        ;Test#2
   liSizeFind > liSizeOrig  ;Test#3
  then
     return("")
  endif

;Test#4  does stToFind exist ?
liIndex = stOrig.searchEx(stToFind)
if liIndex = 0 then
   return("")
  endif

; only call if at least one match
searchAll_array(stOrig,stToFind,arPos)

; last item in array is last index
liIndex = arPos[arPos.size()]

;Test#5 liIndex=1, nothing before it
if liIndex = 1 then
      return("")
   endif

return(stOrig.substr(1,liIndex-1))

endMethod
 getStringBeforeLastInstance A ¾ method searchAll_array(const stOrig string,
                          const stToFind string,
                          var arPos arLongtype) logical

; Purpose : enhance pdox searchEx function and find all matches
;    match is for entire string, not pieces of it
;    all match positions are added to array
;
; Parameters:
;      stOrig : original string we are searching through
;      stStringToFind : find this string in original
;      arPos : output parameter containing each position string is found at

; Return Values:
;      return false if no matches found, return true if at least one found
;      output parameter arPos is array of match positions
;
; Test
;    #1 stOrig not blank
;    #2 stToFind not blank
;    #3 stToFind must exist at least once
;
; Version: 1.00  2/01/2005  Submitted R Wiltshire
;
;  Note : Continual use of substr/searchEx has performance issues with large strings


var
 liSizeOrig,liSizeFind,liPosFound longint
 liPos,liStartPos,liEndPos longint
endvar

; empty array first
arPos.empty()

; initial sizes
liSizeOrig = stOrig.sizeEx()
liSizeFind = stToFind.sizeEx()

if liSizeOrig = 0 or   ;Test#1
   liSizeFind = 0      ;Test#2
  then
     return(false)
  endif

;Test#3  doest stToFind exist ?
liPosFound = stOrig.searchEx(stToFind)
if liPosFound = 0 then
   return(false)
  endif

; save position of first substring that was found
arPos.addLast(liPosFound)

; calc starting and end points for remaining searches
liPos = liPosFound + liSizeFind
liEndPos   = liSizeOrig - liSizeFind + 1

; step through orginal string and find other matches

while liPos <= liEndPos

  ; possibly more efficient algorithm in future version

      if stOrig.substr(liPos,liSizeFind) = stToFind
         then
               arPos.addLast(liPos)
               liPos = liPos + liSizeFind
         else
               liPos = liPos + 1
         endif

endwhile

return(true)

endMethod
 searchAll_array B # method cfChopSt ( stMyString            String ) String
      ;remove the last character from a string

      if stMyString.sizeex ( ) = 1 then
           return ( "" )
      else
           return ( cmSubstrST ( stMystring , 1 , stMystring.sizeex ( ) - 1 ) )
      endIf
EndMethod
 cfChopSt C z method cmSubStrST ( stMystring          String ; string to operate on
                   , liStartIndex       LongInt ;position in string to start
                   , liNumofChars       LongInt ;how many to get
                ;if liNumofChars is > string size
                ;OR < 1 then will return to end of string
                   ) String
      ;same as substring except you don't get an error
      ;if numchars > string size  or listartIndex too large
      ;Returns to end of string is liNumofChars < 1 or > string size
      ;if liStartIndex < 1  or > string size then returns ""
      var
           strt                         String
      endVar
      stRt = "error"
      if liStartIndex > stMystring.sizeex ( ) or stMyString = "" or liStartIndex < 1 then
           stRt = ""
      else
           if liNumofChars + liStartIndex > ( stMyString.sizeex ( ) + 1 )
                   OR liNumofChars < 1 then
                liNumofChars = stMystring.sizeex ( ) - liStartIndex + 1
           endIf
           strt = stMystring.substr ( liStartIndex , liNumofChars )
      endIf
      return stRt
EndMethod
 cmSubStrST D method CollapseToggle()    logical
   var
           loanswer                       logical
            mysettings dynarlo
            lihold longint
            stIndent string
            mytc tcursor
            siShow smallint

             memo1 memo
     params dynArAtType
     lireccolor longint
      endVar
try
     Settings ( mySettings , true )
     SetMouseShape ( Mousewait , true )
     DelayScreenUpdates(yes)
     ErrorTraponwarnings ( yes )
      mytc.open(dmgetproperty(TraceOutputdm'tablename,"FullName")  )
     mytc.edit()
       dmget("TraceOutputdm","ID",liHold)
     mytc.qlocate(lihold)
     stIndent = mytc."LineFilter"
     if mytc."CollapseType" = 5 then
        mytc."CollapseType" = 6
        sishow = 0
     else
         mytc."CollapseType" = 5
         sishow = 1
     endif
     ;format line correctly
       if not cfFormatLine(mytc,memo1,lireccolor,params) then
           fail(USerError+1,"")
        endif
        mytc."Display" = memo1
        mytc."RecColor" = liRecColor
        mytc.Unlockrecord()



     mytc.nextRecord()

     mytc.edit()
     while (searchex(mytc."LineFilter",stIndent) = 1 )
           if mytc."LineFilter" = stIndent then
               quitloop
           endif
                 mytc."LoShow" =siShow
                 mytc.unlockrecord()
           
            mytc.NextRecord()
     endwhile

     mytc.endEdit()

    cmSynctc(mytc)
      try
         mytc.qlocate(lihold)
      onfail
            errorclear()
      endtry

      dmresync( "TraceOutputdm",mytc)

  loAnswer = true
onFail
     errorshow ( )
     loAnswer = false
endTry
Settings ( mySettings , false )
SetMouseShape(MouseArrow,false)
DelayScreenUpdates(No)
return (loanswer )

endMethod
 CollapseToggle E j method RefreshFormat() logical
var
   mytc tcursor
    memo1 memo
     params dynArAtType
     lireccolor longint
     loanswer logical
endvar
try
  mytc.open(dmgetproperty(TraceOutputdm'tablename,"FullName")  )

   mytc.edit()
  scan mytc :
       if not cfFormatLine(mytc,memo1,lireccolor,params) then
           fail(USerError+1,"")
        endif
        mytc."Display" = memo1
        mytc."RecColor" = liRecColor
        mytc.Unlockrecord()
  endscan
  mytc.EndEdit()
  mytc.close()
  loAnswer = True
onfail
      errorshow()
      loAnswer = false
endtry
return loanswer

endMethod
 RefreshFormat ~ method keyPhysical(var eventInfo KeyEvent)

if eventInfo.isPreFilter() then
;// This code executes for each object on the form

else
;// This code executes only for the form
   switch
       case EventInfo.iscontrolkeydown() and eventinfo.vchar() = "F"   :
          findfld.moveto()
          eventinfo.setErrorCode(userError)
 endswitch
endIf

endMethod
 keyPhysical - F Ó proc  cpResizeX( ui uiobject, sizept point, pospt point ) logical
var
   loAnswer logical
   pt point
   contui uiobject
endvar
try

   contui.attach( ui.container )
   if NOT pospt.isblank() then
      pt = ui.position
       ui.position = point( pospt.x(), pt.y() )
   endif
   if NOT sizept.isblank() then
      pt = ui.size
      ui.size = point ( sizept.x() , pt.y() )
   endif
   loanswer = true

onfail
      errorshow()
      loanswer = false
endtry
return loAnswer

endproc


proc  cpResizeY( ui uiobject, sizept point, pospt point ) logical
var
   loAnswer logical
   pt point
   contui uiobject
endvar
try
   pt = ui.position
   contui.attach( ui.container )
   ui.position = point( pt.x(), pospt.y() )
   pt = ui.size
   ui.size = point ( pt.x(), sizept.y() )
   loanswer = true

onfail
      errorshow()
      loanswer = false
endtry
return loAnswer

endproc


proc cpFitX( maxX longint, ContainerUI uiObject ) longint
     return maxX - ContainerUI.leftborder - ContainerUI.rightBorder
endproc

proc cpFitY( maxY longint, ui uiObject ) longint
     return maxY - ui.topborder - ui.bottomBorder
endproc


method FormResize() logical
var
  mysettings dynarlo
      loAnswer   logical
      pageui
      ,ui
      ,formui    uiobject
      px,py,pw,pl longint
      pageSizept , OrigpageSizept
      ,formSizept
     , uiSizept
     ,sizept  point
     loBiggerY
     ,loBiggerX  logical
      x,y,w,l longint

      SizeAr  dynarray[] point
      PosAr   dynarray[] point
      UIar  array[] uiObject  ; order of containership

      li1, lix,liy   longint
      stname  ,stNB    string

      fui        UIObject
   TFar Array[] String

endvar
try
   Settings(mySettings,true)
  errortraponwarnings(yes)
   delayScreenUpdates(yes)
   setMouseShape(MouseWait,true)
  pageui.attach(fome.first)

  fome.getPosition(x,y,w,l)

  if w < 8760 then
     w = 8760
  endif
  if l < 6570 then
     l = 6570
  endif
   fome.setPosition(x,y,w,l)
  UIar.grow(2)
   Uiar[1].attach(fome)
   Uiar[2].attach( fome.first)

  formSizept = fome.size
  OrigpageSizept = pageui.size

  loBiggerX =  (OrigpageSizept.x() < FormSizept.x())
  loBiggerY =  (OrigpageSizept.y() < FormSizept.y())

 Sizear[ pageui.fullname ]  .setx( formsizept.x())
 Sizear[ pageui.fullname ]  .sety( formsizept.y() )



  ;move these objects to the bottom  and change length  in x
  uiar.grow(1)
  li1 = uiar.size()
  uiar[ li1 ] .attach( findfld.container )
  stname = uiar[li1].fullname
  sizear[stname]= uiar[li1].size
  sizear[stname ]. setx( cpFitx(  Sizear[ pageui.fullname ] .x(),pageui )  )
  posar[stname ] = uiar[li1].position
  posar[stname ].sety (Sizear[ pageui.fullname ].y() - pageui.bottomborder - sizear[stname].y()  )











 uiar.grow(1)    ;notebook
 li1 = uiar.size()
 ui.attach(traceOutputdm.container)
 uiar[ li1 ].attach(ui.container)  ; should be the notebook
 stname = uiar[li1].fullname
 stNB = stname
 posar[stname ] = uiar[li1].position ;keep posti
 sizear[stname]= uiar[li1].size
 sizear[stname].setx( cpFitx(  Sizear[ pageui.fullname ] .x(),pageui )  )
 sizear[stname] .sety(Sizear[ pageui.fullname ].y() -  sizear[uiar[li1-1].fullname].y() - 15 -posar[stname].y()  )  ;place just above bottom bar


  uiar.grow(1) ;display fld in trace tf
li1 = uiar.size()
uiar[li1].attach(TraceOutputdm.display)
stname = uiar[li1].fullname
sizear[stname]= uiar[li1].size
posar[stname ] = uiar[li1].position
lix=  (sizear[stNB].x() - posar[stname].x() - uiar[li1-1].rightborder - 100) * 3

traceoutputdm.currentcolumn = 1
traceoutputdm.columnwidth =  lix +30
 sizear[stname].setx( lix )


 uiar.grow(1)    ;tracetableframe
 li1 = uiar.size()
 uiar[li1].attach(traceOutputDM)
 stname = uiar[li1].fullname
 sizear[stname]= uiar[li1].size
 posar[stname ] = uiar[li1].position
 sizear[stname].setx( sizear[stNB].x() - posar[stname].x() - uiar[li1-2].rightborder - 100 )
 sizear[stname].sety( sizear[stNB].y() - posar[stname].y() - uiar[li1-2].bottomborder -100 )


uiar.grow(1) ; options tableframe
li1 = uiar.size()
uiar[li1].attach(OptionsDM)
stname = uiar[li1].fullname
sizear[stname]= uiar[li1].size
posar[stname ] = uiar[li1].position
sizear[stname].sety( sizear[stNB].y() - posar[stname].y() - uiar[li1-3].bottomborder -100 )

uiar.grow(1) ;help box
li1 = uiar.size()
uiar[li1].attach(helpbox)
stname = uiar[li1].fullname
sizear[stname]= uiar[li1].size
posar[stname ] = uiar[li1].position
lix = sizear[stNB].x() - posar[stname].x() - uiar[li1-4].rightborder - 100
if lix> 5580 then
   lix = 5580
endif
liy = sizear[stNB].y() - posar[stname].y() - uiar[li1-4].bottomborder -100
if liy > 6075 then
   liy = 6075
endif
sizear[stname] = point (lix,liy)


if  loBiggerX or loBiggerY then
    for li1 from 2 to UIar.size()
       message(uiar[li1].name )
        if NOT sizear.contains( uiar[li1].fullname ) then
           sizear[uiar[li1].fullname] = blank()
        endif
        if NOT posar.contains( uiar[li1].fullname ) then
           posar[uiar[li1].fullname] = blank()
        endif


        if loBiggerX then
             if NOT cpResizeX( uiar[ li1 ], sizear[ uiar[li1].fullname ] , posar[uiar[li1].fullname ] ) then
                fail(UserError+1,"")
             endif
        endif
        if loBiggerY then
          if NOT cpResizeY( uiar[ li1 ], sizear[ uiar[li1].fullname ] , posar[uiar[li1].fullname ] ) then
                fail(UserError+1,"")
             endif
        endif
    endfor
endif

if NOT loBiggerX or NOT loBiggerY then
      for li1 from UIar.size() to 2 step -1
           if NOT sizear.contains( uiar[li1].fullname ) then
           sizear[uiar[li1].fullname] = blank()
        endif
        if NOT posar.contains( uiar[li1].fullname ) then
           posar[uiar[li1].fullname] = blank()
        endif
        if NOT loBiggerX then
             if NOT cpResizeX( uiar[ li1 ], sizear[ uiar[li1].fullname ] , posar[uiar[li1].fullname ] ) then
                fail(UserError+1,"")
             endif
        endif
        if NOT loBiggerY then
          if NOT cpResizeY( uiar[ li1 ], sizear[ uiar[li1].fullname ] , posar[uiar[li1].fullname ] ) then
                fail(UserError+1,"")
             endif
        endif
    endfor

{
      TraceOutputDm.enumObjectNames( tfar )
   for li1 from 1 to tfar.size()
      fui.attach( tfar[li1] )
   if fui.Class = "Record"  then
          sizept =fui.size
          sizept .sety( 261 )
          fui.size =  sizept
   endif
   endfor
   }
endif

   loanswer = true
onfail
      errorshow()
      loAnswer = false
endtry
Settings(mySettings,false)

delayscreenUpdates(no)
setMouseShape(mousearrow,false)
return loAnswer


endMethod
 FormResize »
 var
   x,y,w,l longint
endvar
method menuAction(var eventInfo MenuEvent)

if eventInfo.isPreFilter() then
;// This code executes for each object on the form

else
;// This code executes only for the form

        switch
              case eventinfo.id() = MenuControlSize :

                   dodefault

                 
                    formResize()
                   
        endswitch
endIf

endMethod
 menuAction / C        ­&  O   ]  $'  N  h  ð   ð                         €€€        › þ           /  Ï
 Tracer Parse . 4 I:\manager\MANAGER.FT B #Formdata1 POST >
 ÿÿÿÿ     A :PRIV:__tracer.db                                                                                                                           RecColor                                  
 display                          
        PARADOX setx( lix )


 uiar.grow(1)    ;tracetableframe5 TraceOutputdm 8
 DBWINUS0 D     }   ‘   ,  € :PRIV:parseHilite.db                                                                                                                             2 MatchText                         ÿ           loAdvmatch                                 matchTextColor                             matchRecordColor                           loBold                                     loItalics                                 PARADOX name].sety( sizear[stNB].y() - posar[stname].y() -5 optionsDM 8 intl850 D Ý   #   U  ¯   ,  €    € ÿ €” ÿÿ   E           ¬&  N    €   ÿÿ   €        Ž&  0   E
         
 *     0   2   <            €  €        € ÿ €É ÿÿ H     &   ï  
   €,  ÿÿ
 method pushButton(var eventInfo Event)
var
stname string
endvar
tracerOff()
;stname = dmgetproperty(TraceOutputdm'tablename,"FullName")
stname= ":priv:__tracerdata.txt"
tracerSave(stname)
filefld.value = stname
sleep()
parse(stname)
sleep()

endMethod
 pushButton + €        ï  
  E "   Parse Tracer Contents
 º    0   2   <            €           € ÿ €œ
ÿÿ         •  Â    €   ÿÿ             •  Â   E
         
 ?    0   2   <            €   Ì       BM
      6   (           Ø              ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì         ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì       À       ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì       À  À  À       ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéì       À  À  À  À  À       ØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì          À  À  À  À  À  À  À          ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéì       À  À  À  À  À  À  À  À  À  À  À       ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì       À  À  À  À €  €  €   À  À €  €  €   À       ØéìØéìØéìØéìØéì   ØéìØéìØéìØéì       À  À €   À €   À  À  À €  €   À  À  À €   À       ØéìØéìØéìØéì   ØéìØéìØéìØéì    À  À €   À  À €  ÿÿÿÿÿÿ À €  €  ÿÿÿÿÿÿ À €   À  À    ØéìØéìØéìØéì   ØéìØéìØéìØéì         €        €   À ÿÿÿ À €  €   À ÿÿÿ   €           ØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì€  Øéì€  ™¨¬€  €  €  €  ™¨¬€  €  €  ™¨¬ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéì€  ™¨¬ À  À  À  À  À  À  À ™¨¬€  ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéì    À  À  À  À  À  À  À  À    ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéì             À  À  À          ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì                                                ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì    ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   Øéì€  Øéì ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿØéìØéì€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì    ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ€  €  €  €  €  ÿÿÿ ÿÿÿÿÿ ÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿØéìØéì€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì    ÿÿÿÿÿ ÿÿ         Øéì€  Øéì ÿÿÿÿÿ ÿÿ         ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ      ØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ      ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì               ØéìØéìØéìØéì               ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d ÿ €Ë filefld ‡  i   Ô
     €   ÿÿ   €        Æ
      E
         
 “P    0   2   <            €             +                  ÿÿÿÿd            Ì    € ÿ €Œ ÿÿ Ñ     ô  ð    €   ÿÿ     €        ô  ð   E
         
      0   2   <            € ÿÿÿ      
ÿ €á ÿÿ       w  ð    €   ÿÿ             w  ð   E
         
    0   2   <            € ÿÿÿÿ            
              File: w               €     €   ÿ €ò ÿÿ
    ‚  €   ¿  Y    €j   ÿÿ I
 method pushButton(var eventInfo Event)
parse(filefld.value)
endMethod
 pushButton +  €        ¿  Y   E
         
 :    0   2   <            €           €
ÿ €æ ÿÿ      ¥   4   u  ð    €   ÿÿ             u  ð   E
         
    0   2   <            € ÿÿÿÿ          
   
              Parse File u               €     €   ÿ €õ ÿÿ0  
    &   ï  
   €b   ÿÿ A
 method pushButton(var eventInfo Event)
TracerShow()
endMethod
 pushButton + €        ï  
 0 E   Show Tracer
 º    0   2   <            €           € ÿ €œ
ÿÿ)
          •  Â    €   ÿÿ             •  Â  ) E
         
 ?P    0   2   <            €   Ì       BM
      6   (           Ø              ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì€  €  €  ØéìØéì€  €  €  ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéì€  Øéì€  ØéìØéìØéì€  €  ØéìØéìØéì€  ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì€  ØéìØéì€  ÿÿÿÿÿÿØéì€  €  ÿÿÿÿÿÿØéì€  ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì€  ØéìØéì€  ØéìÿÿÿØéì€  €  ØéìÿÿÿØéì€  ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì€  Øéì€  ™¨¬€  €  €  €  ™¨¬€  €  €  ™¨¬ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéì€  ™¨¬ØéìØéìØéìØéìØéìØéìØé왨¬€  ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì                     ØéìØéì                     ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì    ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   Øéì€  Øéì ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿØéìØéì€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì    ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ€  €  €  €  €  ÿÿÿ ÿÿÿÿÿ ÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿØéìØéì€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì    ÿÿÿÿÿ ÿÿ         Øéì€  Øéì ÿÿÿÿÿ ÿÿ         ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ      ØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ      ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØé               ÿ ìØéì               ØéìØéìØéìØéì               ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d ÿ €• ÿÿ 1
      X  Ž&  p    €   ÿÿ  
 €        Ž&  p   E
         
 >    0   2   <    À       € :     h     € ÿ €£ ÿÿ  
         Ž&  p    €   ÿÿ   €        Ž&  p   E
         
 *    0   2   <    À       € ;                €  €    €
ÿ €â ÿÿ  
  P  S   :  Ã    €   ÿÿ             :  Ã     E
         
 
   0   2   <            € ÿÿÿÿ            
              Tracer :        €     €     €  
ÿ €6
TraceOutputdm
    –   ¤  ”%  h    €ˆ  ÿÿ €x ;****************************************************************************
;
;  Global constant declarations.
;
;  Written by Mark J. Pauker, MP Technologies, 70353...@compuserve.com
;
;****************************************************************************
const
   FIELD_NAME = "RecColor"
   HIGHLIGHT_COLOR = Gray
    unhilight_color = white
endConst
 Const   ;****************************************************************************
;
;  This method is responsible for initializing the global variables used by
;  the tableFrame.
;
;  Written by Mark J. Pauker, MP Technologies, 70353...@compuserve.com
;
;****************************************************************************
method open(var eventInfo Event)
var
 
endvar
; GLFinding = ""

    uiField.attach(FIELD_NAME)          ;Bind "relatively" to current field
   uiRecord.attach(uiField.container)  ;Bind "absolutely" to current record
    uiRecord'Color = white
   uirecord'Color = transparent
   liInitColor = uiRecord'color       ;Save record color before highlighted
   loEnabled = True                   ;Enable highlighting
   dodefault


endmethod
 open + €W ;****************************************************************************
;
;  Global variable declarations.
;
;  Written by Mark J. Pauker, MP Technologies, 70353...@compuserve.com
;
;****************************************************************************
var

;GLFinding   string
  ; GLMyTime    time

   uiField uiObject      ;Attached relatively to any named field in the record
   uiRecord uiObject     ;Attached absolutely to the "current" record object
   liInitColor longInt   ;Color of record upon startup (unhighlighted color)
   loEnabled logical

 
endVar
 Var

method canArrive(var eventInfo MoveEvent)
   ;Make sure that the movement was caused by a user's keystroke
   if eventInfo.reason() = UserMove and not self.wasLastClicked() then
      self.moveTo()
      eventInfo.setErrorCode(CanNotDepart)
   endIf
endmethod
 canArrive 2 < ;****************************************************************************
method close(var eventInfo Event)

   uiRecord'color = liInitColor

try
      self.dropGenFilter()
 onfail
       errorclear()
 endtry
 try
      self.setRange()
 onfail
       errorclear()
 endtry

 dodefault
endmethod
 close + H method keyPhysical(var eventInfo KeyEvent)

Var

 stHOld                    string
myui                    uiObject

EndVar

  { if not GLMyTime.isassigned() then
      GLMyTime = blank()
     ; GLFinding = ""
   endif
  }
  eventInfo.getTarget(myui)

   if not searchme(eventinfo) then
      ;message("Search failed","Did not find: "+GLFinding)

    ;  GLFinding = ""
   endif

 switch
       case EventInfo.iscontrolkeydown() and eventinfo.vchar() = "F"   :
          findfld.moveto()
          eventinfo.setErrorCode(userError)
 endswitch


endMethod
 keyPhysical - L ”
 method findAgain()
var
eventInfo KeyEvent
endvar
eventInfo.setChar("A")

eventInfo.setControlKeyDown(Yes)
  searchme(eventinfo)
endMethod
 findAgain }6i       Šu  i   E
         
     0   2   <            €   ÿÿÿ            
  r  Šu     € ÿ €‘ ÿÿ           ‰u  ‡    €   ÿÿ   €        ‰u  ‡   E
         
 *     0   2   <            €
  €€€    €
ÿ €ä ÿÿ i   K   Cq  á    €   ÿÿ             Cq  á   E
         
     0   2   <            € ÿÿÿÿ            
                 Trace Cq       ÿÿÿ     €     €  
ÿ €ä ÿÿ   r  K    â    €   ÿÿ              á   E
         
     0   2   <            € ÿÿÿÿ            
              RecColor       ÿÿÿ     €     €   ÿ €‘ ÿÿ   L     ‡  ‰u  ÿ    €ù  ÿÿ  
method action(var eventInfo ActionEvent)
  if eventInfo.actionClass() = DataAction then
      ;We only want to update the highlight once for a given action.  The
      ;problem is that an action such as DataNextRecord will be followed by
      ;DataArriveRecord, causing the highlight to be updated twice for the
      ;same action.  To remedy this, we turn highlighting off after the
      ;primary event stream is initiated, and back on when the stream has
      ;completed.  Because the DataArriveRecord action occurs further along
      ;in the same event stream, it will be ignored by this routine
      if loEnabled then
         errorTrapOnwarnings(no);!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ;gets rid of AT END of table error !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
         delayScreenUpdates(True)

     
         uiRecord'color = liInitColor    ;Remove old record's highlight
         loEnabled = False                  ;Disable highlighting
         doDefault                        ;May change current record
         loEnabled = True                ;Re-enable highlighting
         uiRecord.attach(uiField.container)
         uiRecord'color = HIGHLIGHT_COLOR   ;Highlight new record
         delayScreenUpdates(False)
      endIf
   
   endIf
endMethod
 action .   K method open(var eventInfo Event)
self.color= unhilight_color
endMethod
 open + V method keyPhysical(var eventInfo KeyEvent)
 passevent
   disabledefault
endMethod
 keyPhysical - €        ‰u  ÿ   E
         
 *     0   2   <            € j   ÀÀÀ    €         € ÿ €…  RecColor r        â    €¾   ÿÿ Ÿ method newValue(var eventInfo Event)
dodefault
if longint(self.value) > 0 then
display.color = self.value
else
display.color = white
endif
endMethod
 newValue +   €          á   l E
         
 “   0   2   <            €     ÿÿÿÿ     + €     € €     €ÿÿÿÿd            Ì    € ÿ €¡ display   i       Cq  â    €Û   ÿÿ X method keyPhysical(var eventInfo KeyEvent)
   passevent
   disabledefault
endMethod
 keyPhysical -
 K method mouseDouble(var eventInfo MouseEvent)
CollapseToggle()
endMethod
 mouseDouble ,   €        Dq  â   m E
         
 ’   0   2   <            €     ÿÿÿÿ     + €  €   €      ÿÿÿ d            Ì
    € ÿ €£ ÿÿ!  
        -   Ž&  p    €   ÿÿ   €        Ž&  p  ! E
         
 *    0   2   <    À       € ;   Ú          €  €    €
ÿ €ã ÿÿ" . ý  S   ”  Ã    €   ÿÿ             ”  Ã   " E
         
    0   2   <            € ÿÿÿÿ            
              Options ”        €     €     €  
ÿ €(
 optionsDM - ð   8  R  Ô    €z
  ÿÿ €y ;****************************************************************************
;
;  Global constant declarations.
;
;  Written by Mark J. Pauker, MP Technologies, 70353...@compuserve.com
;
;****************************************************************************
const
   FIELD_NAME = "matchtext"
   HIGHLIGHT_COLOR = Gray
    unhilight_color = white
endConst
 Const   ;****************************************************************************
;
;  This method is responsible for initializing the global variables used by
;  the tableFrame.
;
;  Written by Mark J. Pauker, MP Technologies, 70353...@compuserve.com
;
;****************************************************************************
method open(var eventInfo Event)

 GLFinding = ""

    uiField.attach(FIELD_NAME)          ;Bind "relatively" to current field
   uiRecord.attach(uiField.container)  ;Bind "absolutely" to current record
    uiRecord'Color = white
   uirecord'Color = transparent
   liInitColor = uiRecord'color       ;Save record color before highlighted
   loEnabled = True                   ;Enable highlighting
   dodefault

endmethod
 open + €T ;****************************************************************************
;
;  Global variable declarations.
;
;  Written by Mark J. Pauker, MP Technologies, 70353...@compuserve.com
;
;****************************************************************************
var

GLFinding   string
   GLMyTime    time

   uiField uiObject      ;Attached relatively to any named field in the record
   uiRecord uiObject     ;Attached absolutely to the "current" record object
   liInitColor longInt   ;Color of record upon startup (unhighlighted color)
   loEnabled logical

 
endVar
 Var

method canArrive(var eventInfo MoveEvent)
   ;Make sure that the movement was caused by a user's keystroke
   if eventInfo.reason() = UserMove and not self.wasLastClicked() then
      self.moveTo()
      eventInfo.setErrorCode(CanNotDepart)
   endIf
endmethod
 canArrive 2 < ;****************************************************************************
method close(var eventInfo Event)

   uiRecord'color = liInitColor

try
      self.dropGenFilter()
 onfail
       errorclear()
 endtry
 try
      self.setRange()
 onfail
       errorclear()
 endtry

 dodefault
endmethod
 close + ø  method action(var eventInfo ActionEvent)
switch
      case eventInfo.id() = DataUnlockRecord :
           self.action(DataPostRecord)
      case eventINfo.id() = DataPostRecord :
           refreshbtn.EnableChange(true)
endswitch
endMethod
 action . }6        S  Õ   E
         
     0   2   <            €   ÿÿÿ            
  {
   S     € ÿ €‘ ÿÿ           R  w    €   ÿÿ   €        R  w   E
         
 *     0   2   <            €
  €€€    €
ÿ €æ ÿÿ* i   K   ©  á    €   ÿÿ             ¨  á   * E
         
     0   2   <            € ÿÿÿÿ          
   
              Match Text ¨       ÿÿÿ     €     €  
ÿ €ä ÿÿ, {
  K   *  á    €   ÿÿ             *  á   , E
         
     0   2   <            € ÿÿÿÿ            
              Advmatch *       ÿÿÿ     €     €  
ÿ €â ÿÿ4    K   Ü  á    €   ÿÿ             Ü  á   4 E
         
     0   2   <            € ÿÿÿÿ            
              Hilite Ü       ÿÿÿ     €     €   ÿ € ÿÿ     L     w  R  •    €  ÿÿ
 method action(var eventInfo ActionEvent)
  if eventInfo.actionClass() = DataAction then
      ;We only want to update the highlight once for a given action.  The
      ;problem is that an action such as DataNextRecord will be followed by
      ;DataArriveRecord, causing the highlight to be updated twice for the
      ;same action.  To remedy this, we turn highlighting off after the
      ;primary event stream is initiated, and back on when the stream has
      ;completed.  Because the DataArriveRecord action occurs further along
      ;in the same event stream, it will be ignored by this routine
      if loEnabled then
         errorTrapOnwarnings(no);!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         ;gets rid of AT END of table error !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11
         delayScreenUpdates(True)
         uiRecord'color = liInitColor    ;Remove old record's highlight
         loEnabled = False                  ;Disable highlighting
         doDefault                        ;May change current record
         loEnabled = True                ;Re-enable highlighting
         uiRecord.attach(uiField.container)
         uiRecord'color = HIGHLIGHT_COLOR   ;Highlight new record
         delayScreenUpdates(False)
      endIf
   
   endIf
endMethod
 action .   K method open(var eventInfo Event)
self.color= unhilight_color
endMethod
 open + €        R  •    E
         
 *     0   2   <            € j   ÀÀÀ    €         € ÿ €Ô
 MatchText + i   -   ©  "    €   ÿÿ     €        Š  ÿ   + E
         
 “P   0   2   <            €             + €     € €      ÿÿÿÿd            Ì    € ÿ €ê loAdvmatch ! k  <   J      €   ÿÿ     €        K    - E "   Use Advanced Matching
 “P   0   2   <            €           + €     € €      ÿÿÿÿd            Ì    € ÿ €– ÿÿN        -      ÿ    €   ÿÿ     €        ÿ   á   N E
         
 ;   0   2   <            € 1 0      € ÿ €l matchTextColor " !     J  Y    €Ÿ   ÿÿ € method newValue(var eventInfo Event)
dodefault

self.color = iif(isblank(self.value),container.color,self.value)
endMethod
 newValue +   €        J  Y  / E
         
 ’   0   2   <            €             + €     € €          d            Ì    € ÿ €l matchRecordColor # ! "        J  h    €   ÿÿ ~ method newValue(var eventInfo Event)
dodefault
self.color = iif(isblank(self.value),container.color,self.value)
endMethod
 newValue +   €        J  h  1 E
         
 ’   0   2   <            €             + €     € €      ÿÿ  d            Ì    € ÿ €Ú
 loItalics & " # …  ,   ,  ,    €   ÿÿ   $ €          -   E   Italic
 “P   0   2   <            €   ÿÿÿÿ     +         €      ÿÿÿÿd            Ì    € ÿ €€ ÿÿe #   $  $          €ö   ÿÿ Õ
 method pushButton(var eventInfo Event)
 var
sihold smallint
endvar
dodefault
dmget("OptionsDM","loItalics",sihold)

dmput("OptionsDM","loItalics", iif(sihold=1,0,1) )
optionsDM.unlockRecord()
endMethod
 pushButton + % € òÿÿÿðÿÿÿ    e E
         
 : #   0   2   <            €   1 0 %    €
ÿ €Ý ÿÿd $   % % %     à   ð    €   ÿÿ             ¥    d E
         
  0$   0   2   <            € ÿÿÿÿ            
              I  ¥               €     €   ÿ €Ö loBold1 ) # &  ,   ;  ,    €   ÿÿ   ' €          -   E
    Bold
 “P   0   2   <            €   ÿÿÿÿ     +         €      ÿÿÿÿd            Ì    € ÿ €y ÿÿ &   '  '          €ï   ÿÿ Î
 method pushButton(var eventInfo Event)
var
sihold smallint
endvar
dodefault
dmget("OptionsDM","lobold",sihold)

dmput("OptionsDM","LoBold", iif(sihold=1,0,1) )
optionsDM.unlockRecord()
endMethod
 pushButton + ( € ñÿÿÿðÿÿÿ     E
         
 : &   0   2   <            €   1 0 (    €
ÿ €Ý ÿÿ# '   ( ( %     à   ð    €   ÿÿ             ´    # E
         
  0'   0   2   <            € ÿÿÿÿ            
              B  ¥               €     €   ÿ €† ÿÿ& + &  ) (  <        €í   ÿÿ Ì
 method pushButton(var eventInfo Event)
dodefault
if NOT matchTextColor.isedit() then
matchTextColor.action(DataBeginEdit)
endif
matchTextColor.value= cfPickcolor(matchTextColor.value)

endMethod
 pushButton + * €            & E   Select Font Color
 º    0   2   <            €           € ÿ €B ÿÿ )   *  *   -   á   Ã    €   ÿÿ             á   Ã   E   Set Font Color
 ?P    0   2   <            €   Ì       BM¦      6   (    
        p              ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   Øéì€  €  €  €  ØéìØéìØéì€  €  €  €  €  €  Øéì   ØéìØé쀀€€  ØéìØéìØéìØéìØé쀀€€  €  €€€ØéìØéì   ØéìØéìØéì€  €  ØéìØéìØéìØé쀀€€  €  ØéìØéìØéì   ØéìØéìØé쀀€€  ØéìØéìØéìØéì€  €  €€€ØéìØéìØéì   ØéìØéìØéìØéì€  €  €  €  €  €  €  ØéìØéìØéìØéì   ØéìØéìØéìØé쀀€€  ØéìØéì€  €  €€€ØéìØéìØéìØéì   ØéìØéìØéìØéìØéì€  €  Øéì€  €  ØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØé쀀€€  €  €  €€€ØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéì€  €  €  ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØé쀀€€  €€€ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì€  ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d ÿ €’ ÿÿ'   )  + Ì  -        €ó   ÿÿ Ò
 method pushButton(var eventInfo Event)
dodefault
if NOT matchRecordColor.isedit() then
matchRecordColor.action(DataBeginEdit)
endif
matchRecordColor.value= cfPickcolor(matchRecordColor.value)
endMethod
 pushButton + , €            ' E $     Select Background Color
 º    0   2   <            €           € ÿ €d ÿÿ$ +   ,  ,   -   á   Ò    €   ÿÿ             á   Ò   $ E
         
 ?P    0   2   <            €   Ì       BMÖ      6   (                          ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   €€€   ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéì   €€€€€€€€€   ØéìØéìØé쀀€ØéìØéì   ØéìØéìØéì   ÀÀÀÀÀÀÀÀÀ€€€€€€   ØéìØéì€  €€€Øéì   ØéìØéì   ÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀ€€€€€€   Øéì€  €  Øéì   Øéì   ÀÀÀÿÿÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀ€€€€€€€  €  €  Øéì   ØéìØéì   ÀÀÀÿÿÿÿÿÿÀÀÀ   ÀÀÀÀÀÀ€€€€  €  €  Øéì   ØéìØéìØéì   ÀÀÀÿÿÿ   €     ÀÀÀ€  €  €  €  Øéì   ØéìØéìØéìØéì   ÀÀÀÿÿÿ€  ÀÀÀ€€€€  €  €  ØéìØéì   ØéìØéìØéìØéì€     ÀÀÀ€  €€€   €€€ØéìØéìØéìØéì   ØéìØéìØéìØéì€  Øéì   €     €€€ØéìØéìØéìØéìØéì   ØéìØéìØéìØéì€  ØéìØéì€  €€€ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØé쀀€€  €  €€€ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d
ÿ €§ helpbox . - Ç  8  c  Ô    €   ÿÿ     +         _
  À  ( E
         
     0   2   <            € ÿÿ ÿ          -   Ÿ  
      $         HIlite Text
The values entered under "Match Text" will be hilited in the tracer output according to your selections.
Select Advmatch if you wish to use opal advanced matching characters. Otherwise matches perfomed as "..yourtext.."

Select how to hilite the matched text, bold, italic, font color or background color.

Press <F9> to begin editing.

The first match on a line determines the background color. À_
              €   €   €   €   €   €     €  
    €   ÿ €
 Timerbtn   - .  Â  þ      €5  ÿÿ   A method open(var eventInfo Event)
self.value = false
endMethod
 open + Œ method timer(var eventInfo TimerEvent)

tracerwrite("Elapsed Time: "+format("TO(%H:%M:%S)",time(CpuClockTime() - liTime)) )

endMethod
 timer 4 € Var
 liTime longint
endVar
 Var ° method newValue(var eventInfo Event)
   dodefault

 if self.value then
liTime = cpuClockTime()
self.setTimer( 2000, true)
else
self.killtimer()
endif

endMethod
 newValue + ; method changeValue(var eventInfo ValueEvent)

endMethod
 changeValue 0 / €        ÿ    . E "   Time Stamp Tracer Log
 “P    0   2   <            €             +                  ÿÿÿÿd            Ì    € ÿ €( ÿÿQ .   /  /     ï  
   €—  ÿÿ ¦
 method pushButton(var eventInfo Event)

{if self.value then
liTime = cpuClockTime()
self.setTimer( 2000, true)
else
self.killtimer()
endif   }
endMethod
 pushButton + :
 method mouseClick(var eventInfo MouseEvent)

endMethod
 mouseClick , m method mouseDown(var eventInfo MouseEvent)
 disabledefault
timerbtn.value = NOt timerbtn.value
endMethod
 mouseDown , 0 €        ï  
 Q E
         
 º .   0   2   <            €   True False      € ÿ €œ
ÿÿ% /   0  0     •  Â    €   ÿÿ             •  Â  % E
         
 ?P    0   2   <            €   Ì       BM
      6   (           Ø              ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì À  À  À  À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À  À  À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì À  À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿ À  À  À  À ØéìØéìØéìØéìØéì   ØéìØéìØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À ØéìØéìØéìØéì   ØéìØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿ À  À  À ØéìØéìØéì   ØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À ØéìØéìØéì   ØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À ØéìØéì   ØéìØéì À  À ÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À ØéìØéì   Øéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿ À  À  À Øéì   Øéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À Øéì   Øéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À Øéì   Øéì À  À  À ÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀ À  À  À Øéì   Øéì À  À  À ÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À Øéì   Øéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À Øéì   ØéìØéì À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿ   ÿÿÿÿÿÿÀÀÀ À  À  À ØéìØéì   ØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         ÿÿÿÿÿÿÿÿÿ À  À  À ØéìØéì   ØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿÿÿÀÀÀ À  À  À ØéìØéìØéì   ØéìØéìØéì À  À  À ÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿ            ÿÿÿÿÿÿ À  À  À ØéìØéìØéì   ØéìØéìØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿ À  À  À ØéìØéìØéìØéì   ØéìØéìØéìØéìØéì À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À ØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì À  À  À  À  À ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ À  À  À  À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d ÿ €ó ÿÿ
  3  1 d  &   ï  
   €`   ÿÿ ?
 method pushButton(var eventInfo Event)
tracerOn()
endMethod
 pushButton + 2 €        ï  
 
 E   Stop Tracer
 º    0   2   <            €           € ÿ €œ
ÿÿ
 1   2  2     •  Â    €   ÿÿ             •  Â  
 E
         
 ?P    0   2   <            €   Ì       BM
      6   (           Ø              ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì À  À  À  À  À  À €  €  €   À  À €  €  €   À  À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéì À  À  À  À €   À €   À  À  À €  €   À  À  À €   À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéì À  À  À €   À  À €  ÿÿÿÿÿÿ À €  €  ÿÿÿÿÿÿ À €   À  À ØéìØéìØéìØéìØéì   ØéìØéìØéì À  À  À  À €   À  À €   À ÿÿÿ À €  €   À ÿÿÿ À €   À  À  À ØéìØéìØéìØéì   ØéìØéìØéì À  À  À  À €   À €  ™¨¬€  €  €  €  ™¨¬€  €  €  ™¨¬ À  À  À ØéìØéìØéìØéì   ØéìØéì À  À  À  À  À  À €  ™¨¬ À  À  À  À  À  À  À ™¨¬€   À  À  À  À  À ØéìØéìØéì   ØéìØéì À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéì   ØéìØéì À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéì   ØéìØéì À  À  À                       À  À                       À  À  À ØéìØéìØéì   ØéìØéì À  À  À     ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ    À €   À  ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ    À  À  À ØéìØéìØéì   ØéìØéì À  À  À    ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ À  À €  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ    À  À  À ØéìØéìØéì   ØéìØéìØéì À  À     ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ€  €  €  €  €  ÿÿÿ ÿÿÿÿÿ ÿÿ    À  À ØéìØéìØéìØéì   ØéìØéìØéì À  À    ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ À  À €  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ    À  À ØéìØéìØéìØéì   ØéìØéìØéìØéì À     ÿÿÿÿÿ ÿÿ          À €   À  ÿÿÿÿÿ ÿÿ          À ØéìØéìØéìØéìØéì   ØéìØéìØéìØéì À    ÿÿÿ ÿÿÿÿÿ       À  À  À    ÿÿÿ ÿÿÿÿÿ       À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì                À  À  À  À                 À  À ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì À  À  À  À  À  À ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d ÿ €õ ÿÿ 5 1  3 ª  &   ï  
   €a   ÿÿ @
 method pushButton(var eventInfo Event)
tracerOff()
endMethod
 pushButton + 4 €        ï  
  E  
 Start Tracer
 º    0   2   <            €           € ÿ €œ
ÿÿ 3   4  4     •  Â    €   ÿÿ             •  Â   E
         
 ?P    0   2   <            €   Ì       BM
      6   (           Ø              ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìpmëpmëpmëpmëpmëpmëØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìpmëpmëpmëpmëpmëpmë€  €  €  pmëpmë€  €  €  pmëpmëØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìpmëpmëpmëpmë€  pmë€  pmëpmëpmë€  €  pmëpmëpmë€  pmëØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìpmëpmëpmë€  pmëpmë€  ÿÿÿÿÿÿpmë€  €  ÿÿÿÿÿÿpmë€  pmëpmëØéìØéìØéìØéìØéì   ØéìØéìØéìpmëpmëpmëpmë€  pmëpmë€  pmëÿÿÿpmë€  €  pmëÿÿÿpmë€  pmëpmëpmëØéìØéìØéìØéì   ØéìØéìØéìpmëpmëpmëpmë€  pmë€  ™¨¬€  €  €  €  ™¨¬€  €  €  ™¨¬pmëpmëpmëØéìØéìØéìØéì   ØéìØéìpmëpmëpmëpmëpmëpmë€  ™¨¬pmëpmëpmëpmëpmëpmëpm뙨¬€  pmëpmëpmëpmëpmëØéìØéìØéì   ØéìØéìpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëØéìØéìØéì   ØéìØéìpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëØéìØéìØéì   ØéìØéìpmëpmëpmë                     pmëpmë                     pmëpmëpmëØéìØéìØéì   ØéìØéìpmëpmëpmë    ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   pmë€  pmë ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   pmëpmëpmëØéìØéìØéì   ØéìØéìpmëpmëpmë   ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿpmëpmë€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ   pmëpmëpmëØéìØéìØéì   ØéìØéìØéìpmëpmë    ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ€  €  €  €  €  ÿÿÿ ÿÿÿÿÿ ÿÿ   pmëpmëØéìØéìØéìØéì   ØéìØéìØéìpmëpmë   ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿpmëpmë€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ   pmëpmëØéìØéìØéìØéì   ØéìØéìØéìØéìpmë    ÿÿÿÿÿ ÿÿ         pmë€  pmë ÿÿÿÿÿ ÿÿ         pmëØéìØéìØéìØéìØéì   ØéìØéìØéìØéìpmë   ÿÿÿ ÿÿÿÿÿ      pmëpmëpmë   ÿÿÿ ÿÿÿÿÿ      pmëØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì               pmëpmëpmëpmë               pmëpmëØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìpmëpmëpmëpmëpmëpmëpmëpmëpmëpmëØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìpmëpmëpmëpmëpmëpmëØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d ÿ €÷ ÿÿ 7 3  5 ð  &   ï  
   €c   ÿÿ B
 method pushButton(var eventInfo Event)
tracerClear()
endMethod
 pushButton + 6 €        ï  
  E  
 Clear Tracer
 º    0   2   <            €           € ÿ €œ
ÿÿ 5   6  6     •  Â    €   ÿÿ             •  Â   E
         
 ?    0   2   <            €   Ì       BM
      6   (           Ø              ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì            ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéì      ÿÿÿÿÿÿÿÿÿÿÿÿ      ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéì      ÿÿÿÿÿÿ€  €  €  ÿÿÿÿÿÿ€  €  €  ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéì   ÿÿÿ€  ÿÿÿ€  ÿÿÿÿÿÿÿÿÿ€  €  ÿÿÿÿÿÿÿÿÿ€  ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ€  ÿÿÿÿÿÿ€  ÿÿÿÿÿÿÿÿÿ€  €  ÿÿÿÿÿÿÿÿÿ€     ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéì   ÿÿÿÿÿÿ€  ÿÿÿÿÿÿ€  ÿÿÿÿÿÿÿÿÿ€  €  ÿÿÿÿÿÿÿÿÿ€     ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéì   ÿÿÿÿÿÿ€  ÿÿÿ€  ™¨¬€  €  €  €  ™¨¬€  €  €  ™¨¬ÿÿÿ   ØéìØéìØéìØéìØéì   ØéìØéìØéì   ÿÿÿÿÿÿÿÿÿÿÿÿ€  ™¨¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™¨¬€  ÿÿÿÿÿÿ   ØéìØéìØéìØéìØéì   ØéìØéìØéì   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ØéìØéìØéìØéì   ØéìØéìØéì   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ØéìØéìØéìØéì   ØéìØéìØéì   ÿÿÿ                     ÿÿÿÿÿÿ                     ÿÿÿ   ØéìØéìØéìØéì   ØéìØéìØéì   ÿÿÿ    ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   ÿÿÿ€  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ   ÿÿÿ   ØéìØéìØéìØéì   ØéìØéìØéì   ÿÿÿ   ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ      ØéìØéìØéìØéìØéì   ØéìØéìØéìØéì       ÿÿÿÿÿ ÿÿÿÿÿ ÿÿ€  €  €  €  €  ÿÿÿ ÿÿÿÿÿ ÿÿ      ØéìØéìØéìØéìØéì   ØéìØéìØéìØéì      ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ€  €  ÿÿÿ ÿÿÿÿÿ ÿÿÿÿÿ   ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì    ÿÿÿÿÿ ÿÿ         ÿÿÿ€  ÿÿÿ ÿÿÿÿÿ ÿÿ         ØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì   ÿÿÿ ÿÿÿÿÿ      ÿÿÿÿÿÿÿÿÿ   ÿÿÿ ÿÿÿÿÿ      ØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéì               ÿÿÿÿÿÿÿÿÿÿÿÿ               ØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéì      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì                  ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   ØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéìØéì   d ÿ € ÿÿ H 5 L 7   È  Ž&  w    €   ÿÿ   8 €        p&  Y   E
         
 :    0   2   <            € ÿÿÿÿ          
ÿ €C
msgfld 7 9 ? 8 H  <   [      €n   ÿÿ   C method open(var eventInfo Event)
   liMaxStatusGL = 0
endMethod
 open + I $ method cmStatusInc(lisetting longint) logical

var
   statui    uiobject
    mysettings dynarlo
      loAn               ¤0swer

      logical
     pt point
     nuPercent number
     liSize longint
endvar

try
Settings(mySettings,true)
  errortraponwarnings(yes)
  if NOT cmStatusSetup(0,"") then
  fail(USerError+1,"")
  endif

  ;change box to correct size percent
  statui.attach("statbox")
  statui.visible = true
  pt = msgfld.size
 ; liMaxStatusGL
  nuPercent = number(liSetting) / number(liMaxStatusGL)
  liSize = longint(pt.x() * nuPercent)
  if liSize> pt.x() then
  liSize = pt.x()
  endif
   statui.size = point( lisize,  pt.y())


  loanswer= true
onfail
errorshow()
   loanswer = false
endtry
  Settings(mySettings,false)

 return loAnswer
endMethod

 cmStatusInc J Ó method cmStatusReset()
var
statui uiobject
endvar
 try
    statui.attach("statbox")
      statui.delete()
   onfail
    errorclear()

   endtry
   msgfld.value = ""
   liMaxStatusGL = 0
endMethod
 cmStatusReset K P method cmStatusSetup(liMaxSize longint,stMsg string)   logical

var
   statui, msgui,pageui uiobject
    mysettings dynarlo
      loAnswer
      ,locreate
      logical
      pt
      ,ptpos point

endvar

try
Settings(mySettings,true)
  errortraponwarnings(yes)
   try
    statui.attach("statbox")
      locreate = false
   onfail
    errorclear()
      locreate= true
   endtry

   if locreate then
    pt = msgfld.size      ; pt.y()-40
      ptpos = msgfld.position
      pageui.attach(msgfld.container)
    statui.create ( BoxTool , ptpos.x(), ptpos.y() ,0 ,pt.y(), pageui )
    statui.visible = false
    statui.color = blue
    statui.translucent = true
    try
    statui.frame.style = noFrame
    onfail
    errorclear()
    endtry
    statui.name = "StatBox"


         if liMaxSize < 1 then
            liMaxSize = 100
         endif
         liMaxStatusGL = liMaxSize


    msgfld.value = stmsg
     endif
  loanswer= true
onfail
errorshow()
   loanswer = false
endtry
  Settings(mySettings,false)

 return loAnswer
endMethod
 cmStatusSetup €& Var
  liMaxStatusGL longint
endVar

Jostein Bakke

unread,
Jan 8, 2026, 2:23:54 AMJan 8
to TheDBCommunity
I have thought about what you wrote. Good point!
I have worked a lot with text during the years, and not had much problems. However I remember once (this was some decades ago) that I had a memo-field where the text lost connection with the records it was supposed to be connected with.  This was in a multi-user environment.  I cannot remember having had problems when working by myself on my stand-alone PC.
To be safe I now made a routine that writes the content of the memo-field (from all the records) into a single TXT-file, and separates the text with identifiers, so that I (if bad things happen) can write the content back to the correct record.
(And, yes, I take copies of the table every now and then...  😄  )
Jostein
Reply all
Reply to author
Forward
0 new messages