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;
- 从库中查询多行数据:(查询语句被固化)
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; // 断开
- 从库中查询一行数据:(查询语句被固化) 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 中讲得很清楚,这里就不多讲了。
- 非固化的查询语句:这个对提高软件灵活性很重要,但很简单,只贴上 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 & <――这是分行连接符号,空格后一个&符号