vfp 技巧与实例

上传人:206****923 文档编号:41640078 上传时间:2018-05-30 格式:DOC 页数:34 大小:127.50KB
返回 下载 相关 举报
vfp 技巧与实例_第1页
第1页 / 共34页
vfp 技巧与实例_第2页
第2页 / 共34页
vfp 技巧与实例_第3页
第3页 / 共34页
vfp 技巧与实例_第4页
第4页 / 共34页
vfp 技巧与实例_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《vfp 技巧与实例》由会员分享,可在线阅读,更多相关《vfp 技巧与实例(34页珍藏版)》请在金锄头文库上搜索。

1、http:/www.eemap.org/ge/eemap2ge.zip动态改变动态改变 GIRD 表格的底色表格的底色 在表单中添加一自定义属性 rec在表格的 init 中这样写this.SetAll(“dynamicforecolor“,“IIF(recno()=thisform.rec, RGB(255,0,0), RGB(0,0,0)“, “Column“)在表格的 afterrowcolchange 中写LPARAMETERS nColIndexthisform.rec = recno()thisform.refresh假定你的表格上有一个按钮,原来的代码是skip你在添加两行,使它

2、成为这样skipthisform.rec = recno()thisform.refresh表格的三个疑难问题表格的三个疑难问题一、焦点的转移:解决 Grid 的刷新问题前言:你也许碰到过这样的问题:你想用一个 VCR 按钮来移动表的指针,比如上一个、下一个等等,却发现Grid 不刷新、老是停留在原来的位置;还有,你想在一个添加按钮的代码中把焦点移入表格的一列中,用 setfocus()方法却根本没有反应。这是怎么回事呢?更多的细节:关于 Gird 中的控件的焦点转移有点特殊性。给普通表单上的控件设置焦点我们可以用简单的代码实现,比如:thisform.textbox1.setfocus()t

3、hisform.refresh()但是 Grid 中的控件则不行,如果你使用以下的代码,什么都不会发生:thisform.grid1.column1.text1.setfocus()thisform.refresh()同时,你要从 Grid 中移出焦点到表单的控件上也一样,下面的代码同样没有反应:grid1.cloumn1.text1.lostfocus():mand1.setfocus()thisform.refresh()另外,当我们使用移动纪录按钮在表中移动时,并不会反映到 Grid 中,比如:sele dbfnamego bottomthisform.refresh()而 Grid 仍

4、然停在原来的记录上。这是怎么一回事呢?原来,对 Grid 中控件焦点的移入移出,必须通过 Grid 来转移!这一点在所有的教科书、程序员手册中都找不到,嘿嘿,是我自己摸索出来的。下面我们来解决上面的三个问题:1、从表单的命令按钮向 Grid 中的文本框设置焦点thisform.grid1.setfocus()thisform.grid1.column1.text1.setfocus()thisform.refresh()2、从 Grid 中的文本框中移出焦点grid1.column1.text1.lostfocus():thisform.grid1.setfocus()mand1.setfoc

5、us()thisform.refresh()3、当数据指针移动时刷新 Gridsele dbfnamego bottomthisform.grid1.setfocus()thisform.refresh()二、Vaild 事件有的朋友以为 Grid 没有 Vaild 事件,所以必须用 AfterRowCowChange()事件来代替。其实这种看法说明对面对对象编程原理的理解不够。我们知道,Grid 是一个容器控件,它是由一个容器和容器包含的多个 Column 控件组成;而 Column 控件也是一个容器控件,它是由一个容器和容器包含的 header、textbox 控件组成的。了解了这一点,我

6、们就可以知道 Grid 虽然没有 Vaild 事件,但是 Textbox 当然是有这个事件的啊。我们只要从属性窗口顶部的对象下拉列表框中选择表格中相应的列中的文本框控件,然后双击它的 Vaild 事件,输入相应的代码就可以了。三、Grid 什么都不显示在 Grid 的数据源变化的情况下(数据源为参数化视图的情况除外) ,刷新时会出现 Grid 上什么都没有、甚至连列/表格线都消失的情况,我不知道这算是 VFP 的一个特点还是一个 BUG。起初,我通过用代码方式重新生成表单的方法来解决,后来经人指点才发现,可以简单的用代码重新指定数据源的方法来解决,这个问题在 MSKB 里专门有一篇 HOWTO

7、。例如:Grid 的数据源为一个 SQL 语句生成的视图 MyView,Grid1 的数据源设置为 MyView,如果是查询字段不变的参数化视图,不会发生这种情况;但如果查询字段发生了变化,则必须在改变了 SQL 语句后用代码重新指定 Grid 的数据源,代码如下:MyView 视图的原来条件为:select * from 数据库名!表名 where 表名.字段一 = ?thisform.qryValueGrid1.RecordSourceType 为视图;Grid1.RecordSource=MyView现在,我根据用户的选择/输入生成新的视图:Create sql View MyView

8、as (select * from 数据库名!表名 where 表名.字段二 = ?thisform.qryValue)thisform.grid1.recordsource=MyView xoffsprn, yoffsprn, xscale, yscale, lcdocinfo, lcbinfo, lpbitsarray *- 得到打印机设备的坐标偏移量 hprndc = getdefaultprndc() lpbitsarray, lcbinfo, dib_rgb_colors) lcdocinfo = chr(20) + repli(chr(0), 19) xoffsprn + int(

9、xscale * pnwidth),; yoffsprn + int(yscale * pnheight),; 0,0, pnwidth, pnheight,; lpbitsarray, lcbinfo, dib_rgb_colors, srccopy) = endpage(hprndc) = enddoc(hprndc) endif *- 退出时释放系统资源 = globalfree(lpbitsarray) = deleteobject(hmembmp) = deletedc(hmemdc) = deletedc(hprndc) = releasedc(hwnd, hformdc) ret

10、urn procedure getwinrect (lnhwnd, lnwidth, lnheight) *- 返回指定句柄的窗口的宽和高 #define maxdword 4294967295 num2dword(lnflags) + repli(chr(0), 42) if printdlg (lcstruct) 0 return buf2dword (substr(lcstruct, 17,4) endif return 0 function initbitmapinfo(htargetdc) #define bi_rgb 0 #define rgbquad_size 4 num2dwo

11、rd(pnwidth) + num2dword(pnheight) +; num2word(1) + num2word(lnbitsperpixel) +; num2dword(bi_rgb) + repli(chr(0), 20) * creating a buffer for the color table if lnbitsperpixel 0 lnbytesperscan = lnbytesperscan + 4 - mod(lnbytesperscan, 4) endif lnallocsize = pnheight * lnbytesperscan lnptr = globalal

12、loc (gmem_fixed, lnallocsize) = zeromemory (lnptr, lnallocsize) return lnptr function num2word (lnvalue) return chr(mod(m.lnvalue,256) + chr(int(m.lnvalue/256) function num2dword (lnvalue) #define m0 256 #define m1 65536 #define m2 16777216 local b0, b1, b2, b3 b3 = int(lnvalue/m2) b2 = int(lnvalue

13、- b3*m2)/m1) b1 = int(lnvalue - b3*m2 - b2*m1)/m0) b0 = mod(lnvalue, m0) return chr(b0)+chr(b1)+chr(b2)+chr(b3) function buf2word (lcbuffer) return asc(substr(lcbuffer, 1,1) + ; asc(substr(lcbuffer, 2,1) * 256 function buf2dword (lcbuffer) return asc(substr(lcbuffer, 1,1) + ; asc(substr(lcbuffer, 2,

14、1) * 256 +; asc(substr(lcbuffer, 3,1) * 65536 +; asc(substr(lcbuffer, 4,1) * 16777216 procedure decl integer dest, integer numbytes declare integer createcompatiblebitmap in gdi32; integer hdc, integer nwidth, integer nheight declare integer bitblt in gdi32; integer hdestdc, integer x, integer y,; i

15、nteger nwidth, integer nheight, integer hsrcdc,; integer xsrc, integer ysrc, integer dwrop declare integer stretchdibits in gdi32; integer hdc, integer xdest, integer ydest,; integer ndestwidth, integer ndestheight, integer xsrc,; integer ysrc, integer nsrcwidth, integer nsrcheight,; integer lpbits,

16、 string lpbitsinfo,; integer iusage, integer dwrop declare integer getdibits in gdi32; integer hdc, integer hbmp, integer ustartscan,; integer cscanlines, integer lpvbits, string lpbi,; integer uusage return Height = 200 ADD OBJECT myCommand as COMMANDBUTTON WITH Top = 250,; Left = 20, Height = 30, Caption = “Change Grid“ PROCEDURE myCommand.Click This.Parent.myGrid.SetGrid() GO TOP ThisForm.ReFresh ENDPROC ENDDEFINEDEFINE CLASS myGrid AS G

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号