PowerBuilder编程技巧十例

 

一、有关应用的编程技巧
仅让应用程序运行一次的技巧
有时需要限制一个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()函数确定应用程序同时运行的实例个数。
uintIApplHandle
intApp_num
IApplHandle=GetModuleHandle("c:/rem/rem.exe")
ifIApplHandle>0then
        App_num=GetModuleUsage(IApplHandle)
        ifApp_num>1then
        Messagebox("注意","本程序已经运行!",Stopsign!)        
        return
        endif
endif
Open(w_main)
若需要限制应用同时运行的实例个数,比如仅允许同时运行N个实例,那么将上述程序中的语句“ifApp_num>1then”改为“ifApp_num>Nthen”即可。
采用Handle()函数的方法更简洁一些,代码如下:
inthand
hand=Handle(this,TRUE)
Ifhand>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()代码如下:
ifst_help.visiblethenreturn
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
ifst_help.x+st_help.width>
w_main.Workspacewidth()then
        st_help.x=w_main.Workspacewidth()
-st_help.width
endif
ifst_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()的语句:
ifst_help.visiblethenHide(st_help)
show_help("瞧!这便是实时帮助条!")

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_rbuttonpopNewMenu
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事件应发生在所有数据窗操作之后;另外,在每次Retrieve后,应将处于该数据窗上的Focus移开,以免具有焦点的数据窗的第一行第一列总要显示,故在窗口w_datamon的Timer事件中设置了Setfocus(w_datamon)这条语句。

3、依据条件改变数据颜色

依据条件改变数据颜色是许多场合都要用到的重要功能,数据颜色的改变不仅引人注目,而且能起到暗示作用,清楚地告诉用户价位的涨跌或状态的改变等。大多数证券期货实时行情显示软件都提供了这种功能。在当前价位比其前一价位高时,当前价位数据颜色变红,表示价位上涨;反之,颜色变绿,表示价位下跌;若当前价位与其前一价位相等,则数据颜色不变。PowerBuilder没有提供解决这一问题的捷径,但我们仍可利用动态数据窗来实现。

先考虑一下实现的步骤,在Retrieve前需要把有关列的数据先保存起来;Retrieve后我们获得了相应列的新数据;我们需要将上述二者作一比较,以确定颜色的变化。值得指出的是,由于动态数据窗函数dwModify()只能用描述数据窗的模式串作参数,不能接收变量作参数,故我们得想法把比较的结果传递给数据窗。为解决这个问题,可以在定义数据窗时多定义几个空列,这几列不与数据库表中的列相对应,它们作为存放比较结果的缓冲区。原则上若需要N列实时地变色,则需要N列缓冲区,就应该多定义N个空列。下面给出了一个例子具体说明。

这段程序写在某窗口的Timer事件中,该窗口内有数据窗dw_infor,其"buy"、"sell"列分别表示买价和卖价,需要实时地变颜色。为此,我们在数据窗dw_infor中多定义了"buybuf"和"sellbuf"两列,分别存放"buy"列和"sell"列Retrieve前后数据比较的结果。

//Red=255;Green=65280
inti,infor_rownum
decimalbuy_old[],sell_old[],buy_new[],sell_new[]
dw_infor.SetRedraw(false)
infor_rownum=dw_infor.RowCount()
FORi=1TOinfor_rownum
        buy_old[i]=dw_infor.GetitemNumber(i,"buy")
        sell_old[i]=dw_infor.GetitemNumber(i,"sell")
NEXT
dw_infor.retrieve()
FORi=1TOinfor_rownum
        buy_new[i]=dw_infor.GetitemNumber(i,"buy")
        sell_new[i]=dw_infor.GetitemNumber(i,"sell")
NEXT
FORi=1TOinfor_rownum
        dw_infor.Setitem(i,"buybuf",buy_new
[i]-buy_old[i])
        dw_infor.Setitem(i,"sellbuf",sell_new
[i]-sell_old[i])
NEXT
dw_infor.dwModify("buy.color='0~tif(buybuf>0,255,if(buybuf
<0,65280,0))'")
dw_infor.dwmodify("sell.color="0~tif(sellbuf>0,255,if(sellbuf<
0,65280,0))'"
)dw_infor.setredraw(true)
我们看到,程序在Retrieve前后分别将"buy"和"sell";列的数据写进与其类型匹配的数组中,然后将比较的结果分别写入"buybuf"和"sellbuf"列,最后用函数dwModify()改变有关列的颜色。

记住在该窗口的Open事件中设置事务对象并激活Timer事件。

此外,还有一些方法可以改变颜色,比如先在某些需要变颜色的行或列设置带颜色的长方形,同时将其上面的数据窗中的数据设置成透明的,当条件改变时,可以通过改变数据窗后的长方形的颜色来实现。

4、用Enter键替代Tab键切换栏目的数据窗

许多情况下,PowerBuilder应用的数据是通过数据窗输入的,而且输入的数据是单纯的数字数据,也就是说,输入内容完全可以通过敲击键盘右面的数字小键盘来完成。但在实际使用中,数据窗栏目间的切换却要通过按键盘最左边的Tab键来实现,既不方便又影响录入速度。如果能用Enter键替代Tab键切换栏目就好了。

由于按Enter键是Windows直接支持的消息,故我们可以使用用户事件来解决问题。在用户事件中,PowerBuilder提供的一条pbm_事件对应Windows的一条或几条消息。我们在数据窗dw_datamon的用户事件中选择pbm_dwnProcessEnter并命名为Enterkeydown。在该事件下写代码:

Send(Handle(this),256,9,Long(0,0))
This.SetActionCode(1)
这将把消息传递给Tab键,同时忽略Enter键的处理。

下面是一段用数据窗接收数据的完整的程序段,其中采用了用Enter键替代Tab键的代码。当光标在每行最后一列时按Enter键,光标会移至下一行第一列;当光标在最后一行的最后一列时按Enter键,会自动产生新行并将光标置于该行的第一列;在其它情况下按Enter键,光标会移至当前行的下一列。这段程序仍然写在与pbm_dwn ProcessEnter相对应的用户事件Enterkeydown下: 

IF This.AcceptText()<0 then 

this.setactioncode(1) return 

endif 

if this.getcolumn()=Long(This.DwDescribe("datawindow.column.count")) then 

if this.getrow()=This.RowCount() then 

this.insertrow(0) 

this.scrolltorow(this.getrow()+1) 

this.setcolumn(1) 

this.setactioncode(1) 

return 

endif 

endif 

send(handle(this),256,9,long(0,0)) 

this.setactioncode(1) 

5、数据从文本文件写入数据库表的捷径

许多情况下,文本文件中的数据排列顺序与数据库表中列的顺序一致,并且其数据类型与数据库表中对应列的一致,要做的就是将该文件中的内容存入对应数据库表中。例如在点对点通讯的情况下,一方把数据库表中的数据以文本文件格式存储并传送给另一方,另一方要做的工作就是将收到的数据存入相同的数据库表中。PowerBuilder有多种方式与文本文件打交道,比如使用ODBC的文本文件驱动器、采用DDE(动态数据交换)方式、采用OLE方式或使用Cursor将文本文件逐行逐列读取并写入数据库表等。但在这种情况下,还有一种更快捷的方法:使用ImportFile()函数将文本文件内容直接倒入数据库表中。该函数用法为: datawindowname.ImportFile(filename{,startrow{,endrow& {,startcolumn{,endcolumn{,dwstartcolumn}}}}}) ImportFile()函数要求数据窗列的数据类型和列的排列顺序必须与文本文件中的数据相匹配。在存储文本文件时要注意接收数据库对表的格式要求,比如在SYBASE中,表格的列与列间是采用Tab键区分的,所以如果要用ImportFile()函数将文件内容写入SYBASE表中,就要将相应文本文件的列与列间加入Tab键——这在文件形成时即可加入。下面的代码将文件infor.txt写入数据窗dw_infor,并将与dw_infor对应的数据库表更新: 

int impt 

if (FileLength("c:/data/infor.txt")>0) then 

impt=dw_infor.ImportFile("c:/data/infor.txt") 

if impt>0 then 

dw_infor.settrans(sqlca)

update(dw_infor)

commit;

If sqlca.sqlcode=-1 then 

messagebox("SQLERROR",sqlca.sqlerrtext) 

endif 

else 

messagebox("注意","文件infor.txt写入失败!") 

endif 

endif

 此外,ImportFile()函数还支持从文本文件的指定开始行列到结束行列读取并写入数据;并且支持.dbf(dBase)文件的读写,这给原有台式数据库数据文件向新的分布式数据库表中转换带来了极大的方便。

五、有关文件输出的编程技巧 

1、打印前的模拟显示的编程技巧

在制作完一段文档或表格后,我们在正式打印输出前总希望看一下模拟显示的效果,看看是否需要调整打印参数等。笔者在调试一个标签打印程序时就遇到了这个问题,标签文档的输出格式正确与否、标签间的横竖间距恰当与否等均可通过模拟显示直观地看到。总之,我们需要打印前的模拟显示。单纯写一段模拟显示程序并不难,但多思考一下往往能找到好方法。在文件读写时需要有文件号、在用Socket编程时涉及到Socket号,同样,多任务的操作系统管理进程时也采用了进程号——显然,整个软件系统都是采用一些数据类型为整型的变量来管理它要处理的逻辑对象的。一台打印机有它的逻辑文件名,在操作系统看来,它和磁盘上的一个文本文件没有两样。这样,向打印机输出与向磁盘文件输出就统一起来了,我们就依据这个想法来写模拟显示程序。大家知道,打印机的逻辑名是"PRN",我们可以对此作与磁盘文件相同的处理。下面的程序可写于按钮cb_print的Click事件下: 

int retn,fileno 

string filename,write_string 

retn=Messagebox("提示","输出至打印机选,~r~n模拟显示(c:/simulate.txt)选,~r~n取消选! " ,Information!,YesNoCancel!,1) Choose Case retn 

Case 1 

  sle_help.text="请准备好打印机!" filename="PRN" 

Case 2 

  filename="c:/simulate.txt

Case else 

 Return 

End Choose 

fileno=FileOpen(filename,linemode!,write!,lockwrite!,replace!) 

if fileno=-1 then 

  Messagebox("警告","设备文件<打印机>打开失败!",information!,ok!) 

  Return 

endif 

write_string="打印前的模拟显示!" 

FileWrite(fileno,write_string) 

FileClose(fileno) 

if Upper(filename)="PRN" then 

sle_help.text="文件打印完毕!" 

else 

Run("Notepad.exec:/simulate.txt",maximized!) 

sle_help.text="模拟显示文件输出完毕!" 

endif 

这样,当需要模拟显示时,write_string被送往磁盘文件c:/simulate.txt,并调用Notepad将其显示出来;当需要打印时,write_string被送往打印机。六、结语写作本文不仅想与读者交流编程技巧,还希望向读者提供一些有用的思路。PowerBuilder不仅支持ODBC,而且支持MAPI,是企业级信息管理系统和Intranet应用开发的强大工具。笔者深信,PowerBuilder的应用范围将更加广泛,随着应用的深化,必定会涌现出更多优秀的PowerBuilder应用,并将在各行各业充分发挥作用。

pb案例开发集锦,适合初学者学习,有经验也可以看看,里头有很多巧妙的应用。我在这里列出所有的目录。 源程序使用说明一、功能 本光碟中提供了与图书完全一致的程序源代码和编译好的可执行文件,读者可以直接执行这些可执行文件,以便更加直观的体会案例运行的效果;如果想进一步研究案例的源代码,可以将相应文件夹下的文件在PowerBuilder10.0开发环境中打开,然后编译运行。二、内容 本光碟中包含图书中的每个案例的源代码、可执行文件和所有资源文件,具体组织结构如下: 第1章 窗体与控件 案例1 创建应用、窗口与控件 案例2 目录浏览器 案例3 文件浏览器 案例4 图片浏览器 案例5 用户密码验证 案例6 等待窗口 案例7 使用滚动条 案例8 使用进度条 案例9 电子时钟 案例10 修改系统时间 案例11 颜色对话框 案例12 IP地址编辑框 案例13 人民币大小写金额的转换 第2章 菜单与MDI窗口 案例1 创建窗口菜单 案例2 带底图的MDI窗口 案例3 带浮动图标的工具栏 案例4 隐藏和显示任务栏 案例5 右键菜单 案例6 调用HtmlHelp文件 案例7 动态打开窗口 案例8 记事本 第3章 数据处理基础 案例1 创建数据库 案例2 设置表格颜色 案例3 比例图显示数据 案例4 动态设置数据窗口风格 案例5 使用选项卡 案例6 使用下拉子数据窗口 案例7 动态设立数据窗口 案例8 在窗口中编辑数据 案例9 学生学号排序 案例10 数据窗口排序 案例11 利用DataStore共享数据 案例12 关联与条件查询 案例13 数据查询 案例14 模糊查询 案例15 键盘模拟器 案例16 将数据保存到Word文件中 案例17 将数据保存到Excel文件中 第4章 数据库高级操作 案例1 定义数据窗口的检索参数 案例2 窗口之间传递函数 案例3 在SQL查询中使用变量 案例4 在Grid类型报表的Header区增加文字标题 案例5 使用动态SQL查询数据 案例6 两种不同查询方法的比较 案例7 外部数据源窗口的使用 案例8 更新由多个表生成的数据窗口 案例9 把数据窗口信息存为Html格式文件 案例10 数据窗口查询模式的应用 案例11 数据窗口的树形视图表示 案例12 数据窗口中实现字段的组合 案例13 数据窗口中的数据共享 第5章 网络与通信 案例1 Ping指定IP地址范围内的计算机 案例2 实现串口通信 案例3 制作收发电子邮件程序 案例4 使用组件收发电子邮件 案例5 Web服务器程序 案例6 调用WinFax发送传真 案例7 超级链接的制作 案例8 使用超级链接控件 案例9 获取本机名和IP地址 案例10 使用多线程下载网页 案例11 Socket通信客户端 案例12 Socket通信服务器端 案例13 FTP客户程序 第6章 API函数的应用 案例1 使用API函数实现透明窗体 案例2 制作位图菜单 案例3 控制窗口 案例4 获得系统信息 案例5 创建文件和目录 案例6 显示和设置时间 第7章 报表打印 案例1 报表打印预览 案例2 报表的打印 案例3 数据窗口的预览和打印实现 案例4 使用混合编程实现打印控制 案例5 使用PowerPrinter动态链接库实现打印扩展 案例6 数据窗口的打印 第8章 多媒体与图形 案例1 播放Gif动画 案例2 播放Flash动画 案例3 播放AVl文件 案例4 可连续播放的音乐播放器 案例5 带记忆的MP3播放器 案例6 播放WAV 案例7 播放指定的AVI-MID-WAV文件 案例8 CD播放器 案例9 播放光驱内所有VCD节目 案例10 生肖查询 案例11 位图动画 案例12 浏览大幅BMP图片 案例13 利用Picture制作小动画 案例14 制作屏幕保护程序 案例15 设计滚动字幕 案例16 制作动画光标 第9章 文件与系统 案例1 判断驱动器属性 案例2 清空回收站 案例3 使应用程序窗口总在最顶层 案例4 将程序设置成自动执行的程序 案例5 控制光驱的弹开与关闭 案例6 修改显示器像素色值 案例7 获得应用程序的当前路径 案例8 获取磁盘序列号 案例9 在程序中启动ODBC数据源管理器 案例10 实现定时关闭计算机 第10章 其他技巧与应用 案例1 Windows窗口的枚举 案例2 多线程的实现 案例3 使用PB获得CPU的速度、型号和生产商 案例4 磁盘格式化的实现 第11章 综合应用案例 案例1 库存管理系统 案例2 C/S应用程序设计案例――工资管理 案例3 B/S应用程序举例―――简单链接与查询 三、运行环境 系统环境:Windows XP/Intel P4/1.7G/256M 开发工具:PowerBuilder10.0+Power Dynamo3.6 IIS信息服务器:Internet Information Server 5.0 数据库系统:Adaptive Server Anywhere 8.0 网页设计工具:FrontPage 2000四、注意事项 1、运行本书涉及数据库的实例时,必须设置数据库连接,关于数据库连接的设置在本书"第3章 案例1"有详细说明。读者自己配置数据库,运行前必须重新设置路径。所有使用到的数据库文件都在光盘根目录下“数据库”文件夹内,请根据本机有关设置重新定位源代码相关设置。数据库有问题的请仔细调试,详细情况看设置。 2、界面设置图片的实例必须重新设置图片路径,大部分图片在在本例目录下,读者也可以自行选择图片。许多实例运行后的界面没有图片,与书稿中的图不一致,请仔细检查是否是源代码中的路径的问题,是否是因为用的绝对路径的问题。 3、少数几个程序需要特殊的设置,特别是客户服务器结构的应用程序,请参看书中的具体设置。 4、少数程序可执行文件出现问题可生成EXE+PBD模式,问题就可以解决!光盘中例程出现的问题:FAQ:第2章 案例2 无图,运行前必须重新设置路径第5章 案例1 Ping不了只有单独连接因特网正常运行,通过局域网、宽带等连接因特网(或曾经连接过局域网),IP地址已经多次改变,不符合PING的原理。第5章实例4 不能建立邮件列表需要设置端口、服务器参数等第5章实例8 无图,运行前必须重新设置路径
配套光盘使用说明 (1) 本光盘是《PowerBuilder数据库开发经典案例解析》的配套光盘,与图书一起发行,不得单独出售。 (2) 本光盘的主要内容包括各章示例程序的代码数据库文件。光盘的说明文件为Readme.txt,就是本文件。 (3) 示例程序是按照它们出现的章顺序编排的。 (4) 光盘上的示例程序都是在PowerBuilder 9.0和SQL Server 2000个人版下调试通过的,不同的版本可能存在差别。另外,使用的操作系统是Microsoft Windows 2000(Professional,Server),原则上,操作系统对程序没有影响,不过,作者没有在其他操作系统平台上调试这些程序。在配套光盘上,作者提供了示例程序的源代码。另外需要注意的是,作者建议读者重新编译所有示例程序,进而熟悉它们的结构和基本功能。 (5) 要运行本光盘各章节“代码”目录下的程序,需要安装SQL Server 2000,并建立起相应数据库。各个实例的数据库文件存放在相应“建库脚本”目录下,有两种方法建立数据库。一是在SQL Server的企业管理器中点击“数据库”右键,单击【所有任务】|【附加数据库】菜单命令,选择相应的数据库文件(扩展名为mdf),单击确定按钮就可以了;另一种方法是通过SQL Server的企业管理器的恢复数据库功能,从数据库备份文件恢复,备份文件的扩展名为bak。 建立数据库后需要建立ODBC连接到数据库,建立的方法可以参考图书第一章1.6.4小节中的小知识。第一章程序通过INI文件直接连接数据库,后面各个实例对应的ODBC数据源名称分别为:hrmlink、mrplink、caiwulink、liblink、hotellink、hislink和eislink。 (6) 如果安装了PowerBuilder 9.0,则不需要安装其他软件,否则需要单独拷贝“运行程序所需文件”目录下DLL文件到“C:\WINNT\SYSTEM32”下面。 (7) 第五章至第八章实例运行前,需要拷贝相应的“ICON目录”到该实例运行的目录底下,完成第(5),第(6)和第(7)点后,实例程序就可以正确运行了。 (8) 光盘的所有文件都被默认地设置为只读文件,而所有程序在重新编译时都必须重新创建这些文件,所以在重新编译之前必须将所有文件修改为可写。 (9) 本光盘上所有程序都只供学习之用,未经作者许可,它们不得用于任何商业目的。 (10) 清华大学出版社几位编辑同志在本光盘的出版过程中付出了辛勤劳动,他们对本光盘的出版给予支持,在此对他们的工作表示感谢! 由于时间仓促,光盘中示例程序出现错误在所难免。发现其中的问题后,如果方便,麻烦读者告知作者。另外,如果您要对本书内容的修改提出建议,也麻烦您告知作者(email:ilikeit@126.com)。 谢谢使用本光盘! 作者 2004.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值