function vkeybox(r1,c1,lst,msg)
local klst i m t cp ch[20,6] n r2 c2 k dc
'-----------------------------------------------------------------
'r1       = passed start row for box      / together:
'c1       = passed start column for box   \ upper left corner
'lst      = passed string group of hot key position|selection item
'msg      = message passed as string
'klst     = a constructed hot key list
'i        = counter
'm        = maximum string length
't        = target string in lst
'cp       = passed hot key position for target string
'ch[]     = array used for display of box contents
'ch[i,1]  = target string (selection item)
'ch[i,2]  = "           " display row
'ch[i,3]  = "           " display column
'ch[i,4]  = "           " hot key
'ch[i,5]  = "           " hot key display row
'ch[i,6]  = "           " hot key display column
'n        = number of target strings (selection items) & rows
'r2       = calculated end row for box      / together:
'c2       = calculated end column for box   \ lower right corner
'dc       = delta c1,c2
'k        = key pressed
'-----------------------------------------------------------------
  ptstr = NULL
  klst=NULL
  i = 1
  m = 0
  while true
    t = group(lst,i)
    if exact(t,NULL) = TRUE
      exit while
    end if
    cp = value(t)
    t = mid(t,len(str(cp))+1)
    ch[i,1] = t
    ch[i,2] = r1+i
    ch[i,3] = c1+2
    ch[i,4] = mid(t,cp,1)
    ch[i,5] = ch[i,2]
    ch[i,6] = ch[i,3]+cp-1
    if cp > len(t)
      ptstr = "vkeybox():"&str(chr(34))|mid(group(lst,i),2)|str(chr(34))|", is not"& str(cp) & "characters in length"
      return (-2)
    elseif cp = 0
      ptstr = "vkeybox(): no hot key defined for"&str(chr(34))|group(lst,i)|str(chr(34))|", item#"& str(i)
      return (-3)
    end if
    if lower(klst) ! lower(ch[i,4])
      ptstr = "HOT Key duplication:"&"vkeybox("|str(chr(34))|ch[i,1]&ch[match(lower(klst),lower(ch[i,4])),1]|str(chr(34))|")  for ->"&str(chr(34))|ch[i,4]|str(chr(34))
      return (-4)
    else
      klst = klst|ch[i,4]
    end if
    if len(t) > m
      m=len(t)
    end if
    i=i+1
  end while
  n = i-1
  r2 = r1+n+1
  c2 = c1+m+3
  dc = c2-c1
  if r2 > scrheight or c2 > scrwidth
    ptstr = "vkeybox():"&str(r1)&str(c1)&str(r2)&str(c2)&"outside of screen dimensions!"
    return (-5)
  end if
  screen save r1 c1 r2+1 c2 psa
  screen clear box r1 c1 r2 c2 fgp bgp
  for i = 1 to n step 1
    screen print ch[i,2] ch[i,3] fgp bgp ch[i,1]
    screen print ch[i,5] ch[i,6] fgi bgi ch[i,4]
  end for
  if msg > null
    screen print r2+1 c1 fgi bgi str(format(left(msg,dc+1),"M"|str(dc+1)))
  end if
  screen save r1 c1 r2+1 c2 dsa
  k = NULL
  while lower(klst) !! lower(k)
    key name inchar k
    if k = "Esc"
      k = NULL
      exit while
    end if
  end while
  screen shortrestore psa
  if k = NULL
    return (-1)
  else
    ptstr = lower(k)
    return (0)
  end if
end function
