Database 版 (精华区)

发信人: sleep (allfn(ss,″″,10) &&停止播放), 信区: Database
标  题: VFP 技巧五
发信站: 哈工大紫丁香 (2000年12月04日15:02:57 星期一), 站内信件

    
首页 您瑞在的位置 编程技巧(五) 


FOXPRO设计技巧篇(五)   
序号 内容
 
1 如何以随机数产生一个唯一的名称来作为临时文件的名称? 
2 Visual Foxpro中实现电话拨号 
3 在FOXPRO(2.5/2.6)下解决2000年问题的具体方法 
4 对于原来用FOXPRO FOR DOS编写的系统,应如何解决千年虫问题?
 
5 FOXPRO2.5B的2000年问题综述 
6 VFP3.0的2000年问题综述 
7 VFP5.0的2000年问题综述 
8 如何在VFP应用程序中设计提供使用者直接关机的界面?
 
9 给FoxPro增加一个判断内存变量存在的函数 
10 Foxpro处理多媒体数据三例 
11 用FoxPro转换网上文本格式 
12 一组Visual Foxpro 使用技巧 
13 VFP中EXCEL格式的输入方法 
14 Visual FoxPro报表事件的应用 
15 在VFP中退出Windows的方法 

1、如何以随机数产生一个唯一的名称来作为临时文件的名称?

由于在应用系统中经经常因为某些需要而必须建立各种不同的临时文件,然而如果
应用系统于网络环境中执行,这些临时文件都将建立在服务器上,此时如果临时文
件可以有固定的名称,就可以避免彼此冲突。使用SYS(3)函数可完成此项功能,
请看下例:

CLOSE ALL

CLEA ALL

TEMP1=SYS(3)

CREA TABLE(TEMP1);

CNO C (5),NAME C(5),ADDRESS C(20)

USE

ERASE (TEMP1)+“.DBF”

当然,您的临时文件应尽量建立在工作站电脑的硬盘中,这样一来,就不必担心因
文件名称重复而发生彼此相冲突的情况。

2、Visual FoxPro中实现电话拨号

     对于有调制解调器的用户来说,大多使用过Windows 95提供的‘电话拨号程
序’,使用起来也确实非常的方便。但是,如何在我们的Visual FoxPro 5.0应用
程序中进行电话拨号呢?还好微软为我们提供了一个非常有用的控件--‘
Microsoft Communication Control’,使用它,我们可以迅速的制作出一个通用
的电话拨号程序。以下是本程序的编写方法:

进入Visual FoxPro 5.0中,建立一个新的表单(Form1)。设置表单的Caption属
性为‘电话拨号程序’,Windowtype属性为1-模式。 
建立‘Microsoft Communication Control’控件(Olecontrol1)。在‘表单控件
’工具条上选择‘查看类’,在下拉菜单中选择‘ActiveX控件’,然后在‘表单
控件’上选择‘Microsoft Communication Control’(若无此控件可查看系统菜
单的‘工具’的‘选项’中的‘控件’选项卡),在表单上点击一下即可。 
建立两个按钮。在‘表单控件’工具条上选择‘命令按钮’并在表单体上点击一下
即可生成一个命令按钮(Command1),设置它的Caption属性为‘拨号’。依此方
法再制作出‘退出’按钮(Command2)。 
建立文本输入框。在‘表单控件’工具条上选择‘文本框’并在表单体上点击一下
即可生成一个文本输入框(Text1),设置它的InputMask属性为‘
9999999999999999’。 
建立两个标签。在‘表单控件’工具条上选择‘标签’并在表单体上点击一下即可
生成一个标签(Label1),设置它的Caption属性为‘电话号码:’,Autosize属
性为 .T.。同样方法制作Label2,设置它的Caption属性为‘联接中……’,
Autosize属性为.T.,Fontbold属性为.T.,Fontsize属性为22,Forecolor属性为
蓝色(RGB(0,0,255)),Visible属性为.F.。 
编写相应控件的执行过程。在系统菜单的‘表单’中选择‘新方法程序’,在名称
栏中输入“Dial”,按‘关闭’按钮退出。以下是程序代码: 
    Form1的Dial过程:
    Parameter Number
    DialString = "ATDT" + Number + ";" + Chr(13)
    * 设置通讯端口号
    Thisform.Olecontrol1.CommPort = 2
    * 设置波特率,奇偶校验,数据位和停止位参数
    Thisform.Olecontrol1.Settings = "9600,N,8,1"
    Err = 0
    On Error Err = Messagebox("无法打开通讯端口,请重新设置!",0    + 
16,"错误信息")
    * 打开通讯端口
    Thisform.Olecontrol1.PortOpen = .T.
    If Err = 1
        Return
    Endif
    On Error
    Thisform.Olecontrol1.InBufferCount = 0
    Thisform.Olecontrol1.Output = DialString
    FromModem = ""
    StartTime = DATETIME()
    Do While .T.
        * 检测联接是否超时
        If DATETIME() - StartTime >= 10
            = MessageBox("不能进行联接,请检查设置是否正确!",0 + 64,"提
示信息")
            Thisform.Mousepointer = 0
            Thisform.Label2.Visible = .F.
            Exit
        Endif
        Thisform.Mousepointer = 11
        Thisform.Label2.Visible = .t.
        If Thisform.Olecontrol1.InBufferCount > 0 Then
            FromModem = FromModem + Thisform.Olecontrol1.Input
            If at("OK",FromModem) > 0 Then
                = MessageBox ("请先拿起话筒然后再按下‘确认’按钮!",0 +
 64,"提示信息")
                Thisform.Mousepointer = 0
                Thisform.Label2.Visible = .F.
                Exit
            EndIf
        EndIf
    Enddo
    * 断开联接
    Thisform.Olecontrol1.Output = "ATH" + Chr(13)
    * 关闭通讯端口
    Thisform.Olecontrol1.PortOpen = .F.

    Form1的Activate过程:
    Set Escape Off
    Thisform.Olecontrol1.InputLen = 0

    Command1的Click过程:
    If Empty(Thisform.Text1.Value)
        = Messagebox("电话号码不可为空!",0 + 16,"提示信息")
        Return
    Endif
    Thisform.Dial(Alltrim(Thisform.Text1.Value))

    Command2的Click过程:
    Thisform.Release

    以上程序默认调制解调器使用的是Com2通讯口,可根据实际情况进行调整。

 

 

3、在FOXPRO(2.5/2.6)下解决2000年问题的具体方法
1、将日期字段全部定义为字符字段,长度为0;
2、若要使用中国日期格式,可在程序开关加一句:SET DATE ANSI
3、输入日期数值时,年份一律用4位数,如:1999.12.31,2000.01.01。
4、运算时,把CTOD()函数写入表达式,即先把该字型字段转换为日期型再进行

运算,如:DA1=‘1999,12,31’DA2=‘2000,01,01’
          年份值:YEAR(CTOD(DA1))=1999,YEAR(CTOD(DA2))=2000
          CTOD(DA2)-CTOD(DA1)=1(天)
  结果正确,至此,完满地解决了2000年问题。
  而如果仍把DA1、DA2定义为日期型字段,则长度自动固定为8,如:
  DA1=CTOD('99.12.31')
  DA2=CTOD('00.01.01')
年份值:YEAR(DA1)=99,YEAR=(DA2)=00
DA2-DA1=-36523(天)
结果出错!
 

 

4、对于原来用FOXPRO FOR DOS编写的系统,应如何解决千年虫问题?

         首先,硬件问题一定要先处理好,并在系统中可参考这个方法: SET 
CENTURY TO 19 ROLLOVER 60 OR SET CENTURY TO 20。

        对于VFP5.0来说,可使用这个命令:SET CENT ON,就可解决2000年的问
题了,比较简单。

 

 

5、Microsoft FoxPro 2.5b

产品:Microsoft FoxPro 版本:2.5b 相容:是,但有些小问题 
语言:英语(美)支持双字节 数据适用范围
 发布日期:
 
前提条件: 
产品适用系统:Windows 3.1, 3.11,DOS 
适用时钟:系统时钟 

本产品如何处理日期:
表、变量和计算中的日期当作数值型变量处理,代表从某个固定日期开始的天数。


二位数的日期总是被认为是二十世纪日期。因此,建议您使用四位数日期。

二位数的快捷方式处理:
即使使用 Set Century On 命令并输入某一年的二位数快捷方式,产品也通常认为
日期是在二十世纪范围内。使用 Set Century Off 命令,所有输入的日期均被认
为是二十世纪日期。

产品问题:

使用 Set Century On
该产品特性使得所有版本的FoxPro和Visual FoxPro在数据录入和显示时使用四位
数的日期。缺省设置是 Set Century Off。在 Off 的设置状态下,使用四位数日
期几乎是不可能的。而且,二位数的日期通常被认为是一九几几年。

不要使用LUPDATE()
如果在计算机中使用Set Century On,而且该计算机的系统日期被设置为 2000 年
,同时又对表(.dbf) 文件的结构进行了修改或者对文件进行了拷贝,那么 
LUPDATE() 函数会错误的把世纪显示为 1900。这种错误的显示通常是因为上一次
更新的日期是以二位数的形式存储在 .dbf 的文件头中。

正确使用日期常量
{mm/d/yy} 格式的日期常量是有效的。二位数的年份通常被解释是 19yy。在 5.
0 及以后的版本中,Set Century To…Rollover 命令可根据指定的世纪和滚动的
年份解释这些的二位数常量。为保险起见,一般请指定四位数年份。

此外,日期常量没有固定的字段顺序。虽然这并不一定会造成与 2000 年相关的错
误,但是在 Set Date 的不同值(这些值由 Set Date 指定为区域数据格式)下对
这些常量赋值或编译时却会产生数据错误。在 FoxPro 5.0 中引入了语法 
{^yyyy/mm/dd},这样插入符号(^)可把常量强制转换成 YMD 次序。

常见的日期语法错误: 

使用了 Set Century Off。 
用 CTOD 和 CTOT 设置二位数年份的日期。 
在日期常量中使用二位数年份 
测试指南和建议: 

使用 Set Century On 设置,修改已有的应用程序。 
检查日期常量中二位数日期及所有使用 CTOD() 和 CTOT() 函数的情况。 

将上述信息提供给客户的唯一目的是协助客户制订向2000年过渡的计划。本文档包
含了目前可以得到的关于微软产品在下一个世纪的运行特点的所有信息,以上信息
是按照“现状”提供的,不附带任何形式的担保。微软公司声明提供上述信息不附
带任何明示担保也不包含默示担保,其中包括适销性的担保和产品适于特定用途的
担保。无论何种情况,微软公司或其供应商都不对损害承担赔偿责任,损害包括直
接的、间接的、偶然的、后果性的损害和商业损失、惩罚性的或特殊的损害赔偿,
即使微软公司或其供应商被事先告知损害发生的可能性。如果法律不允许排除或限
制后果性和偶然性损害赔偿责任,则上述限制性规定可能不适用。
 

 

 

6、Microsoft Visual FoxPro 3.0



产品名称:Microsoft Visual FoxPro 版本:3.0b 相容:相容,但有一些小问题
 
语言:中文 数据适用范围
从 3/1/0000 到 12/31/9999 发布日期:
1997年9月 
前提条件: 
产品适用系统:Windows 3.1, 3.11, Windows 95, Windows NT 3.51, Windows 
NT4 
适用时钟:系统时钟 

所有本产品如何处理日期:
表、变量和计算中的日期当作数值型变量处理,代表从某个固定日期开始的天数。
这些计算是与 2000 年相容的。
二位数的日期总是被认为是二十世纪日期。因此,建议您使用四位数日期。

二位数的快捷方式处理:
即使使用 Set Century On 命令并输入某一年的二位数快捷方式,产品也通常认为
日期是在二十世纪范围内。使用 Set Century Off 命令,所有输入的日期均被认
为是二十世纪日期。

产品问题:

使用 Set Century On
该产品特性使得所有版本的FoxPro和Visual FoxPro在数据录入和显示时使用四位
数的日期。缺省设置是 Set Century Off。在 Off 的设置状态下,使用四位数日
期几乎是不可能的。而且,二位数的日期通常被认为是一九几几年。

不要使用LUPDATE()。
如果在计算机中使用Set Century On,而且该计算机的系统日期被设置为 2000 年
,同时又对表(.dbf) 文件的结构进行了修改或者对文件进行了拷贝,那么 
LUPDATE() 函数会错误的把世纪显示为 1900。这种错误的显示通常是因为上一次
更新的日期是以二位数的形式存储在 .dbf 的文件头中。

正确使用日期常量
{mm/d/yy} 格式的日期常量是有效的。二位数的年份通常被解释是 19yy。在 5.
0 及以后的版本中,Set Century To…Rollover 命令可根据指定的世纪和滚动的
年份解释这些的二位数常量。如果需要很高的精确性,Microsoft 建议使用四位数
年份。

此外,日期常量没有固定的字段顺序。虽然这并不一定会造成 2000 年错误,但是
在 Set Date 的不同值(这些值由 Set Date 指定为区域日期格式)下对这些常量
赋值或编译时却会产生数据错误。在 FoxPro 5.0 中引入了语法 {^yyyy/mm/dd},
这样插入符号(^)可把常量强制转换成 YMD 次序。

常见的日期语法错误: 

使用了 Set Century Off。 
用 CTOD 和 CTOT 设置二位数年份的日期。 
在日期常量中使用二位数年份 
测试指南和建议: 

使用与 2000 年相容的设置例如 Set Century On,修改已有的应用程序。 
检查日期常量中二位数日期及所有使用 CTOD() 和 CTOT() 函数的情况。 
将上述信息提供给客户的唯一目的是协助客户制订向2000年过渡的计划。本文档包
含了目前可以得到的关于微软产品在下一个世纪的运行特点的所有信息,以上信息
是按照“现状”提供的,不附带任何形式的担保。微软公司声明提供上述信息不附
带任何明示担保也不包含默示担保,其中包括适销性的担保和产品适于特定用途的
担保。无论何种情况,微软公司或其供应商都不对损害承担赔偿责任,损害包括直
接的、间接的、偶然的、后果性的损害和商业损失、惩罚性的或特殊的损害赔偿,
即使微软公司或其供应商被事先告知损害发生的可能性。如果法律不允许排除或限
制后果性和偶然性损害赔偿责任,则上述限制性规定可能不适用。

 

 

 

7、Visual FoxPro 5.0



产品名称:Microsoft Visual FoxPro 版本:5.0a 相容:相容 
语言:中文 数据适用范围
从 3/1/0000 到 12/31/9999 发布日期:
1997年9月 
前提条件:SET CENTURY ON | TO 
产品适用系统:Windows 3.1, 3.11 Windows 95,Windows NT 4.0 SP3, Windows 
NT 3.51 SP3 
适用时钟:系统时钟 

本产品如何处理日期:
表、变量和计算中的日期当作数值型变量处理,代表从某个固定日期开始的天数。


在 Visual FoxPro 5.0a 中,正确处理日期要求开发人员在 Set Century To 命令
中设置正确的世纪值。

二位数的快捷方式处理:
在 Visual FoxPro 5.0 中,2 位数的日期处理由Set Century To…Rollover 命令
的设定值决定。默认值为 20 世纪。开发人员可以指定 2 位数日期的所属的世纪
。小于滚动值(rollover)的日期被当作下一世纪的日期,等于或大于滚动值(
rollover)的日期被认为指定的世纪的日期。

对相容性的建议:
使用 Set Century On
该产品特性使得所有版本的FoxPro和Visual FoxPro在数据录入和显示时使用四位
数的日期。缺省设置是 Set Century Off。在 Off 的设置状态下,使用四位数日
期几乎是不可能的。而且,二位数的日期通常被认为是一九几几年。

不要使用LUPDATE()。
如果在计算机中使用Set Century On,而且该计算机的系统日期被设置为 2000 年
,同时又对表(.dbf) 文件的结构进行了修改或者对文件进行了拷贝,那么 
LUPDATE() 函数会错误的把世纪显示为 1900。这种错误的显示通常是因为上一次
更新的日期是以二位数的形式存储在 .dbf 的文件头中。

正确使用日期常量
{mm/d/yy} 形式的日期变量仍然有效。在 FoxPro 2.6 和 3.0 中,2 位数的年份
总解释为 19yy。在 FoxPro 5.0 及以后的版本中,Set Century To…Rollover 命
令可根据指定的世纪和滚动的年份解释这些的二位数常量。推荐使用四位数年份。


此外,日期常量没有固定的字段顺序。虽然这并不一定会造成 2000 年错误,但是
在 Set Date 的不同值(这些值由 Set Date 指定为区域日期格式)下对这些常量
赋值或编译时却会产生数据错误。在 FoxPro 5.0 中引入了语法 {^yyyy/mm/dd},
这样插入符号(^)可把常量强制转换成 YMD 次序。

常见的日期语法错误: 

使用了 Set Century Off。 
用 CTOD 和 CTOT 设置二位数年份的日期。 
在日期常量中使用二位数年份 
改变Set Century To…Rollover的默认值。会将 2 位数的日期常量解释为不同的
世纪。为避免这一问题,尽量使用 4 位数的年份。 

检查指南和建议 

使用与 2000 年相容的设置例如 Set Century On,修改已有的应用程序。 
将TextBox.Century的值设为 1 从而强制 4 位数年份输入。 
检查日期常量中二位数日期及所有使用 CTOD() 和 CTOT() 函数的情况。 
将上述信息提供给客户的唯一目的是协助客户制订向2000年过渡的计划。本文档包
含了目前可以得到的关于微软产品在下一个世纪的运行特点的所有信息,以上信息
是按照“现状”提供的,不附带任何形式的担保。微软公司声明提供上述信息不附
带任何明示担保也不包含默示担保,其中包括适销性的担保和产品适于特定用途的
担保。无论何种情况,微软公司或其供应商都不对损害承担赔偿责任,损害包括直
接的、间接的、偶然的、后果性的损害和商业损失、惩罚性的或特殊的损害赔偿,
即使微软公司或其供应商被事先告知损害发生的可能性。如果法律不允许排除或限
制后果性和偶然性损害赔偿责任,则上述限制性规定可能不适用。

 

 

 

 

8、如何在VFP应用程序中设计提供使用者直接关机的界面?

若要在VFP应用程序中直接关闭计算机,就需要调用WIN32APE函数,利用WIN32API
中提供的ExitWindowsEx()函数,我们便可以在VFP中控制WINDOWS的关机动作,先
看看以下的界面:

 

 

 

 

 

 

 

 

这是否与WIN95提供的关机画面很相似呢?其提供的功能也是一样的,以下是建立
此界面的步骤:

建立基本界面

此界面需要的控件为:一个选项按钮组、一个图像控件、一个标签、两个按钮,这
里要注意的一点是:要想建立一个如图中的无控制框的界面,此表单的属性设置如
下:

Autocenter
 ..T
 
Borderstyle
 0---无边框
 
Closebale
 .f.
 
Maxbutton
 .f.
 
Minbutton
 .f.
 
Controlbox
 .f.
 

基本界面设计好后,就可以进行代码录入了,请在确定按钮的CLICK()事件中录
入:

#define EWX_LOGOFF 0

#define EWX_SHUTDOWN 1

#define EWX_REBOOT 2

#define EWX_FORCE 4

#define EWX_POWEROFF 8

DECLARE integer ExitWindowsEx IN USER32.DLL AS Shut_Down INTEGER , 
INTEGER

LOCAL nAnswer

DO CASE

CASE THISFORM.Optiongroup1.Value = 1 &&關閉這台電腦

=Shut_Down( EWX_SHUTDOWN + EWX_FORCE , 0 )

CASE THISFORM.Optiongroup1.Value = 2 &&重新啟動這台電腦

=Shut_Down( EWX_REBOOT + EWX_FORCE , 0 )

CASE THISFORM.Optiongroup1.Value = 3 &&關閉所有程式,登入成其他使用者

=Shut_Down( EWX_LOGOFF + EWX_FORCE, 0 )

ENDCASE

THISFORM.RELEASE

 

 

9、给FoxPro增加一个判断内存变量存在的函数
  笔者在开发应用系统中曾经用FoxPro的on error语句编写了一个判断内存变量
的函数Exist(),非常方便实用,在此介绍给大家。
  设计思路:先假设内存变量存在,然后将待判断的内存变量赋值给一个临时变
量,若该内存变量不存在,则执行时必将出错,出错时将执行on error语句,只要
在on error处理的函数中修改内存变量存在与否的标志即可。为了不影响调用程序
的错误处理,保证该函数的通用性,在函数执行前后必须保存和恢复调用程序可能
的错误处理。
  源程序如下:
  ***EXISTPRG***
  para MemoVari
  private Mexist,temp,OldError
  Mexist=.T.  &&假设内存变量存在
  OldError=on(′error′)  &&保存调用程序的错误处理
  on error do ErrHandle
  temp=&MemoVari
  on error &OldError  &&恢复调用程序的错误处理
  retu Mexist  &&返回存在标志
  proc ErrHandle
    Mexist=.F.  &&出错则置存在标准为.F.
  retu   (福建 吴庆裕)

本文出自:《电脑报》1998年3月30日第12期13版

 

10、Foxpro处理多媒体数据三例
   Foxpro for Windows为充分利用Windows提供的多媒体功能,增加了General字
段类型(即通用类型)。这种类型字段与备注类型字段基本相同,只是可对扫描图像
和数字化音响进行处理,可存储Windows环境下的Foxpro OLE对象。
  例1:如何给General字段(假定字段名为mmfield,下同)输入多媒体数据
  以处理图像文件为例,General字段可识别.BMP和.PCX两种格式的图像文件。

  在建立数据库结构后,用APPEND GENERAL命令给mmfield字段输入图像文件(设
图像文件名及路径为:c:\mm\face.bmp):
  APPEND GENERAL mmfield FROM c:\mm\face.bmp
  图像文件输入后,用鼠标双击某条记录的General字段(mmfield字段),可显示
该条记录中的图像信息。
  例2:如何在屏幕上显示图像
  用下列命令在屏幕的某一位置,将mmfield字段中保存的图像按比例尽量显示
于10×10的区域:
  @4,4 SAY mmfield ISOMETRIC SIZE 10×10
  例3:如何播放RECORDER程序产生的声音对象
  如果mmfield字段保存的是RECORDER程序产生的声音对象,可用下列命令播放
该声音:
  @0,0 SAY mmfield VERB ′PLAY′
  其中,动词′PLAY′由RECORDER提供,这些动词都存储在Microsoft Windows
的登记数据库REG.DAT中,可以利用REGEDIT.EXE来查看。(湖南 杨树国)

本文出自:《电脑报》1998年4月6日第13期13版

 

11、用FoxPro转换网上文本格式
   随着Internet的迅速发展,在网络上查询信息越来越为广大用户所接受。但
是,从网上截取下来的资料虽然可以满足用户的需求,但是它们的文本格式却并不
一定能适合用户的需要。例如,本人通过Internet从某图书馆下载的数据为纯文本
,其排列格式如下(dattxt):
  企业编号:00001
  企业名称:上海化工
  员工人数:5000
  主营产品:化工产品
  ……
  这种数据存储方式在网上较为常见。我现用FoxPro 25b for Windows编写了
一段程序,将上述的竖排式文本格式转换成FoxPro数据库的二维表形式,以方便操
作管理,即转换成如下表格式(datdbf):
  也就是将dattxt中的信息转换到datdbf数据库中去。当然,下载的数据必
须是规范化的,如左边的类别名称必须是统一的,如果有不同之处,需事先将它调
整好,且类别名称与右边的具体资料之间是用冒号分隔开的,每个企业的第一条信
息都应是该企业的编号。
  转换程序执行的过程中,首先将文本信息收入一临时数据库文件(lsdbf)
中,然后,对该数据库中每条信息进行判断,将冒号左边的查询名称,在字段名称
表数据库(zdmcbdbf)中对应找到datdbf中的字段名,将冒号右边的内容作为
要存储的信息保存到数据库datdbf相应的字段中去,而对于没有冒号的信息均作
为该企业的备注信息加以保存。
  字段名称表数据库zdmcbdbf的内容如下表,其中查询名称为dattxt中左边
栏的类别名称,字段名为datdbf中的字段名。
  临时数据库lsdbf只有一个字符型字段Line,其长度为200,以保证能放下较
长的信息。本程序是在Windows 95中用FoxPro编写并运行通过的。
  程序如下:
  SET TALK OFF
  SET SAFE OFF
  CLEAR ALL
  CLEAR
  SELE 1
  USE DAT
  SELE 2
  USE ZDMCB
  SELE 3
  USE LS
  ZAP
  APPE FROM DATTXT SDF
  SCAN FOR ′编号′|SLINE
  X=AT(′:′,LINE)
  BH=ALLTRIM(SUBS(LINE,X+1))
  SELE 1
  APPE BLAN
  REPL 编号 WITH BH
  SELE 3
  SKIP
  DO WHILE !′编号′|SLINEAND!EOF()
  X=AT(′:′,LINE)
  IF X>0
  Y1=ALLTRIM(SUBS(LINE,1,X-1))
  Y2=ALLTRIM(SUBS(LINE,X+1))
  SELE 2
  LOCA FOR 查询名称=Y1
  IF FOUND()
  XXX=ALLTRIM(字段名)
  SELE 1
  REPL (XXX) WITH Y2
  ENDIF
  ELSE
  Y2=ALLTRIM(LINE)
  SELE 1
  REPL 备注 WITH ALLTRIM(备注)+Y2
  ENDIF
  SELE 3
  SKIP
  ENDDO
  SKIP -1
  ENDSCAN
  CLEAR ALL   (浙江 苏 云)

本文出自:《电脑报》1998年5月18日第19期13版

 

12、一组Visual Foxpro 使用技巧
      1.给页框架(Pageframe)的标题加背景颜色
  一般给页框架的各个页面加背景颜色时,总是页框架的标题(头部)加不上去,
这时可将页框架Pageframe的Tabs特性改为·F·,然后将各个Page分别加入所需背
景颜色,再把Tabs特性改为·T· 即可。
  2.显示符合条件的记录数
  在进行查询或记录筛选时,要返回符合条件的记录数,可用下面代码:
  Public aa0 &&.定义变量
  Count to aa0 &&.符合条件的记录数赋给变量
  Thisform.Text1.Value=aao &&.在文本框中显示出记录数
  3.网格(Grid)的使用
  〈1〉在网格中交替显示颜色
  记录号有序排列时,可以在网格的列中交替显示白色和灰色的记录,代码如下

  thisform.Grid1.SetAll("DynamicBackColor","IIF(MOD(RECNO(),2)=0,
RGB(255,255,255),RGB(192,192,192))","Column",&&交替显示白色和绿色的记录

  〈2〉符合条件的记录显示颜色
进行查询时,想在网格中动态地显示符合条件的记录的颜色,可以充分利用
DynamicBackColor和DynamicForeColor特性。下例将符合条件的记录的字体变为红
色Thisform.Grid1.Column1.DynamicForeColor="IIf(Database.
Category_ID='A02',RGB(225,0,0),RGB(0,0,124))"
  4.将自定义的对象加入到窗体上
  〈1〉先建立所需的类。
  〈2〉登记类库。在Options对话框的Classes单中加入类库或在View Classes
中加入类库。以在Form Designer中登记类库为例,其方法为:在工具栏中,选择
Vies Classes按钮;从子选单中,选Add;在Open对话框中,选一类库加入到
Controls工具栏并选Open;重复以上过程,直到加入完所要登记的库。此时类库就
可显示到控件工具栏。
  〈3〉将对象从类库中加入到窗体
  一旦加入了类库,就可在Form Designer中访问它们。其方法如下:在
Control工具栏中,选择View Classes按钮;从登记为类库列表中,选择包含希望
加入到窗体中的控件的库,工具栏中包括所选库中的控件;点击希望的控件,并将
其拖到窗体中。
    5.组合框Combobox的使用
  〈1〉组合框内要显示多列,可改变ColumnCount特性,但此时若不设置列宽度
,将仅显示第一列。可以通过逗号分隔的清单列来指定列宽。如:用“10,50,
100”设置三列宽度。
  〈2〉要想让用户每次查找时输入一个字母,把IncrementalSearch特性设置为
True,运行时,当用户输入一个字母时,高亮条将移列表中第一个字母和输入字母
相匹配的第一条目上。
  〈3〉要将输入的内容加入到下拉列表中,可在组合框的Valid事件中加入
This.Additem(This.Displayvalue)代码。
  以上小技巧在Visual FoxPro 3.0和Visual Foxpro 5.0上均有效。(辽宁 李
宏明)

本文出自:《电脑报》1998年1月5日第1期12版

 

 

13、VFP中EXCEL格式的输入方法
  尽管VFP提供的表单设计器可以很容易完成数据输入界面的设计与修改,但在
通用的一些程序中,如果每用到一个表就设计或修改一次,工作量未免太大,对非
专业人员也有一定的困难。能不能只选定所需的表,其输入界面保持不变?
  笔者发现用VFP提供的表格控件GRID可以很容易地实现,并且能实现与EXCEL表
格相同的输入形式,输入的内容全部显示在屏幕上,下面将具体实现方法介绍给大
家:
  (1)从GRID控件拖放到表单上(假设名为grid1),设置其属性:
  Recordsourcetype为0---表
  (2)为表单的active过程编程
  pp=getfile(″dbf″,″″,″″,2)
  if empty(pp)
  thisform.release
  return
  endif
  use &pp
  *选定所需的表
  n=fcount()
  thisform.grid1.columncount=n
  thisform.grid1.recordsource=pp
  for i=1 to n
  thisform.grid1.columns(i).header1.caption=field(i)
  endfor
  use
  (3)再在表单加上插入、删除、添加、完成等几个按钮,就可构成较完善的输
入界面,实现数据的整体输入。
  此程序在586组装微机、VFP3.0中运行通过。(四川 牟善铸)

本文出自:《电脑报》1998年3月2日第8期12版

 

14、Visual FoxPro报表事件的应用


  在Visual FoxPro中有一类不太引人注意的事件——报表带区事件,在报表设
计器中每一带区都有两类事件,入口事件和出口事件。
  1使用方法
  进入报表设计器,双击报表带区分隔条,打开报表带区对话框,在“On 
Entry”输入触发进入带区事件的函数名,在“On Exit”输入触发离开带区事件的
函数名,注意这两个输入框,只能输入方法名或函数名,其他语句Visual FoxPro
会忽略。
  2举例说明
  例1:在每页报表的尾部常常要求打印某些信息,如制表人,制表时间,每页
小计等。用报表设计器非常容易做到,在页注脚带区设置相应的控件即可。问题是
在报表的最后一页,常常不会满页,这样最后打印的数据与页注脚之间存在一段空
白,很不美观,特别是数据使用了分隔线时更觉别扭。下面利用报表带区事件把最
后一页页注脚带区的内容移到细节带区之后。打开过程文件,新增下列函数:
  FUNCTION EndPrint()
  EndPrint=.T.
  EndFunction
  或建立ENDPRINT.PRG文件,内容为
  EndPrint=.T.
  打开报表设计器,设计好各带区,或打开已有的报表文件,当然页注脚带区应
有内容,否则,下面的做法毫无意义。全选页注脚带区各控件,复制到剪贴板,在
“Report”菜单下选“Title/Summary”菜单项,在出现的窗口中选“Summary 
band”后,单击“OK”。把剪贴板的内容粘贴到总结带区,调整好位置,这时用打
印预览可见最后一页数据后,紧接着输出页注脚,它们之间不存在空白,但页尾出
现重复数据,退出预览,新增报表变量EndPrint,初始值为.F.,报表输出后释放
。双击总结带区分隔条,在“Summary”对话框的“On Exit”中键入EndPrint(),
退出后,分别双击注脚带区各控件,在弹出的对话框中单击“Print When”后,在
“Print Only When Expression is True”中输入EndPrint=.F.,单击“OK”即可

  例2:Visual FoxPro报表设计器的数据分组功能非常强大和灵活,但分组的数
量(组数)无法直接得到,例如以客户名分组数据,各客户的相关项数和合计金额
以及全部客户的总计金额都容易得到,但客户的数量却无法直接统计。下面利用报
表带区事件统计分组组数。打开过程文件,新增下列函数:
  FUNCTION GroCount()
  GroCount=GroCount+1
  EndFunction
  或建立GROCOUNT.PRG文件,内容为
  GroCount=GroCount+1
  打开报表设计器,设计好各带区,或打开已有的报表文件。新增报表变量
GroCount,初始值为0,报表输出后释放。双击注脚带区分隔条,在弹出的对话框
的“On Exit”中键入GroCount(),退出对话框,在“Report”菜单下选“
Title/Summary”项,在打开的对话框中选“Summary band”复选框,单击“OK”
。在总结带区添加客户数标签控件和字段控件,输入字段控件表达式为GroCount,
调整好大小和位置即可。(广东 李伟明)

本文出自:《电脑报》1998年3月23日第11期12版

 

15、在VFP中退出Windows的方法
   在一些Visual FoxPro for windows(以下简称VFP)的程序中经常要涉及到直接
退出Windows窗口的问题,但是由于VFP的函数库中没有提供此函数,所以就必须自
己设计一个程序来实现这个功能。
  以下程序就是直接退出Windows的一种简便方法,其原理是利用VFP中提供的动
态连接函数库Foxtools.fll中的Regfn()及Callfn()函数去访问Windows的User.
exe函数库中的exitwindows()函数。
  程序清单如下:
  #exit windows
  local lnmesrs
  lnmesrs=messagebox(′do you really want to quit windows?′,4+16+
256,′exit windows′)
  if lnmesrs=6 #按YES按钮执行
  set library to sys(2004)+″foxtools.fll″ additive #将Foxtools.
fll装入内存
  exitwin=regfn(′exitwindows′,T,T, ′user.exe′) #注册User.
exe(Windows95中用User32.exe)库中Exitwindows()函数
  e=callfn(exitwin,0) #执行Exitwindows()函数
  endif
  此程序已在Visual Foxpro 30 for windows32/windows95下运行通过。 (广
东 詹 灵)

本文出自:《电脑报》1998年4月27日第16期13版

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:211.684毫秒