1、VFP中对API的调用格式是怎样的?
答:编程时,经常会用到WIN32API函数来对VFP的功能进行扩展,例如对注册表进行操作、获取系统信息等,但是由于WIN32API函数遵循的是C++的数据结构,在应用时与VFP的数据格式有所区别,因此在调用时容易产生问题,现将有关调用方式详解如下:
VFP中调用WIN32API的主要函数是:DECLARE - DLL
它是注册外部 Windows 32 位动态链接库 ( .DLL ) 中的一个函数。
语法:
DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName] [cParamType1 [@] ParamName1, cParamType2 [@] ParamName2, …]
参数:
cFunctionType 表明 32 位 Windows .DLL 函数是否有返回值。如果函数有返回值,则包含 cFunctionType ,否则省略 cFunctionType。
2、如何避免重复运行同一表单?
答:在编制管理系统时,往往一个相同的系统要由好几个部门使用,这样,在进入系统时,就要选择不同部门的名称。作为一个使用者,我们希望选择第一次,以后每次进入就不用再选择。以下方法将实现此功能。
新建一个表单,在上面创建一个“组合框”对象,对表单做如下设置:
init event:
set safety off
public z
if .not.file(′mv.mem′)
z=1
else
restore from mv additive
endif
thisform.combo1.additem("第一个单位")
…
thisform.combo1.additem("第二个单位")
thisform.combo1.listindex=z
destroy event:
z=thisform.combo1.listindex
save to mv all like z
3、请详细讲解一下Wait命令的应用。
答:Wait命令应用很方便,可是我们在VFP中使用时常常只是用到了它的部分功能,而忽略了 一些很有用的功能。 Wait
命令也有不少子句:
WAIT
[cMessageText]
[TO MemVarName]
[WINDOW [AT nRow, nColumn]]
[NOWAIT]
[CLEAR | NOCLEAR]
[TIMEOUT nSeconds]
比如我们的使用常常只是:
WAIT WIND '暂停…'
使'暂停…'这两个字停留在其默认窗口的右上角,其实完全可以用 [AT nRow, nColumn]来改
变其停留位置:
WAIT WIND '暂停…' AT 10,30
使'暂停…'停留在指定的第10行,第30列上。
WAIT WIND '暂停…' +CHR(13)+'另起一行…' AT 10,30
在提示信息中加上CHR(13),提示信息可分行显示。 而:
WAIT WIND '暂停10秒…' TIMEOUT 10
则可在无击键和鼠标移动的情况下只暂停10秒。
4、如何把数组作为参数传递给表单?
答:在FoxPro中,数组必须按址传递。SET UDFPARMS决定参数的传递方式。在默认情况下,当你用DO…WITH调用过程或表单时,参数是按址传递。在函数或方法中,参数是按值传递。
DIMENSION array[10]
DO FORM Form1 WITH array
在这种情况下,你必须用一个"@"符号强迫参数的传递为按址传递。
DIMENSION array[10]
MyForm = CREATEOBJECT("Form1", @myarray)
5、如何为应用程序添加背景音乐?
答:首先,调用Windows的APT函数SndPlaySound播放声音文件(.WAV)。
首先建立一个表单(FORM1),然后编写表单的 Activate过程:
PUBLIC Sound
SET LIBRARY TO Foxtool.FLL
Sound=Regfn("SndPlaySound","CI","I","Mmsystem")
=Callfn(Sound,"BACK.WAV",1)
再编写FORM1的Release过程:
=Callfn(Sound,"",10)
SET LIBRARY TO
运行表单后,BACK.WAV就作为背景音乐在后台播放,关闭表单时音乐自动停止。如果想让音乐自动循环播放,将Activate过程中最后一句换为:
=Callfn(Soun,"BACK.WAV",1+8)即可。
注意:如果你的计算机没有声卡,运行以上程序时将出错。
其次,用“SET BELL TO” 响铃命令。
编写表单的Activate过程:
SET BELL ON
SET BELL TO "BACK.WAV"
??CHR(7)
再编写表单的Release过程:
SET BELL TO
注意:该种方法在运行时,不能进行循环播放,不能中断音乐的播放,但是在没有声卡的情况下,该种程序不会出错,只是进行PC喇叭的响铃一次。
6、在控件返回.F.时,我怎样才能把"Invalid User Input"信息去掉?
答:您可以用 Return 0来代替return .F.。
用命令Return 数目是以表单控件的排序进行焦点设置,例如:
return 0 把焦点设定到当前控件
return 1 把焦点设定到下一个控件
return 2 把焦点设定到当前控件后面的第二个控件
7、我怎样使用按扭来控制页框的翻页?
答:可以利用页框控件中页的ZOrder属性来控制页框的翻页。
比如:This.parent.pageFrame.page1.Zorder &&翻到第一页
This.parent.pageFrame.page2.Zorder &&翻到第二页
8、在VFP中调用WIN32API函数要注意哪些问题?
答:在利用VFP编程时,经常会用到WIN32API函数来对VFP的功能进行扩展,例如对注册表进行操作、获取系统信息等,但是由于WIN32API函数遵循的是C++的数据结构,在应用时与VFP的数据格式有所区别,因此在调用时容易产生问题,
例如,FunctionName 指定在 Visual FoxPro 中要注册的 32 位 Windows .DLL 函数名。注意 FunctionName 区分大小写。 32 位 Windows .DLL 函数名可以与 Win32 API 手册中规定的不同。例如,Messagebox 函数应该命名为 MessogeBoxA(对于单字节字符)和 MessageBoxW(对于 UNICODE)。如果 Visual FoxPro 不能定位 FunctionName 指定的 32 位 Windows .DLL 函数,则将字母 A 追加到函数名尾部,Visual FoxPro 用新的函数名重新搜索。
如果指定的 32 位 Windows .DLL 函数与一个 Visual FoxPro 函数同名,或者函数名不是合法的 Visual FoxPro 函数名,则将 32 位 Windows .DLL 函数名作为 FunctionName,并用 AS 子句给该函数取一个合法的 Visual FoxPro 名,
在从 Visual FoxPro 调用一个 32 位 Windows .DLL 函数前,必须发出带有函数名、包含该函数的 Windows .DLL 名以及函数将要接收的参数类型的 DECLARE 命令。
为了提供向后兼容性,Visual FoxPro 仍支持 FOXTOOLS.FLL(包含在 FoxPro 早期版本中),并允许调用 16 位 .DLL 函数的 Visual FoxPro API 库。在 Visual FoxPro 中,调用 .DLL 函数时使用 DECLARE 是可取的方法。
执行 DISPLAY STATUS 或 LIST STATUS 可以显示注册函数的名称,执行 CLEAR ALL 或 CLEAR DLLS 可从内存中删除注册函数。
9、如何解决公元2000年以后的日期问题?
答:可以采用以下这些方法,
1)采用严格日期格式(SET STRICTDATE TO 1 或SET STRICTDATE TO 2)
2)固定使用四位数年份,即SET CENTURY ON
3)使用SET CENTURY ON 命令指定2位数年份的默认世纪
4)避免使用CTOD()与CTOT()函数,而改用DATE()与DATETIME()函数
10、为什么Coolbar ActiveX 控件在Visual FoxPro中不能工作?
Coolbar ActiveX控件是一个容器控件。Visual FoxPro不能和任何支持集装箱货运船式的控件进行通信。集装箱货运船式的控件会在Visual FoxPro中出现消息处理问题。
11、当我从另一个应用程序中利用Visual FoxPro ODBC驱动来访问数据时,有时我会在ODBC客户应用程序中得到一个应用程序的错误。 这是为什么?
FoxPro.ini资源文件没有安装Visual FoxPro ODBC驱动。要使驱动工作正常,这个文件是必需的。想得到更多关于这方面的信息,请咨询微软公司知识库中的VFP 6.0 ODBC 驱动 FoxPro.int 资源文件中的有关内容。
12、我用表单精灵生成一个表单,运行后为什么表单没有任何控件,出现一片空白?
答:这是用表单精灵自动生成表单时,出现错误后的一般结果,因为它把表单的 LOCKSCREEN 属性改为.T., 您只要把LOCKSCREEN 属性改为.F.,就可以解决这个问题。
13、我怎样才能把网格中的文本控件替换为其它控件?
答:首先,先把原来的文本框控件删除。
1:在您要修改的网格上按下鼠标右键,选择弹出菜单中的“属性....”
2:在弹出的属性对话框顶端的列举框中选择要替换文本框的column下的text1。
3:在网格上按一下鼠标左键。
4:按下键盘上的DELETE按键,删除Text1控件(网格上的ab1将会消失)。
其次,在网格上添置控件。
1:在您要修改的网格上按下鼠标右键,选择弹出菜单中的“编辑....”
2:按一下表单控件工具栏上您要加到网格上的控件。
3:在您要添置控件的column上按下鼠标左键,并放置控件。
14、如何垂直显示LABEL ?
答:您可以把Label 的WordWrap 属性改为.T. ,然后再调整宽度使文本垂直显示。
注意:如果您要显示的是英文,请把英文字母分开写,比如:"TEXT"写成"T E X T"
15、如何用按扭来控制网格的上下翻页显示?
答:一般情况下,我们在网格中直接按Pageup或者PageDown就可以将网格的资料上下翻
动。但是要重新建立一个命令按钮来控制网格资料的移动,听起来好象有点困难.......
其实,网格提供有一个方法让您在程序中可以方便控制资料的移动,这就是
DoScroll()
您只需在命令按钮的CliCK事件中写入DoScroll()就可以方便的控制网格的资料
This.Parent.Grid.DoScroll(0) &&将网格的资料上移一条记录
This.Parent.Grid.DoScroll(1) &&将网格的资料下移一条记录
This.Parent.Grid.DoScroll(2) &&将网格的资料上移一页
This.Parent.Grid.DoScroll(3) &&将网格的资料下移一页
This.Parent.Grid.DoScroll(4) &&将网格的资料左移一格
This.Parent.Grid.DoScroll(5) &&将网格的资料右移一格
This.Parent.Grid.DoScroll(6) &&将网格的资料左移一页
This.Parent.Grid.DoScroll(7) &&将网格的资料右移一页