pb编程通俗快速入手
张金柱
第一章 一般使用
1、 程序的开始,application的open事件。
退出程序例程:halt为退出函数
int surequit
surequit = 2
surequit=messagebox("退出系统","退出前请确认已保存好数据",question!,okcancel!, 2)
if surequit = 1 then halt
2、 变量定义有效范围:
◎ declare-globe 全局变量,整个程序均有效
◎ declare-instance 局部变量,可在一个对象中有效(如:窗体,app等)
◎ 模块中定义的变量,可在当前模块中有效
定义:(pb中大小写不敏感)
constant string ls_homecity = "boston" 常量
int a 整型
char c 字符型
boolean b 布尔型
string a 字符串型
string a[1000] 1000的数组,0~1000
string a[3 to 30] 数组元素为3到30,最初一个为a[3],最后一个为a[30]
string a [100,3to 30] 二维数组,一维为0~100,二维为3 到30
string a[] 变长数组,赋值时(如a[30]=333)自动分配内存。
得到上界upperbound,下界lowerbound。
操作:
a=”aaaa”+”vvvbb”+b+c
string(b) 将b转换成字符串型
integer(“333333333333”) 将“333333333333”字符串转换成数333333333333
a=a+b*c^d/e/f%g
◎注意:减号前后要空格,用于避免pb7.0之前版本的bug。
3、 函数定义:
第一行是返回类型和函数名,第二行是变量类型和变量名,tab键加形参。
return 是函数的返回,同时如c语言一样,return则函数运行结束
4、 打开窗口
open(窗口名)
openwithparm(窗口名,参数,父窗口<仅对子窗体和弹出窗体有效>)
5、 mdi窗体中打开子窗体
层叠样式打开 opensheet(子窗体,父窗体名,1,layered!)
平铺样式打开 opensheet(子窗体,父窗体名,1, original!)
如果在父窗体的窗体级函数下编写,可用 opensheet(子窗体,this,1, original!)
第三个参数表示新开窗体在父窗体菜单中的位置。
6、 控件基本属性
控件名.x x坐标
控件名.y y坐标
控件名.width 宽
控件名.height 高…… (其他可参见编辑器中的属性窗口)
7、 调整窗体模式
this.windowstate=maximized!
窗体.windowstate=maximized! 窗体最大化(其他可参见编辑器中的属性窗口)
8、 ini文件读取及写入
【举例】有名为“mnr.ini”的ini文件,(路径在程序所在目录)有数据如下:
[action]
preload=yes
可以用如下语句读取:
a=profilestring("mnr.ini","action","preload","aaa")
a为变量,”aaa”为无此数据项时默认数据
可以用如下语句写入(写入值为yes):
setprofilestring("mnr.ini","action","preload","yes")
9、 对于整个程序中都要用到的变量
可以先定义一个结构,再在globe declare中定义该结构类型变量,管理起来方便些
10、 主要语法单元
条件判断
if 怎样 then
怎样做
else if 怎样 then
怎样做
end if
choose case 变量
case is <3
…
case 4 to 7
…
case else
…
end choose
循环到a大于5
do
a=a+1
loop until a > 5
do while a <= 5
a = a + 1
loop
do
a=a+1
loop until a > 5
do until a > 5
a = a + 1
loop
跳出循环exit,继续下一轮循环continue
11、 消息框
messagebox(标题,信息) 其他看帮助,查索引messagebox
12、取得当前时间now()
sle_begintime.text=string(now(),"yyyy-mm-dd 10:00:00")
如现在是 2002-7-14 17:22:21秒,则输出为 2002-7-14 10:00:00
13、列表框应用
ddlb_bsc.reset() 清空列表框内容
i=1
do while i<=upperbound(winbsc)
if winbsc[i]="" then exit;
ddlb_bsc.additem(winbsc[i]) 增加内容项到列表框
i=i+1
loop
第二章 应用数据库
1、 datawindow控件的使用
先创建一个datawindow对象dw_hwtj,再在窗体中添加一个datawindow控件dw_rep,最后将datawindow的dataobject属性设置成dw_hwtj。
a)我写的选行函数,datawindow控件的click事件上用
if row=0 then return
if nowrow<>row and nowrow>=0 then
this.selectrow(nowrow,false)
end if
this.selectrow(row,true)
nowrow=row
b)我写的排序函数,在datawindow控件的双击事件上用
if dwo.type = "column" then
ls_columnname = dwo.name
end if
if nowstate='a' then
this.setsort(ls_columnname+" d")
nowstate='d'
else
this.setsort(ls_columnname+" a")
nowstate='a'
end if
this.sort()
(效果,在某一列上双击一次,正向排序,再一次,反向排序)
c)规定排序
dw_rep.setsort("bscmc a,xqh a,xqmc a")
dw_rep.sort()
(先按bscmc,再按xqh,再按xqmc正向排序)
d)保存到xls文件
dw_rep.saveas('',excel5!,true)
e)读写:
写w_netrep_cell.dw_rep.object.tchpzzs[i] =a
读a=w_netrep_cell.dw_rep.object.tchpzzs[i]
2、 建立与数据库的连接
1)定义
transaction localdb
2)设置
mytrans.dbms=”as”
mytrans.database=”sda”
mytrans.logpass=”def”
mytrans.servername=”dbo”
mytrans.logid=”abc”
mytrans.dbparm=””
mytrans.lock=””
mytrans.userid=”abc”
mytrans.autocommit =true
3)连接
连接 connect using localdb;
断开 disconnect using localdb;
4)从库中查询多行数据:(查询语句被固化)
connect using localdb; //连接
if localdb.sqlcode<0 then
messagebox("连接本地数据库失败...",localdb.sqlerrtext)
return 1
end if
declare my_cursor cursor for //定义游标
select bsc from bsc order by bsc using localdb; //执行查询
i=1;
open my_cursor; //打开游标
do while not localdb.sqlcode = 100 //直到结束
if i>upperbound(winbsc) then exit
fetch my_cursor into :winbsc[i]; //提取数据项
i=i+1
loop
close my_cursor; //关闭游标
disconnect using localdb; //断开
5)从库中查询一行数据:(查询语句被固化)help中例程,“:“后加一个字符串是指标志为该字符串的变量
select employee.emp_lname, employee.emp_fname
into :emp_lname, :emp_fname
from employee
where employee.emp_nbr = :emp_num
using emp_tran ;
6)在数据更新,删除,增加,建表等操作中使用的:
注意查阅:dynamic sql format 1 statement ……dynamic sql format 4 statement,其中讲得很清楚(看sample)
直接执行一条语句:
execute immediate sqlstatement {using transactionobject} ;
help中讲得很清楚,这里就不多讲了。
7)非固化的查询语句:这个对提高软件灵活性很重要,但很简单,只贴上help中的sample一个:
declare my_cursor dynamic cursor for sqlsa
string sql1, sql2
sql1 = "select emp_id from department where salary > 90000"
sql2 = "select emp_id from department & <――这是分行连接符号,空格后一个&符号
where salary > 20000"
if deptid = 200 then
prepare sqlsa from :sql1 using sqlca ;
else
prepare sqlsa from :sql2 using sqlca ;
end if
open dynamic my_cursor ;
小结:
内容不多,但主要的东西都在这里了,其他的要在实践中领会,这些知识对上手和标准的mis系统等开发,知识面及深度已经足够了。sql语句帮助中的已够用,详细讲太多,恕不赘述。
2002-7-14