| 网站镜像:电信 网通 | 加入收藏 | 设为首页

PB编程通俗快速入手(自己2002年教别人PB时随手写的,很多年了,放上来送给新手们)

  • 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