为VFP5的编辑控件定义右键弹出式菜单

Author: 陈启运 Date: 2000年 第19期

  在VFP5的TextBox、EditBox、ComboBox控件的文本输入区中输入的文本可能需要进行有选择地复制、粘贴、剪切、删除等操作,若开发的应用程序没有实现这些操作功能的菜单,将无法对输入的文本进行上述操作(除程序设计软件定义的编辑功能键外)。如何实现这些操作呢?
  一种方法是,设计能进行这些操作功能的菜单,但使用中要选择菜单,鼠标移动距离大,操作显得繁琐。
  另一种方法是,设计一个右键弹出式菜单,这样使用起来较为简便。本文介绍的就是这一种方法。
  可通过编写这些控件的RightClick事件代码(在事件代码中定义右键弹出式菜单),实现文本复制、粘贴、剪切、删除等操作。
  为简化RightClick事件代码,可将菜单代码作为一个独立的程序文件或自定义函数保存。下面就是RightClick事件代码和菜单程序代码。
  1.RightClick事件代码:
  st=this.seltext
  va=this.value
  do rightmenu with st,va
  上述代码中,seltext属性返回在控件的文本输入区中所选择的文本内容,或返回一个空串(如果没有选择文本)。
  value属性指在控件的文本输入区中所输入的文本内容。
  2.Rightmenu.prg为程序文件(即菜单代码),其代码如下:
  para st,va   && 参数st为选定的文本内容,参数va为输入的所有文本内容
  define popup popright shortcut relative from mrow(),mcol()  && 定义弹出式菜单,菜单名popright
  define bar _med_copy of popright prompt ″复制(\<C)″ skip for empty(st) && 定义菜单项
  define bar _med_paste of popright prompt ″粘贴(\<P)″ skip for !empty(st)
  define bar 3 of popright prompt ″\-″ && 菜单项分隔线
  define bar _med_cut of popright prompt ″剪切(\<T)″ skip for empty(st)
  define bar _med_clear of popright prompt ″删除(\<A)″ skip for empty(st)
  define bar 6 of popright prompt ″\-″
  define bar _med_slcta of popright prompt ″全选(\<L)″ skip for empty(va)
  define bar _med_undo of popright prompt ″撤消(\<U)″
  activate popup popright && 激活菜单
  编写好上述代码后,设计一个表单,在表单上放置Text1、Edit1和Combo1三个控件,如上所述编辑它们的RightClick事件代码后,保存该表单。
  在保存上述表单的文件目录(路径)中,建立上述菜单程序文件rightmenu.prg(在命令窗口中用modi comm命令建立)。
  运行表单,在TextBox、EditBox、ComboBox的文本输入区中输入文本,在输入区内任意位置单击鼠标右键,则在鼠标所在位置出现一个弹出式菜单,该菜单具有上述程序定义的菜单项,而菜单选项是否可选,遵循下列规律:
  ①选择文本内容后,“复制”、“剪切”、“删除”菜单项可选,“粘贴”菜单项不可选;
  ②没有选择文本内容时,“复制”、“剪切”、“删除”菜单项不可选,“粘贴”菜单项可选;
  ③文本输入区没有输入文本时,“全选”菜单项不可选,输入文本后,“全选”菜单项可选。
  ④对ComboBox控件,因value属性只读,“全选”菜单项不可选;对EditBox控件,“撤消”菜单项不起作用。
  上述代码和程序在VFP5.0中运行通过,有兴趣的编程爱好者可试一试。