ccidnet????

出版日期:1997-10-27 总期号:681 本年期号:41

本期导读
综合要闻
网络通信
市场商情
国际文摘
技术专题
软件应用
建立浮动文本框

孙勇

  网格控件是vb标准版和专业版中都有的一个定制控件。它提供类似于电子表格的输入、输出界面,在实际编程中经常运用。其主要缺点是:用户不能直接编辑网格中各单元的内容,这给实际运用造成了阻碍。但有两个简单的解决方法:①使用网格的keypress事件;②使用文本框与网格的联合(即本报1997年第27期《直接编辑vb网格控件项的方法》所介绍的两种方法:直接法和间接法)。这两种方法都有其优缺点。综合来讲,使用第二种方法(即文本框与网格联合)编程量小且易控制。那么怎样解决其影响屏幕布局、含义不清的缺点呢?答案是:建立浮动的文本框。

  建立浮动文本框的工作原理是:用户修改一个单元时,把文本框(无边框)直接放到网格单元上,并使文本框可见。这个文本框与网格单元有相同的尺寸和形状,结果用户就像是直接编辑网格单元一样,但编辑实际是在文本框中进行的。这种方法的实现主要由两部分组成:显示文本框和识别用户编辑的意愿。以下是其编程实例:

  1.显示文本框

  在确定文本框的大小及显示位置时,必须考虑单元列的宽度、分隔线的粗度以及网格自身的上边沿和左边沿。

  subshowtextbox()

  dimxasinteger,yasinteger

  dimcasinteger

  ′隐藏文本框

  text1.visibleΚfalse

  ′设置文本框的高度、宽度

  text1.heightΚgrid1.rowheight(grid1.row)-(screen.twipsperpixely 2)

  text1.widthΚgrid1.colwidth(grid1.col)-(screen.twipsperpixelx 2)

  ′计算显示位置的x轴

  xΚgrid1.left+grid1.colwidth(0)+(screen.twipsperpixelx 2)

  forcΚgrid1.leftcoltogrid1.col-1

  xΚx+grid1.colwidth(c)+screen.twipsperpixelx

  nextc

  ′计算显示位置的y轴

  yΚgrid1.top+grid1.rowheight(0)+(screen.twipsperpixely 2)

  forcΚgrid1.toprowtogrid1.row-1

  yΚy+grid1.rowheight(c)+screen.twipsperpixely

  nextc

  ′显示文本框

  text1.leftΚx

  text1.topΚy

  text1.zorder

  text1.visibleΚtrue

  text1.setfocus

  endsub

  2.识别单元编辑的意愿

  ①编辑的开始

  当发生以下任一情况时,单元编辑开始:———用户双击一个单元

  ———用户按回车键

  ———用户开始输入字母或数字

  ′网格的keypress事件

  subgrid1-keypress(keyasciiasinteger)

  dimcharasstring

  ifkeyasciiΚ13then′回车键

  text1.selstartΚlen(text1.text)

  showtextbox

  else

  charΚchr$(keyascii)′其他键

  text1.textΚchar

  text1.selstartΚ1

  showtextbox

  endif

  endsub

  ′网格的dbclick事件

  subgrid1-dbclick()

  ifgrid1.rowΛ0andgrid1.colΛ0thengrid1-keypress13

  endsub

  ②编辑的结束

  当发生以下任一情况时,单元编辑结束:

  ———用户按回车键或esc键

  ———用户使用箭头从单元移开

  ———用户单击另一个单元

  ′文本框的keypress事件

  subtext1-keypress(keyasciiasinteger)

  selectcasekeyascii

  case13′回车键

  grid1.textΚtext1.text

  text1.visibleΚfalse

  grid1.setfocus

  case27′esc键

  keyasciiΚ0

  text1.visibleΚfalse

  grid1.setfocus

  endselect

  endsub

  ′文本框的keydown事件

  subtext1-keydown(keycodeasinteger,shiftasinteger)

  selectcasekeycode

  case38′up

  text1-keypress13

  sendkeys″{up}″

  case40′down

  text1-keypress13

  sendkeys″{down}″

  endselect

  endsub

  ′网格的mousedown事件

  subgrid1-mousedown(buttonasinteger,shiftasinteger,xassingle,yassingle)

  text1.visibleΚfalse

  endsub

  3.文本框的内容

  始终保持文本框的内容为最新的方法是使用网格的rowcolchange事件。当当前网格单元改变时,该事件过程把当前网格的内容装入文本框的text特性。

  subgrid1-rowcolchange()

  text1.textΚgrid1.text

  endsub

  前面实例在实际运用时可能有所不同,本文只是给读者提供利用浮动文本框编辑网格单元内容的基本思路。