PB详细学习笔记.docx

上传人:b****5 文档编号:3274682 上传时间:2022-11-21 格式:DOCX 页数:24 大小:38.29KB
下载 相关 举报
PB详细学习笔记.docx_第1页
第1页 / 共24页
PB详细学习笔记.docx_第2页
第2页 / 共24页
PB详细学习笔记.docx_第3页
第3页 / 共24页
PB详细学习笔记.docx_第4页
第4页 / 共24页
PB详细学习笔记.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

PB详细学习笔记.docx

《PB详细学习笔记.docx》由会员分享,可在线阅读,更多相关《PB详细学习笔记.docx(24页珍藏版)》请在冰豆网上搜索。

PB详细学习笔记.docx

PB详细学习笔记

1.当我们在程序中用修改数据库的时候,只要不用commit切程序在运行,我们此时是查看不到数据库中当前操作的数据的,只有commit后,或退出该程序时,才能在数据库中查看到修改后的数据。

a)这是因为修改数据的时候是先有一个缓冲区,此时还没有修改到实际的数据,多以此时没用commit,而用rollback的时候,对缓冲区的修改代码将不被执行;此时就是起到出错数据回滚的操作

b)但是,当我们修改了数据没用到commit的时候,而是直接退出程序,此时数据库缓冲区中的修改代码也会被执行,也就是说,只要不用rollback,推车程序时数据也会被更改。

c)所以,当我们某个地方会出错需要数据回滚时,就要在那里进行rollback操作。

2.在数据窗口对象里设置显示值和实际值时,要注意:

当输出文档时任然使用的是实际值,显示值值是看的,没有实际意义。

1.在我们第一次装PDM时,装数据库的时候数据库是没有程序的内部用户的,所以一般是建一个空数据库,然后进行初始化,这样数据库就有了2个用户了,然后再将有数据的数据库还原上去,但此时该数据库也是没有用户的,就要给它授权,即映射,此时执行Grant的代码就是映射授权。

a)所以,当没有系统用户时,执行Grant是没有用的。

1.我们在pb中,事件是可以继承的,方法是不能继承的:

a)如果子对象中的该方法写了新代码,则调用时是执行新写的代码,如果子对象该方法中什么也没写,则会调用父对象的该方法

b)所以,可见继承是可以先执行父的再执行子的,方法是不行的

c)这个就叫做多态

1.因为标题名字是字段名字加_t,所以,在自定义字段时,设置字段名时不要有“_”.

1.一定要注意补丁包升级和数据库升级,补丁包升级是将我们的程序进行升级,而数据库升级是对数据库进行修改操作的升级。

a)二者不是一回事,都要进行操作。

b)我们要区分数据库版本和程序版本,两者要对应才能正常运行。

2.我们调试时用的动态库为PB文件夹下的动态库,程序运行时用的是Bin目录下的动态库,程序安装时用的也是Bin目录下的动态库,所以要清楚不同环境下的运行要求。

3.修改数据窗口对象的查询语句时,先剪切再添加,这样更能反映到当前PB中来。

4.在我们触发事件打开窗口的时候,一定要注意打开窗口和当前窗口的关系,如果他们是继承关系,则会报错的~!

5.在写SQL语句时注意where1=1的用法,我们开始就把这个写在一个变量中,当要增加条件时就直接加在后面。

从而不用担心where出现的位置问题。

在PB写代码时,不同的目标可以引用对方的库,所以我们编译时,先编译功能小的库,再编译功能齐全的库。

为什么呢?

比如:

我们目标1调用目标2的库1,在库1中调用了许多目标1中的其他库的对象,在编译时就会将这些联系都写在库1.pbd文件中,当编译目标2时也会重新生成库1.pbd,由于在目标2中没有库1中调用其他库的对象,因为目标2只是用到了库1中很小的一部分对象,这时编译并不会报错,所以重新生成的.pbd文件是不全的(一般发生在多个程序集成在一起的情况)。

所以,我们只能先编译功能小的目标,再编译功能大的目标。

防止相同库先后编译发生覆盖的错误。

1.记住,在分析代码的时候,要分功能模块来看,不要整体的来分析,那样会很复杂而且不容易想清楚,很容易乱。

a)分析每一小块的代码,知道他的作用和关联;最后将每个块联系起来串一边,就能晓得当前脚本的功能了。

b)有时候不一定要分析某个函数它内部是怎么操作的,只需要晓得它的返回结果,这样的函数就不用费劲的去分析代码了。

2.在我们的程序中是有版本的,当定义好了程序中的版本后,就要进行数据库升级,这个升级就会将版本信息存放到数据库中,只有程序的版本和数据库的版本一致时,才可以登录系统。

3.PB写的代码调试是要依赖与环境的,所以,当调试出问题时,就要把一些支持调试的.DLL文件拷贝到PB的安装目录下面去。

a)注意考入的.dll文件要和当前版本的程序相匹配,因为不同版本的程序里的.DLL文件是不一样的。

4.要注意区分程序运行的代码和程序安装的代码,两者是有区别的。

5.我们要注意本地数据源的连接,不是创建了数据源就可以能连的上去,同时也要为数据源指定数据库文件。

否则找不到数据。

6.我们在使用对象的各种类型变量时,一定要注意值的滞留问题,如有这种情况,则要在开头或结尾将其进行清空。

a)Eg:

当有一个数组il_partid[]时,开始我们循环找到了2个值,放在il_partid[1],il_partid[2]里面,完成了满足条件的查询。

b)但是当我们下一次检索时,只找到一个满足条件的值,放在了il_partid[1]里,此时我们查询时,则会出错,出现2个满足条件的值,因为我们值改变了il_partid[1],但是il_partid[2]上次查询结果的值仍然保留在,故会出错。

c)所以,我们在每次执行代码前就要清空:

il_partid[]=ll_empt[]

d)这样就避免了出错。

7.我们要清楚事件的触发和函数的调用,当我们不好用某个动作来触发某个自定义的事件代码时,我们可以将该事件放在另一个事件的结尾用trigger或post来触发自定义事件。

a)事件其实就是代码~!

8.注意:

在我们用if判断的时候,如果用=是表示判断,不是赋值,而用函数返回值判断时,是要执行该函数再判断的,所以,不要搞混了,要清楚什么时候执行,什么时候表示判断。

9.Modify基本可以修改数据窗口中所有的属性项。

10.我们要修改某对象的源时,可以将其Export导出源码,然后我们就杂源码的定义部分修改对象的属性。

要知道,我们对源直接修改就是修改对象的本身属性。

11.any要想知道Any类型变量中保存数据的类型,可以使用函数ClassName()

12.我们要连接多个数据库时,第一个数据库算是默认的,所以在我们用游标或select语句时都不用usingsqlca;不用就算是默认的。

a)所以,当用多个数据库时,检索数据的时候就要在查询的地方放用using语句,不然它算是连接到了默认的数据库,则会出错。

b)不管用哪个数据库都是要定义好数据源的,同时在代码中声明连接,这样才能得到数据。

(声明:

sqlca.odbc=;sqlca.code;……)

c)在应用对象中声明的是数据源参数的链接,因为数据源和数据库之间的关系在创建数据源的时候一般会定义好的。

d)所以链接数据库,可看做2个部分,一个是创建数据源,再个是链接数据源。

13.我们用自定义的数据窗口对象时,选择的是外部数据源,此时在画板界面上,是先定义字段的属性,再增加字段的。

1.要分清PB中对象和类的区别:

a)一般我们将windowmenutreeviewitem等就是“类”,专门作为一种数据类型来定义该类型的实例。

b)而我们继承是在原类的基础上创建一个新类。

c)New是创建新对象,不同与继承。

 

14.我们的PDM的代码包CODE一般包含2个文件夹:

a)Inte_pbr文件夹:

里面存放的是程序运行时需要的所有图片,但是加载图片进去还不够,它里面还有一个配置文件(INTEMAN.PBR;INTEPDM.PBR等),将每个图片的路径信息都写在了里面,只有这样程序才能完全找到使用。

b)这个文件夹要安装到C盘下面,这是程序指定的路径。

c)因为在代码中的编译对象中包含了这2个文件夹的路径,所以当编译完成后生成的.pbd文件就包含了2部分的内容。

d)当没编译只是运行代码时,这个包就要放在指定路径下了,不然运行时图片都不会显示出来。

15.另外一个就是我们代码的安装包了。

1.当你创建一个工作目标(.pbt)后,它会自动创建一个应用库(.pbl),我们创建和操作的对象就放在这个应用库下面。

2.层次结构:

—工作空间

—目标

—应用库(多个)

—对象(多个)

—目标(多个)

3.一般一个工作目标就是一个应用程序,就是说同一个目标下不同应用库中的对象是可以互相访问的。

4.同一目标下的不同库中的对象可以相同。

5.不管是同一目标还是不同目标或是不同的库中,我们都可以将有用的对象拷贝到指定的库中。

6.且一个工作目标里面只有一个应用库中有且只能有一个(应用对象)。

7.我们创建的全局变量,它是在整个目标(程序)中是有效的。

8.应用对象的属性一般具有全局性,所以要慎重设置。

9.我们在PB系统树中创建的对象可以看做是一个实例对象,直接拿出去用,也可以看做一个类,用它来创建新的对象,新的对象将有原对象的所有属性和事件、方法。

10.不同对象中的控件名可以相同,不同库中的对象名字可以相同,不同目标的库名也是可以相同的。

11.但是,在一个目标中,不要将库名中的对象名取一样的,这样会出错,因为同一目标下的对象是可以相互访问的。

 

1.在应用对象中设置事务对象的连接属性,与在DBprifile中添加DB是没有关联的。

2.当Return属于某个脚本时,就退出该脚本的运行,当它是某个脚本函数的代码时,则返回到调用该函数的位置。

3.我们要清楚每个函数在各种情况下的用法。

它是与控件连一起用的还是单独可以用的,最好根据函数的功能和意思来分辨。

4.我们要把形参当作实际的值来看待。

5.一定要注意每个函数的功能,以及他们之间的内在联系:

a)例如:

getfilesavename()

i.它是打开一个准备要保存的文件路径对话框,它返回路径名和文件名,除此之外不做其他的操作。

b)又如oleobject的saveas():

i.它是将文件保存到一个指定路径,当这个路径和getfilename()的路径不相符时或没有传递时,它就会报错而不能保存。

c)又如PB中的saveas()

i.它不关前面的getfilesavename(),它的功能就是打开保存对话框,保存到指定位置进行保存。

1.我们所用的对象其实就是一堆视图化的代码,当我们想要改变某个对象的属性或内容时,可以直接编辑他们的源代码:

Editsource.

2.当我们在定义函数时,规定了返回类型,则它会要求你返回一种类型。

所以,如果不想返回值,则在定义的时候在返回值上填(none)

1.我们用户定义事件其实分2种情况:

a)通过事件ID调用windows已经存在的事件。

此时各项参数都是设置好的,只需要设置名字。

b)将事件ID设置为(none),此时我们就可以自己设置事件的各项参数了,此时可以说才是真正的用户事件。

2.在pb中触发事件有2种方法:

a)通过我们手动的操作,来触发相应的事件。

b)通过TriggerEvent()或者Postevent()来触发。

i.Object.TriggerEvent(clicked!

)是立即触发用户指定的事件,在继续调用下面的事件,属于同步调用。

ii.Object.Postevent(clicked!

)是将用户指定的事件放置到指定控件事件队伍中的末尾,等所有的事件都完毕后再执行该指定事件,属于异步调用事件。

iii.Object.triggerevent(‘ue_delete’)当执行的是用户自定义的事件时,则要加上引号,而不是以感叹号结尾。

c)dw_department.eventtriggerue_delete()

d)w_main_frame.eventpostue_paint()

i.这是CB控件clicked事件的一段脚本。

ii.可见,ue_delete()是dw_department对象的事件,现在是放在CB的clicked事件中去触发dw_department对象的ue_delete()事件。

iii.可见,事件是属于对象的,所以前面要加限制。

1.他们通过ODBC连接的数据源时,在PB中是通过事务对象连接的ODBC的数据源,而在我们配置数据源时就定义好了要连接的数据库。

2.我们在PB中对数据进行的修改操作基本都是对缓冲区进行的。

3.我们要区别缓冲区的数据和数据窗口显示的数据,大多情况缓冲区会直接反应到数据窗口上,但要注意区分开来。

4.在pb中建的DBfile文件数据库,并不是使我们开发的应用与数据源连接,但是它将数据库直接反应到PB中来了,我们可以直接在这里对数据库进行操作,而不用跑去修改本身的数据库。

5.记住,我们用事务对象连接的是数据源,DBfile是数据库的显示。

6.所以,我们通过对DBfile的修改来直接对数据库进行修改。

7.我们连接一个DBfile只是可以对其进行操作,同时也必须要连,因为我们处理数据时要进行语法效验,如果不连的话在保存时会报错。

8.因为在我们没有运行代码时,代码中连接数据库的代码根本就没有执行,故没有连到数据库中,所以,进行语法效验时是根据DBfile中连接的数据库进行效验的。

所以,以后每次都要连上DBfile文件。

1.我们创建数据窗口对象时,会有标题名和内容名,内容名就是我们数据库表的字段名字,而标题名一般是表的字段名字加上“_t”,,但是这是对象的名字,我们还要给标题的每个对象设置文本内容。

2.别把对象的名字和存在的内容搞混了~~~!

 

1.用游标读取数据时,读取一行就要用sqlcode进行检查一边:

a)当为0时,这成功读取了当前的一条数据

b)当为-1时,读取错误

c)当为100时,则表示都读取完了

2.当使用游标和存储过程时,十分注意commit和rollback的使用,因为他们将关闭两者的使用。

3.只要是对象,一般都是可以继承的。

4.菜单的工具栏只能显示在MDI窗口中。

5.我们的全路径是目录\文件名。

6.所以目录是没有“\”的。

1.fileopen()

a)以指定的方式打开指定的(存在或不存在)文件,可读或可写

b)返回句柄

i.Fileopen(filepath,streammode!

write!

lockwrite!

replace!

此时表示,如果该路径文件已经存在,那么就覆盖该文件。

2.此时一定要注意:

a)当是以写的方式打开(write!

)时,它一定会重新创建一个空文件,如果路径已经存在,且有replace!

,那么该空文件就会覆盖指定文件。

b)如果路径不存在,那么就会创建新的指定空文件。

c)当是以读的方式打开时,它不会创建新的文件,而是让你指定要打开的文件。

d)当lockwrite!

时,你可以看该文件

e)当lockread!

时,你就不能看该文件了

 

OleObjectWord=CreateOLEObject

li_Ret=OleObjectWord.ConnectToObject("","word.application")

IFli_Ret<>0THEN

li_Ret=OleObjectWord.ConnectToNewObject("word.application")//没有打开则新建

ifli_Ret<>0then

MessageBox('OLE错误','OLE无法连接,错误ID:

'+string(li_Ret)+'可能是Word安装不正确!

')

endif

endif

OleObjectWord.Documents.Add()

此时,上面值是连接了操作的对象。

只有当OleObjectWord.Documents.Add()时才会打开一个新的文件。

此时它就会成为当前活动对象。

1.OleObjectWord.ConnectToObject("实例路径","指定的服务器应用程序")

a)也就是说:

实例路径,就是你要操作的文件全路径

b)服务器应用程序,就是支持文件的应用程序。

2.当我们没有实例路径时,它会对当前活动对象进行操作

3.当有实例路径时,它就对指定路径的文件进行操作。

4.OleObjectWord.ConnectTonewObject("指定的服务器应用程序")

1.创建新的对象并连接到该对象上。

此时就要注意了,它创建的应用对象是空的,也就是说它里面连空白都没有。

此时就要用OleObjectWord.Documents.Add()来增加操作空间。

1.Saveas()

既可用OLE对象,也可用于数据窗口对象

2者的用法不一样,具体情况具体分析。

用于数据窗口对象时,可以保存数据也可以保存统计图。

1.我们可以直接给一个表的字段定义主键,但是给表定义外键时,同时也要指出是对应的哪个表的主键。

2.先找主键,在去联系它的外键。

3.我们在调用外部函数前对其声明时,记住:

一个声明要写成一行。

functionintFileExpand(stringInputFile,stringOutputFile)library"intedll.dll"(一行)

subroutineFillMany(intserial_no,refstringpassword)library"intedll.dll"(一行)

1.我们的事件一般都是定义好的,当触发该事件的时候,就执行该事件中的脚本,我们是在脚本中写代码,调用函数。

2.当是继承对象后,它里面的事件和函数都会继承过去,且不可修改,当继续加代码时,它会先执行原有的代码,再执行新写的代码。

1.ifkeydown(keyenter!

)then

ifthis.text=""then

return

else

uo_ok.setfocus()

uo_ok.triggerevent(clicked!

endif

endif

可见,触发的按键以!

来区分

要出发事件时,也是用事件名+!

1.响应式窗口一般是提示且必须执行完才会继续执行的窗口,所以,当它的事件执行完时,我们在代码结尾用close()来关掉它。

2.要知道各种值的保存时间:

a)实例变量:

当实例对象关闭时,变量下次重置

b)全局变量:

当程序结束下次再开时重置。

3.注意事件的触发条件,如果不满足就给它加代码加以限制。

4.ifisnull(ls_newcode)ortrim(ls_newcode)=''ortrim(lower(ls_newcode))='null'thenls_newcode=''

a)注意判断为空的几种情况。

b)Null要加引号用。

1.注意用户对象的使用:

a)例如标准可视用户对象,它其实就是一个控件,但是我们使用它的时候它会在窗口界面创建属于该对象的控件,而不是对象本身。

所以,千万注意对象名和你创建的对象控件名字。

b)要理解这样就可以重复使用了。

2.注意可视对象和不可视对象引用的方法:

 

1.getitemstring()、getitemnumber()

a)它是得到数据窗口中(主缓冲区)某项的数据,注意类型

2.Setitem()

a)它是给数据窗口中(主缓冲区)的某项赋值,针对的是缓冲区的。

类型为Any类型。

3.Settext()

a)它是给浮动数据窗口赋值,而不反应到缓冲区里。

其值要与所在列类型相兼容。

4.当用setitem()赋值后,要反应到浮动数据窗口中,这要移动焦点或在代码中调用Accepttext()函数。

5.Accepttext()是将漂浮在数据窗口中的内容放到缓冲区里去。

(必须通过有效验证。

a)注意它的用法,当焦点从漂浮数据窗口中的一项移到另一项时,系统自动会将漂浮状态的数据反应到缓冲区。

b)但是,当焦点从当前漂浮数据窗口移到其他控件时,则漂浮数据是不会反应到缓冲区的,所以,我们一般在数据窗口的Losefocus()事件中用到此函数。

c)记住:

设置焦点一般是以对象为单位的。

d)不要在Itemchanged或ItemErrorevent中编写Acceptext()函数,因为Acceptext()函数有可能驱动ITPUB个人空间yI9FI3n

6.ItemChanged或ItemErrorevent,这将造成死循环的出现.

2iWm2j6o,Rt\#mm0GetText():

读取编辑控件的文字.

7.String(date,{fomate})

a)将数据以指定格式转换成字符串。

b)String(ll_id,’00’)

i.Ifll_id=1,returnll_id则ll_id=01

8.insertrow()

a)dw_1.insertrow(0)它是在最后一行后再插入一行。

b)dw_1.insertrow(row)是插入到第row行,就是在第row行前面再插入一行,也就变成了第row行了。

c)返回值是行号。

9.注意对象的继承层次:

a)当dw_2继承dw_1后,就有了它的所有事件和属性,而且,我们可以对dw_2中的事件和属性继续修改。

b)当dw_3继承了dw_2后,dw_3就有了dw_2和dw_1所有的事件和属性,此时用到dw_3时就会出现层次性,看见不同层次时的对象代码。

c)我们创建了的用户对象,将它丢到窗口中用时,其实就是一种继承,继承过来的对象就有原对象的所有事件和属性。

继承后的对象就是一个新的对象了。

1.数据窗口对象类型:

Grid时,它的列排列顺序是不能改的。

2.environmentle_env环境对象

getentironment(le_env)

用这个函数,应用程序能够得到当前运行的操作系统、使用的CPU类型、操作系统的版本、屏幕的大小和颜色数等信息。

成功返回1.

3.profilestring(文件名(包含路径),section,key,default)

a)section:

指定要得到值所在的节。

b)key:

指定要得到值的名称(理解值的名称,其实就是包含某个值的变量名)

c)default:

指定的文件、节名、项目不存在时,函数返回该参数指定的值。

d)成功返回指定的key值,错误返回default的默认值。

e)就是:

文件名,节名,值名,默认值

4.grouser=createu_user

ifNotIsValid(guo_user)then

haltclose

return

endif

可见,我们在创建用户对象时,最好是判断它是否创建成功,很容易找到错误。

 

1.getapplication()

a)得到当前应用对象的句柄,通过句柄来查询或修改应用对象的属性。

b)Applicationapp先定义一个应用的变量

App=getapplication()

App.toolbartips=false

c)也可以直接:

getapplication.toolbartips=false

d)可知,应用对象中修改工具栏属性和修改字体属性可以影响到全局窗口风格。

1.this.hide()

iuo_timer=createu_timer

guo_ge.uf_get_toolbar_profile("w_main_frame",this)

PostEvent("ue_open")

注意这段代码,这的窗口w_main_frame中open()事件的一段脚本。

A.其中,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 化学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1