VFP信息的浏览之焦点行的动态显示
在用VFP设计应用系统时,浏览信息是最重要的功能之一。人们通常使用网格对象来显示数据信息,但这种对象在功能上存在一些缺点。
提问
当用户在记录之间移动焦点时,只有一个具有焦点的记录字段以不同于网格背景的颜色显示。为了以相同的颜色突出显示整个记录(本例为蓝色背景),即当数据记录移动时,通过改变颜色来动态显示记录相对于光标的位置,可以在Grid对象的afterRowColChange事件中添加以下内容:
this.setall("dynamicbackcolor "," iif(this.activerow=recno(),rgb(0,0,255),rgb(255,255,255))," column ").
在使用中发现,如果设置了环境上的Set delete参数,在逻辑删除记录时,动态背景的颜色显示会混乱。
问题分析
这种情况一般有两种解决方法:
●执行pack命令,然后重新创建并设置网格的各种属性;
●首先将没有删除标记的记录复制到一个临时表中,用zap命令删除源表中的所有记录,然后将临时表中没有删除标记的记录添加到源表中。
本质上,这两种方法都是真正从数据表中删除逻辑删除的记录。缺点是这两种方法都要求表必须以独占方式打开。
如果表是共享的,我们该怎么办?实际上,动态背景色不能正确显示的原因是记录被逻辑删除,导致光标所在的activerow()与数据的记录号recno()不同,从而导致动态背景色的显示混乱。作者通过关联这两个表成功地解决了这个问题。
解决问题
我们将用一个实际的例子来说明如何解决这个问题。有一个表cenji.dbf,它的字段是:学号、姓名、姓氏、年级。创建一个新窗体,创建一个Grid对象,并将Grid对象的recordsource属性设置为cenji。在Grid对象的afterRowColChange事件过程中添加以下代码:
l参数ncollindex
if this . active row = recno()
this . setall(" Dynamic back color "," iif
(this.activerow=recno(),rgb(0,0,255),rgb(255,255,255))," column")
else
从cenji where中选择学号。setall("动态背景色"," iif(this。
active row = recno(' temp _ table ')、rgb(0,0,255)、rgb(255,255,255))、" " column ")
endif
this form . refresh
在上面的代码中,当一条记录的逻辑删除导致游标的activerow()不等于该数据的记录号recno()时,只需要为该数据建立一个关联的子表。当记录指针在父表cenji中移动时,子表temp_table的记录指针移动到具有相同学号的记录。子表的记录号不包含逻辑删除记录,保证了光标所在行的子表记录号recno ('temp _ table ')等于光标所在行的activerow(),从而可以正确显示该行的动态背景色。为了方便解释,子表是在afterRowColChange事件的过程中建立的,但实际上是在Delete命令之后建立的。
另外,当使用activerow属性配合recno()函数动态显示背景色时,一般会提示用户“请不要在显示的记录中设置主索引”,否则无法正确动态显示。其实按照上面的方法,这个问题也可以解决。
在cenji.dbf表中,根据成绩字段建立主索引。在Grid对象的afterRowColChange事件中编写以下代码:
l参数ncollindex
select学号从cenji到游标temp _ table order by grade desc
Select _ table
对学号标记xh的索引
set relation to学号到temp _ table in cenji
thisset all("动态背景色"、" IIF
(this . active row = recno(' temp _ table ')、rgb(0,0,255)、rgb(255,255,255))、" column")
thisform.refresh
同样,在Grid对象的afterRowColChange事件期间,也不需要建立关联的子表temp_table。
这段代码运行在中文Windows 98和Visual Foxpro 6.0中。
位律师回复
0条评论