PB读写TXT文件

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PB读写TXT文件
可以用读\写ini文件一样的方式,用profilestring()和fileopen()函数来实现.
PB中有这些函数
FileExists(filename)判断文件是否存在
FileRead(file#,variable)读取文件
int filemum
string filedata
filenum=fileopen('c:\pb.txt',linemode!,write!)//没有文件的话自动创建
fileread(filenum,filedata)
..
fileclose(filenum)
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:数据窗口有哪些常见问题?使用技巧?
yangxiaowenbing
(xiaobing)
等级:
#4楼得分:0回复于:2004-03-3013:13:11li_num=fileopen(ls_file,linemode!,write!) for ll_row=1to ll_count
filewrite(li_num,"AA")
next
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:回复:死守pb,死路一条PB将会带来新的Web开发的狂潮,4GL语言的王者风范唯有PB具备!yangxiaowenbing
(xiaobing)
等级:
#5楼得分:5回复于:2004-03-3013:15:33li_num=fileopen(ls_file,linemode!,write!) for ll_row=1to ll_count
ls_ss=dw_1.object.aa[ll_row]
filewrite(li_num,ls_ss)
next
fileclose(li_num)
//读取文件
integer li_FileNum
string ls_Emp_Input
long ll_FLength
li_FileNum=FileOpen("e:\aa.txt",StreamMode!,Read!,LockWrite!, Replace!)
ll_FLength=FileLength("e:\aa.txt")
IF ll_FLength<32767THEN
FileRead(li_FileNum,ls_Emp_Input)
END IF
FileClose(li_FileNum)
//保存到数组
ls_Emp_Input=trim(ls_Emp_Input)
ll_FLength=len(ls_Emp_Input)
string aa[10]
long ll_start,ll_pos,i
ll_start=1
ll_pos=1
i=1
do while ll_FLength>0
ll_pos=pos(ls_Emp_Input,'',ll_start)
if ll_pos>0then
aa[i]=mid(ls_Emp_Input,ll_start,ll_pos-ll_start)
i++
ls_Emp_Input=trim(mid(ls_Emp_Input,ll_pos+1))
ll_FLength=len(ls_Emp_Input)
else
aa[i]=ls_Emp_Input
exit
end if
loop
pb函数库之文件操作函数
FileClose()
功能关闭先前用FileOpen()函数打开的文件。

语法FileClose(fileno)
参数fileno:integer,指定要关闭文件的文件句柄,该句柄使用FileOpen()函数打开文件时得到返回值Integer。

函数执行成功时返回1,发生错误时返回-1。

如果fileno参数的值为NULL,那么FileClose()函数返回NULL。

--------------------------------------------------------------------------------
FileDelete()
功能删除指定的文件。

语法FileDelete(filename)
参数filename:string类型,指定要删除文件的文件名,其中可以包含路径返回值Boolean。

函数执行成功时返回TRUE,发生错误时返回FALSE。

如果filename参数的值为NULL,那么FileDelete()函数返回NULL。

--------------------------------------------------------------------------------
FileExists()
功能检查指定的文件是否存在。

语法FileExists(filename)
参数filename:string
类型,指定要检查存在性的文件的文件名,其中可以包含路径返回值Boolean。

如果指定文件存在时返回TRUE,不存在时返回FALSE。

如果filename参数的值为NULL,那么FileExists()函数返回NULL。

用法如果filename参数指定的文件被另一个应用加锁锁住,那么FileExists()函数也将返回FALSE。

--------------------------------------------------------------------------------
FileLength()
功能得到指定文件的长度(以字节为单位)。

语法FileLength(filename)
参数filename:string类型,指定要得到其长度的文件的文件名,其中可以包含路径返回值Long。

函数执行成功时返回指定文件的长度(以字节为单位)。

如果指定的文件不存在,函数返回-1。

如果filename参数的值为NULL,那么FileLength()函数返回NULL。

--------------------------------------------------------------------------------
FileOpen()
功能以指定的读写方式打开指定的文件,同时返回该文件的句柄。

语法FileOpen(filename{,filemode{,fileaccess{,filelock{,writemode,{creator,filetype}}}}})
参数filename:string类型,指定要打开文件的名称,其中可以包含路径filemode:FileMode 枚举类型,可选项,指定文件打开方式。

有效取值为:?LineMode!-缺省值,行模式;?StreamMode!-流模式fileaccess:FileAccess枚举类型,可选项,指定文件访问方式。

有效取值为:?Read!-缺省值,只读方式,这样打开的文件只能进行读操作;?Write!-只写方式,这样打开的文件只能进行写操作?filelock:FileLock枚举类型,可选项,指定文件加锁方式。

有效取值为:n LockReadWrite!-缺省值,只有打开该文件的用户能够访问该文件,其它用户对该文件的访问均被拒绝;n LockRead!-只有打开该文件的用户能够读该文件,但其它任何用户均可写该文件;n LockWrite!-只有打开该文件的用户能够写该文件,但其它任何用户均可读该文件;n Shared!-所有用户均可读写该文件writemode:WriteMode枚举类型,可选项,当fileaccess参数指定为Write!时,该参数指定在指定文件已经存在时数据的添加方式。

有效取值为:?Append!-缺省值,将数据添加到原文件尾部;?Replace!-覆盖原有数据creator:可选项,用于Macintosh机,使用四个字符的字符串指定文件的创建者。

指定该参数后,必须同时指定filetype参数filetype:可选项,用于Macintosh机,使用四个字符的字符串指定文件类型返回值Integer。

函数执行成功时返回打开文件的句柄,随后的文件操作函数利用该句柄完成对文件的操作。

发生错误时函数返回-1。

如果任何参数的值为NULL,那么FileOpen()函数返回NULL。

用法当文件以行模式打开时,每执行一次FileRead()函数读取一行数据;每执行一次FileWrite()函数,该函
数自动在写出的字符串末尾增加一个回车(CR)换行(LF)符(这是应用程序在Windows系统中运行时的情况,在UNIX下只加一个换行字符)。

当文件以流模式打开时,执行一次FileRead()函数读取32,765个字节的数据,如果余下数据没有这么多,那么FileRead()函数就读取所有余下的数据;执行一次FileWrite()函数时,最多可写入32,765个字节的数据,并且不添加回车换行字符。

当文件以写方式使用FileOpen()函数打开时,如果指定的文件不存在,那么FileOpen()函数创建该文件。

--------------------------------------------------------------------------------
FileRead()
功能从指定文件中读取数据。

语法FileRead(fileno,variable)
参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)variable:string或blob 类型的变量,用于保存读取的数据返回值Integer。

函数执行成功时返回读取的字符数或字节数;如果在读取任何字符前读到了文件结束符(EOF),则FileRead()函数返回-100;当指定文件以行模式打开时,如果在读取任何字符之前遇到了回车(CR)或换行(LF)字符,则FileRead()
函数返回0。

如果发生其它错误,FileRead()函数返回-1。

如果任何参数的值为NULL,那么FileRead()函数返回NULL。

用法当指定文件以行模式(Line Mode)打开时,FileRead()函数一次读取一行数据,并把它保存到参数variable中,然后跳过行结束符(回车换行符,操作系
统不同,使用的字符也不同),把文件指针移动到下一行的起始位置。

当文件以流模式(Stream Mode)打开时,FileRead()函数或一直读取到文件结尾,或读取32,765字节的数据,决定于两者哪个数据长度更短些。

--------------------------------------------------------------------------------
FileSeek()
功能将文件指针移动到指定位置。

读写文件时相应函数会自动移动文件指针。

语法FileSeek(fileno,position,origin)
参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)position:long类型,
指定相对于origin参数指定位置的新位置偏移量,以字节为单位origin:SeekType枚举类型,
指定从哪里开始移动文件指针,即指针移动的基准。

有效取值为:?FromBeginning!-缺省值,
从文件开头移动指针;?FromCurrent!-从当前位置移动文件指针;?FromEnd!-从文件结尾
处移动文件指针返回值Long。

函数执行成功时返回指针移动后的指针位置。

如果任何参数的值
为NULL,那么FileSeek()函数返回NULL。

--------------------------------------------------------------------------------
FileWrite()
功能向指定文件中写数据。

语法FileWrite(fileno,variable)
参数fileno:integer类型,指定文件句柄(由FileOpen()函数得到)variable:string或blob 类型,其值
将写入fileno参数指定的文件返回值Integer。

函数执行成功时返回写入文件的字符或字节数,发生错误时返回-1。

如果任何参数的值为NULL,那么FileWrite()函数返回NULL。

用法FileWrite()函数从当前文件指针开始写入指定数据,写入之后,将文件指针调整到刚刚写入数据的下一个字节位置。

当文件以writemode参数设置为Replace!方式打开时,文件指针最初位于文件的开头位置;当文件以writemode参数设置为Append!方式打开时,文件指针最初位于文件的结尾位置。

当文件以行模式打开时,执行FileWrite()函数时,该函数自动在每次写入数据的后面加上回车换行符,并把文件指针移动到回车换行符后面。

当文件以流模式打开时,FileWrite()函数一次最多写入32,765个字节。

如果variable参数中数据的长度超过了32,765个字节,那么FileWrite()函数只向文件中写入前32,765个字符并返回32,765。

--------------------------------------------------------------------------------
GetFileOpenName()
功能显示打开文件对话框,让用户选择要打开的文件。

语法GetFileOpenName(title,pathname,filename{,extension{,filter}})
参数title:string类型,指定对话框的标题pathname:string类型变量,用于保存该对话框
返回的文件路径及文件名filename:string类型变量,用于保存该对话框返回的文件名extension:string类型,可选项,使用1到3个字符指定缺省的扩展文件名filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框中供用户选择的文件名满足的条件(比如*.*,*.TXT,*.EXE等)返回值Integer。

函数执行成功时返回1;当用户单击了对话框上的“Cancel”按钮时函数返回0;发生错误时返回-1。

如果任何参数的值为NULL,那么GetFileOpenName()函数返回NULL。

用法filter参数的格式为:description,*.ext缺省值为:"All Files(*.*),*.*"其中,description说明扩展名的意义,比如“所有文件”、“文本文件”等。

你可以根据需要指定在打开文件对话框中显示的文件名类型。

当需要指定多种文件类型时,各类型之间使用逗号分隔,例如:"PIF文件,*.PIF,批处理文件,*.BAT"需要注意的是,该函数只是得到一个文件名,而并没有打开文件,需要打开文件时,依然需要使用FileOpen()函数。

--------------------------------------------------------------------------------
GetFileSaveName()
功能显示保存文件对话框,让用户选择要保存到的文件。

语法GetFileSaveName(title,pathname,filename{,extension{,filter}})
参数title:string类型,指定对话框的标题pathname:string类型变量,用于保存该对话框返回的文件路径及文件名filename:string类型变量,用于保存该对话框返回的文件名extension:string类型,可
选项,使用1到3个字符指定缺省的扩展文件名filter:string类型,可选项,其值为文件名掩码,指定显示在该对话框的列表框中供用户选择的文件名满足的条件(比如*.*,*.TXT,*.EXE等)返回值Integer。

函数执行成功时返回1;当用户单击了对话框上的“Cancel”按钮时函数返回0;发生错误时返回-1。

如果任何参数的值为NULL,那么GetFileSaveName()函数返回NULL。

用法filter参数的格式为:description,*.ext缺省值为:"All Files(*.*),*.*"其中,description说明扩展名的意义,比如“所有文件”、“文本文件”等。

你可以根据需要指定在打开文件对话框中显示的文件名类型。

当需要指定多种文件类型时,各类型之间使用逗号分隔,例如:"PIF文件,*.PIF,批处理文件,*.BAT"需要注意的是,该函数只是得到一个文件名,而并没有打开文件,需要打开文件时,依然需要使用FileOpen()函数。

pb函数库之字符串操作函数
Fill()
功能建立一个由指定字符串填充的指定长度的字符串。

语法Fill(chars,n)
参数chars:string类型,指定用于重复填充的字符串n:long类型,指定由该函数返回的字符串的长度返回值String。

函数执行成功时返回n个字符的字符串,该字符串以参数chars中的字符串重复填充而成。

如果参数chars中的字符个数多于n个,那么使用chars字符串的前n个字符填充函数返回的字符串;如果参数chars中的字符个数少于n个,那么使用chars字
符串反复填充,直到返回的字符串长度达到n为止。

如果任何参数的值为NULL,Fill()函数返回NULL。

--------------------------------------------------------------------------------
Left()
功能得到字符串左部指定个数的字符。

语法Left(string,n)
参数string:string类型,指定要提取子串的字符串n:long类型,指定子串长度返回值String。

函数执行成功时返回string字符串左边n个字符,发生错误时返回空字符串("")。

如果任何参数的值为NULL,Left()函数返回NULL。

如果n的值大于string字符串的长度,那么Left()函数返回整个string字符串,但并不增加其它字符。

--------------------------------------------------------------------------------
LeftTrim()
功能返回指定字符串删除了左部空格后的字符串。

语法LeftTrim(string)
参数string:string类型,指定要删除左部空格的字符串返回值String。

函数执行成功时返回删除了string字符串左部空格的字符串,发生错误时返回空字符串("")。

如果任何参数的值为NULL,LeftTrim()函数返回NULL。

--------------------------------------------------------------------------------
Len()
功能得到字符串的长度。

语法Len(string)
参数string:string类型变量返回值Long。

函数执行成功时返回
字符串的长度,发生错误时返回-1。

如果任何参数的值为NULL,则Len()函数返回NULL。

--------------------------------------------------------------------------------
Lower()
功能将字符串中的大写字母转换为小写字母。

语法Lower(string)
参数string:要将其中的大写字母转换为小写字母的字符串返回值String。

函数执行成功时返回将大写字母转换为小写字母后的字符串,发生错误时返回空字符串("")。

如果string参数的值为NULL,Lower()函数返回NULL。

--------------------------------------------------------------------------------
Match()
功能确定字符串中是否包含指定模式的字符。

语法Match(string,textpattern)
参数string:string类型,指定要检查是否匹配指定模式的字符串textpattern:string类型,指定文本匹配模式返回值Boolean:如果字符串string与模式textpattern相匹配,则函数返回TRUE,否则返回FALSE。

如果指定的匹配模式无效或上述两个参数中的任何一个未曾赋值,那么Match()函数返回FALSE。

如果任何参数的值为NULL,Match()函数返回NULL。

用法textpattern参数的写法与正则表达式十分相似,它由元字符和普通字符组成。

每个元字符都有不同的匹配含义,普通字符则与其自身相匹配。

下面是匹配模式中使用的元字符及其意义:^指示字符串的开始,例如,^asd表示以asd开头的字符串,字符串asdfgh与模式^asd匹配,而字符串basdfg与模式^asd不匹配。

$指示字符串的结束,例如,red$表示所有以red结束的字符串均与该模式匹配,而redo与模式red$不匹配。

.匹配任意单个字符,例如,^&&$匹配任何六个字符组成的字符串。

[]匹配括号中列出的字符,例如,^[ABC]$匹配由一个字符组成的字符串,其值只能是A或B或C。

-与方括号一起,指定匹配字符的范围,例如,^[A-Z]$只匹配那些由一个大写字母组成的字符串。

方括号里还可以使用^字符,表示匹配不在指定范围内的任何字符,例如,[^0-9]匹配除数字外的任何字符。

*,+,?这些符号跟在一个字符后面表示该字符可以出现的次数。

星号(*)表示可以出现0次或任意次;加号(+)表示可以出现多次,但至少出现一次;问号(?)表示出现0次或一次。

例如,A*匹配0个或多个A(没有A、A、AA、AAA、AAAA、**);A+匹配1个或多个A(A、AA、AAA、AAAA、**);A?匹配空串或1个A。

\斜杠(\)是转义字符,它去掉特殊字符的特殊含义,比如,模式\$匹配字符$,模式\\匹配字符\。

--------------------------------------------------------------------------------
Mid()
功能取字符串的子串。

语法Mid(string,start{,length})
参数string:string类型,指定要从中提取子串的字符串start:long类型,指定子串
第一个字符在string字符串中的位置,第一个位置为1length:long 类型,可选项,指定子串的长度返回值String。

函数执行成功时返回string字符串中从start 位置开始、长度为length的子串。

如果start参数的值大于string中字符个数,那么Mid()函数返回空字符串。

如果省略了length参数或length参数的值大于从start开始、string字符串中余下字符的长度,那么Mid()函数返回所有余下的字符。

如果任何参数的值为NULL,Mid()函数返回NULL。

--------------------------------------------------------------------------------
Pos()
功能在一个字符串中查找所包含的另一个字符串的起始位置。

语法Pos(string1,string2{,start})
参数string1:string类型,指定要从中查找子串string2的字符串string2:string类型,指定要在string1中查找的字符串start:long类型,可选项,指定从string1的第几个字符开始查找。

缺省值为1返回值Long。

函数执行成功时返回在start位置后string2在string1中第一次出现的起始位置。

如果在string1中按指定要求未找到string2、或start的值超过了string1的长度,那么Pos()函数返回0。

如果任何参数的值为NULL,Pos()函数返回NULL。

用法Pos()函数在字符串查找时区分大小写,因此,"aa"不匹配"AA"。

--------------------------------------------------------------------------------
Replace()
功能将一个字符串中指定个数的字符串替换为另一个字符串。

语法Replace(string1,start,n,string2)
参数string1:string类型,指定要使用string2替换其中一部分内容的字符串start:long类型,指定要从哪个字符位置开始替换字符串,字符串中第一个字符的位置为1n:long类型,指定要替换多少个字符string2:string类型,指定用哪个字符串替换string1的部分字符返回值String。

函数执行成功时返回替换后的字符串,发生错误时返回空字符串("")。

如果任何参数的值为NULL,Replace()函数返回NULL。

用法如果start参数指定的位置超过了string1的长度,那么Replace()函数把将string2拼接到string1的后面形成的字符串返回。

如果n的值为0,那么Replace()函数把string2插入到string1指定位置后形成的字符串返回。

--------------------------------------------------------------------------------
Right()
功能从字符串右端取指定个数字符。

语法Right(string,n)
参数string:string类型,指定要提取子串的字符串n:long类型,指定子串长度返回值String。

函数执行成功时返回string字符串右边n个字符,发生错误时返回空字符串("")。

如果任何参数的值为NULL,Right()函数返回NULL。

如果n的值大于string字符串的长度,那么Right()函数返回整个string字符串,但并不增加其它字符。

--------------------------------------------
------------------------------------
RightTrim()
功能删除字符串尾部空格。

语法RightTrim(string)
参数string:string类型,指定要删除右部空格的字符串返回值String。

函数执行成功时返回删除了string字符串右部空格的字符串,发生错误时返回空字符串("")。

如果任
何参数的值为NULL,RightTrim()函数返回NULL。

--------------------------------------------------------------------------------
Space()
功能生成一个由空格组成的指定字符个数的字符串。

语法Space(n)
参数n:long类型,指定要填充的空格个数,也就是填充后返回的字符串的长度返回值String。

函数执行成功时返回由n个空格组成的字符串,发生错误时返回空字符串。

如果参数n的值为NULL,Space()函数返回NULL。

--------------------------------------------------------------------------------
Trim()
功能删除字符串首部和尾部的空格。

语法Trim(string)
参数string:string类型,指定要删除首部和尾部空格的字符串返回值String。

函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空字符串("")。

如果任何参数的值为NULL,Trim()函数返回NULL。

--------------------------------------------------------------------------------
Upper()
功能将字符串中的小写字母转换为大写字母。

语法Upper(string)
参数string:要将其中的小写字母转换为大写字母的字符串返回值String。

函数执行成功时返回将小写字母转换为大写字母后的字符串,发生错误时返回空字符串("")。

如果string参数的值为NULL,Upper()函数返回NULL。

PB编程技巧实例
PB编程技巧实例
随着数据库技术在各行各业的广泛应用,作为企业级数据库前端开发工具的Power Builder日益成为开发人员的得力助手。

PowerBuilder以其开放的体系结构,友好的用户界面和简洁高效的开发环境赢得了众多程序员的喜爱,连续多年被评为美国计算机界的年度风云产品,在数据库开发工具领域占据了高达44%的市场份额。

PowerBuilder进入我国的时间不长,许多编程人员希望了解并掌握这一先进工具。

在这里,笔者将自己平日用PowerBuilder作开发的一些体会整理出来,奉献给大家。

PowerBuilder是由多个功能模块组成的可视化集成开发环境,是面向对象的开发工具,用它可以方便地建立起基于Windows的分布式数据库应用。

其功能模块分别完成应用管理、窗口对象设计、菜单对象设计、数据窗对象设计和数据库查询等工作,这些功能模块由于PowerBuilder 提供的色彩丰富的工具条而被称作"Painter"(画板)。

下文便依据各模块作大的分类介绍相应的编程技巧。

一、有关应用的编程技巧仅让应用程序运行一次
的技巧:
有时需要限制一个PowerBuilder应用同时运行的实例(Instance)个数或仅让应用运行一次,我们可以通过调用WindowsSDK函数或使用PowerBuilder的Handle()函数来实现。

先谈调用SDK函数的方法。

为了调用SDK函数,需要在ApplicationPainter的菜单项Declare\GlobalExternalFunctions中定义:FunctionuintGetModuleHandle(stringModuleName)Library"Kernel.exe" FunctionuintGetModuleUsage(uintModuleHandle)Library"Kernel.exe"
下面这段程序写在Application的Open事件中。

它先通过调用SDK函数GetModuleHandle()获得指定应用程序的句柄,然后调用GetModuleUsage()函数确定应用程序同时运行的实例个数。

uint IApplHandle
int App_num
IApplHandle=GetModuleHandle("ocmis.exe")
if IApplHandle>0then
App_num=GetModuleUsage(IApplHandle)
if App_num>1then
Messagebox("注意","本程序已经运行!",Stopsign!)
return
endif
endif
Open(w_main)
若需要限制应用同时运行的实例个数,比如仅允许同时运行N个实例,那么将上述程序中的语句“if App_num>1then”改为“if App_num>N then”即可。

采用Handle()函数的方法更简洁一些,代码如下:
int hand
hand=Handle(this,TRUE)
If hand>0then
Messagebox("注意","本程序已经运行!",Stopsign!)
Halt
else
Open(w_main)
endif
二、有关窗口的编程技巧
1、提供实时帮助条
中文之星2.0版的链形菜单管理器提供了实时帮助条,增强了系统的易用性,在PowerBuilder 中也可以实现类似的功能。

当鼠标移动到窗口中的某些控制(Control),如编辑器、图片等时,会在鼠标附近自动产生帮助条,实时地提示操作要领。

首先在窗口w_main中任意位置定义一个黄底黑字的静态文本st_help,设定st_help.visible=false,st_help.text=&Help;然后在该窗口模块的Declare\WindowFunctions...下定义函数show_help(),其参数只有一个,参数名为text,类
型为string,通过传值方式接收参数;无返值。

show_help()代码如下:
if st_help.visible then
return
endif
st_help.text=text
st_help.width=Len(st_help.text)*38
st_help.x=w_main.PointerX()
st_help.y=w_main.PointerY()+50
if st_help.x+st_help.width>w_main.Workspacewidth()then
st_help.x=w_main.Workspacewidth()-st_help.width
endif
if st_help.y+st_help.height>w_main.Workspaceheight()
then st_help.y=w_main.Workspaceheight()-st_help.height
endif
st_help.visible=true
接下来,我们就可以调用show_help()函数了。

但PowerBuilder提供的所有控制均缺乏当鼠标移至其上就触发的事件,显然,需要定义相应的用户事件。

先选中准备定义用户事件的控制,如某个单行编辑器,然后在窗口模块的菜单Declare\UserEvents...下,双击PasteEventID:中的pbm_mousemove条目,将其拷贝至EventID下,取EventName为Mouseon,这样,我们就定
义好了相应控制的用户事件Mouseon。

我们可以在该控制的用户事件Mouseon下,写下调用函数show_help()的语句:
if st_help.visible then
Hide(st_help)
show_help("瞧!这便是实时帮助条!")
endif
2、“跑马灯”的实现技巧
有时需要用一矩形条显示少量用户特别关心的信息,这条信息串首尾相连,向一个方向循环滚动,我们通常将其称作“跑马灯”。

证券业中常用“跑马灯”来显示不断变化的股票行情;实际应用中也常通过“跑马灯”来监视是否死机。

我们可以写一个简单的函数running_horse()来实现“跑马灯”的显示。

running_horse有两个参数,
第一个参数的参数名为textline,类型为string,传值;
第二个参数的参数名为num,类型为int,传值;函数返值类型为string。

该函数的代码仅一句:
returnMid(textline,(num+1))+Left(textline,num)
下面就可以调用running_horse()函数了。

先在一个窗口里定义好单行编辑器sle_running_horse,在该窗口的Open事件下写上:sle_running_horse.text="Iamtestingrunning_horse!"
Timer(0.2)
然后在该窗口的Timer事件下调running_horse(),代码如下:sle_running_horse.text=running_horse(sle_running_horse.text,1)这样,当你打开这个窗口时,“跑马灯”便会运转起来。

可以在程序中加些语句,适时地增减sle_running_horse.text 中的内容,你便会在“跑马灯”中看到相应变化的信息。

三、有关菜单的编程技巧右键菜单的实现技巧:
当你在相应的窗口或控制上按鼠标右键时,就会在鼠标所指位置弹出菜单,这就是右键菜单。

程序中支持右键菜单会为用户的操作带来许多方便,同时鼠标右键可以分担部分左键的功能。

右键菜单在证券期货业中的许多大型行情分析软件中得到了广泛的应用。

在PowerBuilder中实现右键菜单非常简单,仅两个步骤:1.设计相应菜单;2.在窗口或控制的Rbuttondown事件下写上调用语句。

先在MenuPainter中创建菜单rbuttonpop,rbuttonpop有一个菜单条目(Menuitem)m_choice。

然后在需要调用该菜单的窗口或控制的Rbuttondown事件下写上:m_rbutton popNewMenu
NewMenu=Createm_rbuttonpop
NewMenu.m_choice.PopMenu(PointerX(),PointerY())
至此,右键菜单制作完毕。

上述语句中的NewMenu的数据类型为m_rbuttonpop,当你在相应位置按鼠标右键时,弹出的菜单NewMenu是菜单m_rbuttonpop的一个实例(Instance)。

四、有关数据窗口的编程技巧
数据窗对象是PowerBuilder中最重要的概念之一,它是PowerBuilder应用区别于其它Windows应用的重要特征,同时也是PowerBuilder的价值所在。

PowerBuilder应用通常通过数据窗对象从数据库或其它数据源取得数据并加以显示,其数据的输入、添加、修改和删除也
大都通过数据窗对象来实现。

故理解并掌握数据窗概念对于用好PowerBuilder具有重要意义。

下面给出了有关数据窗的几个编程技巧。

1、自动调整大小的数据窗
在PowerBuilder应用运行过程中,常常会用鼠标拖动窗口角以改变窗口大小,尤其是在多文档
窗口(MDI)中,通常有多个sheet存在的情况下,有时为了察看后面窗口中的数据而将前面窗口缩小,但窗口缩小了,其中的数据窗并没有缩小,由此而不能方便地使用数据窗的卷滚条,那么怎样使前面窗口中的数据窗大小随窗口的大小自动调整呢?
很简单,我们只需要在数据窗所在窗口的Resize事件下写上一句话:
Resize(dw_datamon,this.Workspacewidth()-50,this.Workspaceheight()-50)
其中dw_datamon是数据窗的名字,数字50可以调整。

这样,你就拥有了一个会随窗口大小变化而自动调整大小的数据窗了。

卷滚条用起来很方便,不信试试。

2、Retrieve后不回卷的数据窗
我们经常面对一大堆数据,其具体体现就是数据窗很长,需要拉动垂直卷滚条才能看到后面的数据,当你在包含长数据窗的窗口的Timer事件中写下Retrieve()语句后,令人气恼的事情就会发生:Timer事件一执行,数据窗就翻回第一页;如果Timer事件执行的时间间歇很短,那我们就永远没有足够的时间来察看后面的数据了。

下面我们着手解决这个问题。

可能你已经注意到了,每个数据窗都拥有两个与Retrieve有关的事件:Retrievestart和Retrieveend,它们分别允许我们在Retrieve的前后干一些事,这正是我们所需要的。

实际上,就这两个事件,我们已经能够提出两个解决方案了。

其一,在Retrievestart事件中,保存当前数据窗中可见的数据行;然后Retrieve;接着在Retrieveend事件中,恢复先前保存的数据行。

其二,在Retrievestart事件中,保存当前垂直卷滚块的位置;Retrieve后再恢复其位置。

后者使用了动态数据窗函数,实现起来更简洁一些,下面详细探讨。

假设你已设计好了一个在窗口w_datamon中的数据窗dw_datamon,现在可以先定义一个保存垂直卷滚块位置的类型为
string的Globle变量old_vspos,然后在该数据窗的Retrievestart事件下输入以下语句以保存其位置:old_vspos=this.dwDescribe("DataWindow.VerticalScrollPosition")
dw_datamon.SetRedraw(false)
在相应的Retrieveend事件下输入恢复垂直卷滚块位置的语句:
this.dwModify("DataWindow.VerticalScrollPosition="+old_vspos)
dw_datamon.SetRedraw(true)
这样,数据窗上的工作已做完。

下面是相应窗口上的工作。

该窗口的Open事件下:
dw_datamon.Settrans(sqlca)
dw_datamon.Retrieve()
timer(6)
该窗口的Timer事件下:
Setfocus(w_datamon)
Retrieve(dw_datamon)
至此,Retrieve后不会回卷的
数据窗dw_datamon已经可以工作了。

值得注意的是,数据窗的排序分类等操作应在Retrieve前就在数据库表中完成,否则Retrievestart事件保存的卷滚块位置很可能并不是你所期待的,换句话说,Retrievestart事件应发生在所有数据窗操作之后;另外,。

相关文档
最新文档