PB培訓(xùn)教程(提高篇)課件_第1頁
PB培訓(xùn)教程(提高篇)課件_第2頁
PB培訓(xùn)教程(提高篇)課件_第3頁
PB培訓(xùn)教程(提高篇)課件_第4頁
PB培訓(xùn)教程(提高篇)課件_第5頁
已閱讀5頁,還剩109頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

PB培訓(xùn)教程(提高篇)PB培訓(xùn)教程(提高篇)1前言本教程的內(nèi)容第一章PB的發(fā)展第二章數(shù)據(jù)窗口第三章調(diào)試及跟蹤第四章編碼規(guī)范第五章輔助工具本教程適合的人群對(duì)PB有基礎(chǔ)概念有一定的開發(fā)經(jīng)驗(yàn)樂于分享、學(xué)習(xí)、提高前言本教程的內(nèi)容2第一章PB的發(fā)展本章內(nèi)容PB6新特性PB7新特性PB8新特性PB9新特性PB10新特性第一章PB的發(fā)展本章內(nèi)容3PB的發(fā)展-PB6新特性PB6新特性整體性能增強(qiáng)Internet增強(qiáng)分布式計(jì)算增強(qiáng)開發(fā)效率的增強(qiáng)擴(kuò)展的多種語言支持交叉平臺(tái)支持PowerScript語言增強(qiáng)數(shù)據(jù)窗口增強(qiáng)數(shù)據(jù)庫連接增強(qiáng)OLE增強(qiáng)應(yīng)用程序發(fā)行方面的增強(qiáng)其他增強(qiáng)參見《PowerBuilder6.0開發(fā)人員指南》PB的發(fā)展-PB6新特性PB6新特性4PB的發(fā)展-PB7新特性PB7新特性嶄新的用戶界面和開發(fā)方法組件開發(fā)和部署方面的新特性數(shù)據(jù)連接方面的新特性其他新穎的特性參見《PowerBuilder7參考手冊(cè)》PB的發(fā)展-PB7新特性PB7新特性5PB的發(fā)展-PB8新特性PB8新特性用戶界面Web功能數(shù)據(jù)窗口新特性EAServer的集成數(shù)據(jù)庫連接PowerScript新特性進(jìn)一步提高的易用性和其他增強(qiáng)特性參見《PowerBuilder8參考手冊(cè)》PB的發(fā)展-PB8新特性PB8新特性6PB的發(fā)展-PB9新特性PB9新特性先進(jìn)的4GLPLUS基礎(chǔ)多樣的適用性利用集成開發(fā)與設(shè)計(jì)獲得優(yōu)異的成果不斷增加的強(qiáng)大功能參見《創(chuàng)造最佳的開發(fā)環(huán)境-SybasePowerBuilder9.0》PB的發(fā)展-PB9新特性PB9新特性7PB的發(fā)展-PB10新特性PB10新特性集成PowerDesignerXMLWebDataWindowDataWindow.NETUnicodesupport新的控件各式各樣的變化數(shù)據(jù)連接的改變參見PowerBuilder10新特性PB的發(fā)展-PB10新特性PB10新特性8第二章數(shù)據(jù)窗口本章內(nèi)容常見問題函數(shù)和事件緩沖區(qū)狀態(tài)位并發(fā)控制數(shù)據(jù)拷貝小技巧第二章數(shù)據(jù)窗口本章內(nèi)容9數(shù)據(jù)窗口-常見問題數(shù)據(jù)窗口-常見問題10數(shù)據(jù)窗口-函數(shù)和事件DataWindowAcceptTextDeleteRowClickedRowcountDoubleClikcedGetItemDateetcGetRowInsertRowConstructorResetRetrieveSetItemSortUpdate……EditChangedErrorItemChangedSQLPreview……數(shù)據(jù)窗口-函數(shù)和事件DataWindowAcceptText11數(shù)據(jù)窗口-緩沖區(qū)1存放填充窗口中DataWindow控件中數(shù)據(jù)的,調(diào)用DataWindow的Retrieve()函數(shù)和InsertRow()函數(shù)可以將數(shù)據(jù)填入這個(gè)緩沖區(qū)中

存儲(chǔ)的是從OriginalBuffer使用Filter()函數(shù)過濾到PrimaryBuffer中后剩余的記錄

保存的是用DeleteRow()函數(shù)從PrimaryBuffer中刪除的記錄存儲(chǔ)的是DataWindow最初執(zhí)行retrieve()函數(shù)時(shí)得到的全部記錄DataWindow主緩沖區(qū)PrimaryBuffer過濾緩沖區(qū)FilterBuffer刪除緩沖區(qū)Deletebuffer原始緩沖區(qū)OriginalBufferFilterDeleteRowInsertRowRetrieveRetrieveDataWindow有四個(gè)緩沖區(qū)數(shù)據(jù)窗口-緩沖區(qū)1存放填充窗口中DataWindow控件中數(shù)12數(shù)據(jù)窗口-緩沖區(qū)2dw_1.object.xh[1]獲取數(shù)據(jù)窗口的主緩沖區(qū)的第一行的xh列的值dw_1.SetItem(1,’ghdw’,’浙江聯(lián)眾’)為數(shù)據(jù)窗口主緩沖區(qū)的第一行的ghdw列賦值dw_1.object.xh.filter[1]獲取數(shù)據(jù)窗口過濾緩沖區(qū)的第一行的xh列的值dw_1.object.data.primary.current訪問主緩沖區(qū)dw_1.object.data.primary.original訪問原始緩沖區(qū)dw_1.object.data.filter.current訪問過濾緩沖區(qū)dw_1.object.data.delete.current訪問刪除緩沖區(qū)緩沖區(qū)的訪問數(shù)據(jù)窗口-緩沖區(qū)2dw_1.object.xh[1]緩沖區(qū)的13數(shù)據(jù)窗口-緩沖區(qū)3函數(shù)描述Retrieve將數(shù)據(jù)從數(shù)據(jù)庫檢索到主緩沖區(qū)、原始值緩沖區(qū)Update訪問原始值緩沖區(qū)、主緩沖區(qū)和刪除緩沖區(qū)InsertRow在主緩沖區(qū)中插入一行數(shù)據(jù)DeleteRow從主緩沖區(qū)刪除一行數(shù)據(jù),并將數(shù)據(jù)移動(dòng)到刪除緩沖區(qū)Filter把數(shù)據(jù)從主緩沖區(qū)移到過濾緩沖區(qū)Reset把所有緩沖區(qū)中的全部數(shù)據(jù)行清除RowsMove把數(shù)據(jù)從一個(gè)緩沖區(qū)移到另一個(gè)緩沖區(qū)RowsCopy把數(shù)據(jù)從一個(gè)緩沖區(qū)復(fù)制到另一個(gè)緩沖區(qū)RowCount返回主緩沖區(qū)中的數(shù)據(jù)行的數(shù)目ModifiedCount返回?cái)?shù)據(jù)窗口中(包括過濾緩沖區(qū)和主緩沖區(qū))修改的數(shù)據(jù)行數(shù)FilteredCount返回過濾緩沖區(qū)中的數(shù)據(jù)行的數(shù)目DeletedCount返回刪除緩沖區(qū)中的數(shù)據(jù)行的數(shù)目Resetupdate清除數(shù)據(jù)窗口的主緩沖區(qū)、過濾緩沖區(qū)的更新標(biāo)志,并清除刪除緩沖區(qū)函數(shù)使用與緩沖區(qū)的變化數(shù)據(jù)窗口-緩沖區(qū)3函數(shù)描述Retrieve將數(shù)據(jù)14Demo1Demo1演示DataWindow的四個(gè)緩存區(qū)DEMODemo1Demo1DEMO15數(shù)據(jù)窗口-狀態(tài)位1數(shù)據(jù)窗口的四種狀態(tài)位

NotModified

該行或行的值為查詢所得,沒有發(fā)生改變

DataModified

該行或列的值為查詢所得,發(fā)生了改變

New

該行或列為一插入的新行,數(shù)據(jù)沒有發(fā)生改變(數(shù)據(jù)為空或缺省值)

NewModified

該行或列為一插入的新行,數(shù)據(jù)發(fā)生改變,改變是通過用戶鍵盤輸入或調(diào)用了SetItem()函數(shù)

數(shù)據(jù)窗口-狀態(tài)位1數(shù)據(jù)窗口的四種狀態(tài)位16數(shù)據(jù)窗口-狀態(tài)位2獲取數(shù)據(jù)窗口的行的狀態(tài) GetItemStatus(row,column,Dwbuffer) 返回值:枚舉類型dwItemStatus New! NewModified! NotModified! DataModified!

例:下面的代碼返回主緩沖區(qū)第一行的ghdw列的狀態(tài) DwItemStatuesl_status l_status=dw_1.GetItemStatus(1,0,Primary!)

數(shù)據(jù)窗口-狀態(tài)位2獲取數(shù)據(jù)窗口的行的狀態(tài)17數(shù)據(jù)窗口-狀態(tài)位3設(shè)置數(shù)據(jù)窗口的狀態(tài)位 SetItemStatus(row,column,Dwbuffer,status)

例:下面的代碼設(shè)置主緩沖區(qū)第一行的ghdw列的狀態(tài)為NotModified!

dw_1.SetItemStatus(1,’ghdw’,Primary!,NotModified!)

注:并不是所有的狀態(tài)都可以設(shè)置成功!滿足下面規(guī)則數(shù)據(jù)窗口-狀態(tài)位3設(shè)置數(shù)據(jù)窗口的狀態(tài)位18Demo2Demo2演示DataWindow的四種狀態(tài)位DEMODemo2Demo2DEMO19數(shù)據(jù)窗口-并發(fā)控制1并發(fā)控制

指多用戶在同一時(shí)間對(duì)相同數(shù)據(jù)同時(shí)訪問的能力,一般的關(guān)系數(shù)據(jù)庫都具有并發(fā)控制的能力,PB中用DataWindow的設(shè)置來進(jìn)行并發(fā)控制

并發(fā)控制區(qū)域數(shù)據(jù)窗口-并發(fā)控制1并發(fā)控制并發(fā)控制區(qū)域20數(shù)據(jù)窗口-并發(fā)控制2WhereClauseforUpdate/Delete

1>選項(xiàng)“KeyColumns”

比較更新前后Table的關(guān)鍵字是否發(fā)生了變化,即當(dāng)前數(shù)據(jù)庫中關(guān)鍵字的實(shí)際值和最初查詢的值做比較,如果沒有改變,則可以更新,反之不能更新

因?yàn)殛P(guān)鍵字xh=1沒有發(fā)生變化,Where條件成立,更新成功!但沒有達(dá)到并發(fā)控制的目的!

示例:修改序號(hào)為1的入庫單的金額改為3000(原金額為2000)Updatewz_rkdSetje=3000wherexh=1;數(shù)據(jù)窗口-并發(fā)控制2WhereClauseforUpd21數(shù)據(jù)窗口-并發(fā)控制3WhereClauseforUpdate/Delete2>選項(xiàng)“KeyandUpdateableColumn”

比較更新前后Table的關(guān)鍵字和可修改(更新)的列值是否發(fā)生了變化,如果沒有一項(xiàng)發(fā)生改變,更新成功;反之,若數(shù)據(jù)庫中當(dāng)前值中若任一項(xiàng)與數(shù)據(jù)窗口最初檢索出的值不一致,則更新失敗

示例:修改序號(hào)為1的入庫單的金額改為3000(原金額為2000,假設(shè)所有列都是可更新的)Updatewz_rkdSetje=3000

wherexh=1andfsdm=‘采購入庫’andghdw=‘浙江聯(lián)眾’andje=2000andbz=‘’;數(shù)據(jù)窗口-并發(fā)控制3WhereClauseforUpd22數(shù)據(jù)窗口-并發(fā)控制4WhereClauseforUpdate/Delete2>選項(xiàng)“KeyandUpdateableColumn”

上例中,假設(shè)在A用戶修改的同時(shí),B用戶將可修改列之一je的值由2000變?yōu)榱说?500,where條件不成立,因此更新失敗,并彈出出錯(cuò)信息如下數(shù)據(jù)窗口-并發(fā)控制4WhereClauseforUpd23數(shù)據(jù)窗口-并發(fā)控制5WhereClauseforUpdate/Delete

3>選項(xiàng)“KeyandModifiedColumns”

比較更新前后Table的關(guān)鍵字和要修改(更新)的列值是否發(fā)生了變化,如果沒有改變,更新成功,反之更新失敗。對(duì)于本例,即判斷關(guān)鍵字xh和將要修改字段je是否發(fā)生變化 上例中可修改(更新)列之一je的值經(jīng)修改存盤后,已由2000變成了當(dāng)前的2500,where條件不成立,因此更新失敗,但是,如果改變了其他字段的值,比如ghdw,此更新能夠成功示例:修改序號(hào)為1的入庫單的金額改為3000(原金額為2000)Updatewz_rkdSetje=3000wherexh=1andje=2000;數(shù)據(jù)窗口-并發(fā)控制5WhereClauseforUpd24數(shù)據(jù)窗口-并發(fā)控制6并發(fā)控制總結(jié)KeyColumns該選項(xiàng)在控制數(shù)據(jù)完整性方面最弱,它所允許的并發(fā)操作是最多的,所禁止的并發(fā)操作發(fā)生的可能性非常小,只有當(dāng)主鍵被更改后才起并發(fā)控制作用,當(dāng)一條記錄的關(guān)鍵字改變了才進(jìn)行控制,這顯然沒有多大意義。實(shí)際上這種方法一般只在單機(jī)版的應(yīng)用程序中使用,而在C/S模式中是很少使用的KeyandUpdateableColumns該選項(xiàng)是PB的默認(rèn)選項(xiàng),控制最為嚴(yán)格,可以實(shí)現(xiàn)最安全的并發(fā)控制,充分保證數(shù)據(jù)的完整性,但它也會(huì)禁止我們做一些本當(dāng)允許的并發(fā)修改,是并發(fā)能力最差的方法KeyandModifiedColumns該選項(xiàng)可以說是前兩者的折衷,在控制數(shù)據(jù)完整性和嚴(yán)格性方面比第一項(xiàng)強(qiáng),比第二項(xiàng)弱,在允許的并發(fā)操作數(shù)量方面比第一項(xiàng)少,比第二項(xiàng)多數(shù)據(jù)窗口-并發(fā)控制6并發(fā)控制總結(jié)25數(shù)據(jù)窗口-并發(fā)控制7數(shù)據(jù)窗口Update其他屬性KeyModificationUseDeletethenInsert數(shù)據(jù)行先被刪除,然后,重新插入新的數(shù)據(jù)行注意:這個(gè)選項(xiàng)要求用戶選擇從數(shù)據(jù)庫檢索出所有的列UseUpdate直接修改數(shù)據(jù)行UnigueKeyColumn修改時(shí)唯一鍵IdentityColumns標(biāo)識(shí)列,由DBMS自動(dòng)產(chǎn)生的流水號(hào)列,如果選中該列,不能修改該列數(shù)據(jù)窗口-并發(fā)控制7數(shù)據(jù)窗口Update其他屬性26Demo3Demo3演示DataWindow的并發(fā)控制DEMODemo3Demo3DEMO27數(shù)據(jù)窗口-并發(fā)控制8數(shù)據(jù)窗口的Update函數(shù)與狀態(tài)位的關(guān)系

在實(shí)際中,經(jīng)常需要在一個(gè)事務(wù)中同時(shí)更新主數(shù)據(jù)窗口和明細(xì)數(shù)據(jù)窗口,例如,同時(shí)更新入庫單和入庫單明細(xì)兩個(gè)數(shù)據(jù)窗口時(shí),經(jīng)常會(huì)寫下面的語句:Ifdw_rkd.Update(True,false)=1thenIfdw_rkdmx.Update(True,false)=1then

dw_rkd.ResetUpdate()dw_rkdmx.ResetUpdate()Commit;ElseRollback;EndIfEndIf數(shù)據(jù)窗口-并發(fā)控制8數(shù)據(jù)窗口的Update函數(shù)與狀態(tài)位的關(guān)系28數(shù)據(jù)窗口-并發(fā)控制9Update(Boolean,Boolean)的參數(shù)第一個(gè)參數(shù)Boolean,指定Update之前是否自動(dòng)執(zhí)行AcceptText函數(shù),True表示自動(dòng)執(zhí)行(缺省值)第二個(gè)參數(shù)Boolean,指定更新數(shù)據(jù)庫之后是否自動(dòng)復(fù)位更新標(biāo)志,True表示自動(dòng)復(fù)位更新標(biāo)志若第二個(gè)參數(shù)設(shè)置成False,必須調(diào)用ResetUpdate()清除更新標(biāo)志Resetupdate()函數(shù)清除數(shù)據(jù)窗口的主緩沖區(qū)、過濾緩沖區(qū)的更新標(biāo)志,并清空刪除緩沖區(qū)數(shù)據(jù)窗口-并發(fā)控制9Update(Boolean,Bool29Demo4Demo4演示DataWindow的Update函數(shù)Demo4Demo430數(shù)據(jù)窗口-數(shù)據(jù)拷貝PB提供的幾種數(shù)據(jù)拷貝方法的比較方法優(yōu)勢(shì)缺陷及限制Rowscopy單行/多行數(shù)據(jù)copy性能一般字段名稱、個(gè)數(shù)、順序要求完全相同(順序?)GetFullstatusSetFullstatus數(shù)據(jù)和狀態(tài)全部copy,性能較好無Dataobject.data單行和多行copy性能一般字段名稱、個(gè)數(shù)、順序要求完全相同ShareData不是copy,只是數(shù)據(jù)共享,性能最好,字段要求完全相同ImportString(Text)可以從文本字符串中導(dǎo)入性能一般字段名稱、個(gè)數(shù)、順序要求完全相同ImportString(XML)字段個(gè)數(shù)、順序可以不相同PB9.0及以上版本才提供雖然字段個(gè)數(shù)、順序可以不相同,但要求指定導(dǎo)入導(dǎo)出的XML模板必須相同內(nèi)存消耗較大,且不釋放數(shù)據(jù)窗口-數(shù)據(jù)拷貝PB提供的幾種數(shù)據(jù)拷貝方法的比較方法優(yōu)勢(shì)缺31Demo5Demo5演示DataWindow的幾種數(shù)據(jù)拷貝方式和性能DEMODemo5Demo5DEMO32數(shù)據(jù)窗口-小技巧1小技巧1可以通過數(shù)據(jù)窗口的SQLPreview事件查看數(shù)據(jù)窗口發(fā)送給數(shù)據(jù)庫的Sql語句,SQLPreview事件的參數(shù)的含義如下參數(shù)描述Request觸發(fā)該事件的函數(shù)類型(Retrieve、Update)SQLType發(fā)送給DBMS的SQL語句的類型(SELECT、INSERT、DELETE、UPDATE)SQLSyntaxSQL語句的語法Buffer產(chǎn)生SQL語句的記錄行所處的數(shù)據(jù)窗口緩沖區(qū)(Primary、Delete、filter)Row發(fā)生數(shù)據(jù)庫行為的記錄行行號(hào)數(shù)據(jù)窗口-小技巧1小技巧1參數(shù)描述Request33數(shù)據(jù)窗口-小技巧2小技巧2查看SQL語句中的數(shù)據(jù)(可以通過DBMS的DBParm參數(shù)設(shè)置來查看數(shù)據(jù),DBParm中有一個(gè)DisableBind變量,該變量的含義是在SQLSyntax參數(shù)所返回的語法串中所有實(shí)際數(shù)據(jù)的位置上是否一“?”號(hào)代替)DisableBind狀態(tài)SQL語句DisableBind=0(默認(rèn))Selectxh,fsdm,ghdw,je,bzfromwz_rkdwherexh=?DisableBind=1Selectxh,fsdm,ghdw,je,bzfromwz_rkdwherexh=1數(shù)據(jù)窗口-小技巧2小技巧2DisableBind狀態(tài)SQL語34第三章調(diào)試及跟蹤本章內(nèi)容異常處理DebugTraceView第三章調(diào)試及跟蹤本章內(nèi)容35調(diào)試及跟蹤-異常處理1異常處理(Exception)為什么要進(jìn)行異常處理?異常異常是指程序在運(yùn)行過程中錯(cuò)誤事件,比如除數(shù)為0、數(shù)組越界、空對(duì)象引用等等,這些事件的發(fā)生將會(huì)阻止應(yīng)用程序的運(yùn)行,為了提高程序的健壯性,在程序設(shè)計(jì)時(shí),應(yīng)該考慮到可能發(fā)生的異常事件,并在應(yīng)用程序中做出相應(yīng)的處理設(shè)計(jì)良好的異常處理可以讓應(yīng)用程序有計(jì)劃從錯(cuò)誤中恢復(fù)出來,繼續(xù)進(jìn)行處理,擺脫因錯(cuò)誤而導(dǎo)致的應(yīng)用程序中斷調(diào)試及跟蹤-異常處理1異常處理(Exception)36調(diào)試及跟蹤-異常處理2沒有異常處理的程序,程序被強(qiáng)行退出進(jìn)行異常處理后的程序,程序可以繼續(xù)運(yùn)行調(diào)試及跟蹤-異常處理2沒有異常處理的程序,程序被強(qiáng)行退出37調(diào)試及跟蹤-異常處理3PB中的異常處理對(duì)象

ThrowableExceptionRuntimeErrorDivideByZeroErrorNullObjectErrorDWRuntimeErrorOLERuntimeErrorCORBASystem調(diào)試及跟蹤-異常處理3PB中的異常處理對(duì)象Throwable38調(diào)試及跟蹤-異常處理4PB中的異常處理語句Try//可能發(fā)生異常的語句Catch//異常類型1異常對(duì)象變量//處理異常情況的代碼Catch//異常類型2異常對(duì)象變量//處理異常情況的代碼//……Finally//執(zhí)行公共處理部分(不管是否發(fā)生異常都會(huì)執(zhí)行這段代碼)EndTry調(diào)試及跟蹤-異常處理4PB中的異常處理語句39Demo6Demo6演示捕獲異常DEMODemo6Demo6DEMO40調(diào)試及跟蹤-Debug調(diào)試工具DebugView簡(jiǎn)介是一種第三方的調(diào)試工具,能在代碼中輸出變量的值到一個(gè)實(shí)時(shí)刷新的界面中,我們?cè)诰帉懘a時(shí),在一些關(guān)鍵的地方輸出一個(gè)信息,特別是當(dāng)程序已經(jīng)編譯成EXE之后,可以通過該工具查看程序的運(yùn)行情況如何使用只需使用一個(gè)API函數(shù)(OutputDebugStringA)像該工具中發(fā)送信息,在程序運(yùn)行時(shí)打開該工具就可以了建議自己重新封裝OutputDebugStringA函數(shù),因?yàn)樵摵瘮?shù)默認(rèn)的只能傳入字符串變量,自己封裝之后,可以傳遞任何類型的變量,甚至是DataStore(編碼將DataStore的數(shù)據(jù)轉(zhuǎn)換成字符串),實(shí)際中使用最多的情況也是查看Datastore中的數(shù)據(jù)(在基礎(chǔ)類庫中已經(jīng)進(jìn)行了封裝,參見nvo_debug對(duì)象)調(diào)試及跟蹤-Debug調(diào)試工具DebugView41Demo7Demo7演示DebugView的使用DEMODemo7Demo7DEMO42調(diào)試及跟蹤-TraceView1Trace的主要目的通過對(duì)程序的性能跟蹤,分析程序各部分的消耗,以編寫高效的代碼調(diào)試及跟蹤-TraceView1Trace的主要目的43調(diào)試及跟蹤-TraceView2打開Trace工具的兩種方式方式一:開發(fā)環(huán)境中預(yù)先設(shè)置Trace開關(guān)Trace文件存放路徑調(diào)試及跟蹤-TraceView2打開Trace工具的兩種44調(diào)試及跟蹤-TraceView3打開Trace工具的兩種方式方式二:使用PB的函數(shù)打開TraceEnableActivityTraceBeginTraceEndTraceClose建議:使用第二種方式更有意義,因?yàn)榭梢愿櫰渲械哪骋欢未a,找出代碼中比較慢的原因調(diào)試及跟蹤-TraceView3打開Trace工具的兩種45調(diào)試及跟蹤-TraceView4跟蹤結(jié)果的幾種瀏覽方式方式一:ProfilingCloss從對(duì)象的角度查看方式二:ProfilingRoutineView從對(duì)象、方法的調(diào)用次數(shù)查看方式三:ProfilingTraceView從對(duì)象總體消耗查看調(diào)試及跟蹤-TraceView4跟蹤結(jié)果的幾種瀏覽方式46Demo8Demo8演示TraceViewDEMODemo8Demo8DEMO47第四章編碼規(guī)范本章內(nèi)容控件命名規(guī)則代碼命名規(guī)范大小寫規(guī)范注釋規(guī)范縮進(jìn)規(guī)范建議第四章編碼規(guī)范本章內(nèi)容48編碼規(guī)范-控件命名規(guī)范參照PB默認(rèn)設(shè)置例如:CommandButton cb_DataWindow dw_RadioButton rb_SingleLineEdit sle_StaticText st_TreeView tv_UserObject uo_……編碼規(guī)范-控件命名規(guī)范參照PB默認(rèn)設(shè)置49編碼規(guī)范-代碼命名規(guī)范基本命名原則前綴_功能或作用描述與數(shù)據(jù)庫保持一致對(duì)象:w_d_ds_m_uo_函數(shù):af_gf_wf_mf_uf_變量前綴全局變量 g gi_XiTongXH局部變量 l ls_XiTong實(shí)例變量 i is_CanShuMC共享變量 s si_ChuangKouXH編碼規(guī)范-代碼命名規(guī)范基本命名原則50編碼規(guī)范-大小寫規(guī)范SQL語句 UpperFirstSelect、Into、Where保留字 UpperFirst IfThen…Else…EndIf預(yù)定義類型 UpperFirstString、Long內(nèi)置函數(shù) UpperFirstMessageBox其他 除前綴外首字母大寫gi_XiTongXH、ls_XiTongMC編碼規(guī)范-大小寫規(guī)范SQL語句 UpperFirst51編碼規(guī)范-注釋規(guī)范源代碼文件的注釋在文件的頭部必須標(biāo)明程序名稱,它所完成的主要功能。文件的作者,及完成時(shí)間。階段測(cè)試結(jié)束后,主要修改活動(dòng)的修改人、時(shí)間、簡(jiǎn)單原因說明列表。維護(hù)過程中需要修改程序時(shí),應(yīng)在被修改語句前面注明修改時(shí)間和原因說明。函數(shù)或過程的注釋在函數(shù)頭部必須對(duì)函數(shù)進(jìn)行功能和參數(shù)(值參、變參)說明;在函數(shù)的主體部分,如算法復(fù)雜時(shí),應(yīng)以注釋的方式對(duì)其算法結(jié)構(gòu)作出說明;函數(shù)申請(qǐng)過全局資源且有可能導(dǎo)致資源緊張應(yīng)加以注明(如內(nèi)存,文件柄等);函數(shù)有副作用一定以十分醒目的方式(如加!號(hào)等)注明;函數(shù)的長(zhǎng)度在100語句行以內(nèi)(不包括注釋),程序有特殊要求時(shí)(如速度要求等)可以例外。語句的注釋應(yīng)對(duì)不易理解的分支條件表達(dá)式加注釋;不易理解的循環(huán),應(yīng)說明出口條件(有GOTO的程序還應(yīng)說明入口條件);過長(zhǎng)的函數(shù)實(shí)現(xiàn),應(yīng)將其語句按實(shí)現(xiàn)的功能分段加以概括性說明;供別的文件或函數(shù)調(diào)用的函數(shù),絕不應(yīng)使用全局變量交換數(shù)據(jù)。常量和變量的注釋被保存值的含義(必須)合法取值的范圍(可選)全局變量、實(shí)例變量需要對(duì)以上逐點(diǎn)做充分的說明。自制對(duì)象的注釋標(biāo)注制定對(duì)象的用途。標(biāo)注制定對(duì)象的制定人員。標(biāo)注制定的時(shí)間或者修改時(shí)間。編碼規(guī)范-注釋規(guī)范源代碼文件的注釋52編碼規(guī)范-縮進(jìn)規(guī)范范例IfexpressionThenstatementsElsestatementsEndIf任何一個(gè)程序最大行寬不得超過80列,超過者應(yīng)折行書寫。建議一個(gè)函數(shù)的縮進(jìn)不得超過5級(jí),超過者應(yīng)將其子塊寫為子函數(shù);算法或程序本身的特性有特殊要求時(shí),可以超過5級(jí)??s進(jìn)建議采用空格代替TAB。編碼規(guī)范-縮進(jìn)規(guī)范范例53編碼規(guī)范-建議不使用Goto語句定義變量一行一個(gè),在需要的時(shí)候定義一行超過80個(gè)字符需換行顯示合理使用空行和空格,使代碼更加清晰等號(hào)(=)左右均使用一個(gè)空格函數(shù)參數(shù)格開的逗號(hào)(,)后使用一個(gè)空格縮進(jìn)三個(gè)空格,不使用Tab制表符編碼規(guī)范-建議不使用Goto語句54第五章輔助工具本章內(nèi)容DWSyntaxDebugviewPBDeltaPBComment第五章輔助工具本章內(nèi)容55輔助工具-工具介紹工具名稱內(nèi)容DWSyntax描述數(shù)據(jù)窗口的基本語法Debugview輔助輸出代碼運(yùn)行過程中的內(nèi)容和結(jié)果PBDeltaPB代碼對(duì)比工具PBComment可以幫助你自動(dòng)生成注釋、美化代碼、自動(dòng)完成代碼、大小寫轉(zhuǎn)換等輔助工具-工具介紹工具名稱內(nèi)容DWSyntax描述數(shù)據(jù)窗口的56謝謝謝謝57PB培訓(xùn)教程(提高篇)PB培訓(xùn)教程(提高篇)58前言本教程的內(nèi)容第一章PB的發(fā)展第二章數(shù)據(jù)窗口第三章調(diào)試及跟蹤第四章編碼規(guī)范第五章輔助工具本教程適合的人群對(duì)PB有基礎(chǔ)概念有一定的開發(fā)經(jīng)驗(yàn)樂于分享、學(xué)習(xí)、提高前言本教程的內(nèi)容59第一章PB的發(fā)展本章內(nèi)容PB6新特性PB7新特性PB8新特性PB9新特性PB10新特性第一章PB的發(fā)展本章內(nèi)容60PB的發(fā)展-PB6新特性PB6新特性整體性能增強(qiáng)Internet增強(qiáng)分布式計(jì)算增強(qiáng)開發(fā)效率的增強(qiáng)擴(kuò)展的多種語言支持交叉平臺(tái)支持PowerScript語言增強(qiáng)數(shù)據(jù)窗口增強(qiáng)數(shù)據(jù)庫連接增強(qiáng)OLE增強(qiáng)應(yīng)用程序發(fā)行方面的增強(qiáng)其他增強(qiáng)參見《PowerBuilder6.0開發(fā)人員指南》PB的發(fā)展-PB6新特性PB6新特性61PB的發(fā)展-PB7新特性PB7新特性嶄新的用戶界面和開發(fā)方法組件開發(fā)和部署方面的新特性數(shù)據(jù)連接方面的新特性其他新穎的特性參見《PowerBuilder7參考手冊(cè)》PB的發(fā)展-PB7新特性PB7新特性62PB的發(fā)展-PB8新特性PB8新特性用戶界面Web功能數(shù)據(jù)窗口新特性EAServer的集成數(shù)據(jù)庫連接PowerScript新特性進(jìn)一步提高的易用性和其他增強(qiáng)特性參見《PowerBuilder8參考手冊(cè)》PB的發(fā)展-PB8新特性PB8新特性63PB的發(fā)展-PB9新特性PB9新特性先進(jìn)的4GLPLUS基礎(chǔ)多樣的適用性利用集成開發(fā)與設(shè)計(jì)獲得優(yōu)異的成果不斷增加的強(qiáng)大功能參見《創(chuàng)造最佳的開發(fā)環(huán)境-SybasePowerBuilder9.0》PB的發(fā)展-PB9新特性PB9新特性64PB的發(fā)展-PB10新特性PB10新特性集成PowerDesignerXMLWebDataWindowDataWindow.NETUnicodesupport新的控件各式各樣的變化數(shù)據(jù)連接的改變參見PowerBuilder10新特性PB的發(fā)展-PB10新特性PB10新特性65第二章數(shù)據(jù)窗口本章內(nèi)容常見問題函數(shù)和事件緩沖區(qū)狀態(tài)位并發(fā)控制數(shù)據(jù)拷貝小技巧第二章數(shù)據(jù)窗口本章內(nèi)容66數(shù)據(jù)窗口-常見問題數(shù)據(jù)窗口-常見問題67數(shù)據(jù)窗口-函數(shù)和事件DataWindowAcceptTextDeleteRowClickedRowcountDoubleClikcedGetItemDateetcGetRowInsertRowConstructorResetRetrieveSetItemSortUpdate……EditChangedErrorItemChangedSQLPreview……數(shù)據(jù)窗口-函數(shù)和事件DataWindowAcceptText68數(shù)據(jù)窗口-緩沖區(qū)1存放填充窗口中DataWindow控件中數(shù)據(jù)的,調(diào)用DataWindow的Retrieve()函數(shù)和InsertRow()函數(shù)可以將數(shù)據(jù)填入這個(gè)緩沖區(qū)中

存儲(chǔ)的是從OriginalBuffer使用Filter()函數(shù)過濾到PrimaryBuffer中后剩余的記錄

保存的是用DeleteRow()函數(shù)從PrimaryBuffer中刪除的記錄存儲(chǔ)的是DataWindow最初執(zhí)行retrieve()函數(shù)時(shí)得到的全部記錄DataWindow主緩沖區(qū)PrimaryBuffer過濾緩沖區(qū)FilterBuffer刪除緩沖區(qū)Deletebuffer原始緩沖區(qū)OriginalBufferFilterDeleteRowInsertRowRetrieveRetrieveDataWindow有四個(gè)緩沖區(qū)數(shù)據(jù)窗口-緩沖區(qū)1存放填充窗口中DataWindow控件中數(shù)69數(shù)據(jù)窗口-緩沖區(qū)2dw_1.object.xh[1]獲取數(shù)據(jù)窗口的主緩沖區(qū)的第一行的xh列的值dw_1.SetItem(1,’ghdw’,’浙江聯(lián)眾’)為數(shù)據(jù)窗口主緩沖區(qū)的第一行的ghdw列賦值dw_1.object.xh.filter[1]獲取數(shù)據(jù)窗口過濾緩沖區(qū)的第一行的xh列的值dw_1.object.data.primary.current訪問主緩沖區(qū)dw_1.object.data.primary.original訪問原始緩沖區(qū)dw_1.object.data.filter.current訪問過濾緩沖區(qū)dw_1.object.data.delete.current訪問刪除緩沖區(qū)緩沖區(qū)的訪問數(shù)據(jù)窗口-緩沖區(qū)2dw_1.object.xh[1]緩沖區(qū)的70數(shù)據(jù)窗口-緩沖區(qū)3函數(shù)描述Retrieve將數(shù)據(jù)從數(shù)據(jù)庫檢索到主緩沖區(qū)、原始值緩沖區(qū)Update訪問原始值緩沖區(qū)、主緩沖區(qū)和刪除緩沖區(qū)InsertRow在主緩沖區(qū)中插入一行數(shù)據(jù)DeleteRow從主緩沖區(qū)刪除一行數(shù)據(jù),并將數(shù)據(jù)移動(dòng)到刪除緩沖區(qū)Filter把數(shù)據(jù)從主緩沖區(qū)移到過濾緩沖區(qū)Reset把所有緩沖區(qū)中的全部數(shù)據(jù)行清除RowsMove把數(shù)據(jù)從一個(gè)緩沖區(qū)移到另一個(gè)緩沖區(qū)RowsCopy把數(shù)據(jù)從一個(gè)緩沖區(qū)復(fù)制到另一個(gè)緩沖區(qū)RowCount返回主緩沖區(qū)中的數(shù)據(jù)行的數(shù)目ModifiedCount返回?cái)?shù)據(jù)窗口中(包括過濾緩沖區(qū)和主緩沖區(qū))修改的數(shù)據(jù)行數(shù)FilteredCount返回過濾緩沖區(qū)中的數(shù)據(jù)行的數(shù)目DeletedCount返回刪除緩沖區(qū)中的數(shù)據(jù)行的數(shù)目Resetupdate清除數(shù)據(jù)窗口的主緩沖區(qū)、過濾緩沖區(qū)的更新標(biāo)志,并清除刪除緩沖區(qū)函數(shù)使用與緩沖區(qū)的變化數(shù)據(jù)窗口-緩沖區(qū)3函數(shù)描述Retrieve將數(shù)據(jù)71Demo1Demo1演示DataWindow的四個(gè)緩存區(qū)DEMODemo1Demo1DEMO72數(shù)據(jù)窗口-狀態(tài)位1數(shù)據(jù)窗口的四種狀態(tài)位

NotModified

該行或行的值為查詢所得,沒有發(fā)生改變

DataModified

該行或列的值為查詢所得,發(fā)生了改變

New

該行或列為一插入的新行,數(shù)據(jù)沒有發(fā)生改變(數(shù)據(jù)為空或缺省值)

NewModified

該行或列為一插入的新行,數(shù)據(jù)發(fā)生改變,改變是通過用戶鍵盤輸入或調(diào)用了SetItem()函數(shù)

數(shù)據(jù)窗口-狀態(tài)位1數(shù)據(jù)窗口的四種狀態(tài)位73數(shù)據(jù)窗口-狀態(tài)位2獲取數(shù)據(jù)窗口的行的狀態(tài) GetItemStatus(row,column,Dwbuffer) 返回值:枚舉類型dwItemStatus New! NewModified! NotModified! DataModified!

例:下面的代碼返回主緩沖區(qū)第一行的ghdw列的狀態(tài) DwItemStatuesl_status l_status=dw_1.GetItemStatus(1,0,Primary!)

數(shù)據(jù)窗口-狀態(tài)位2獲取數(shù)據(jù)窗口的行的狀態(tài)74數(shù)據(jù)窗口-狀態(tài)位3設(shè)置數(shù)據(jù)窗口的狀態(tài)位 SetItemStatus(row,column,Dwbuffer,status)

例:下面的代碼設(shè)置主緩沖區(qū)第一行的ghdw列的狀態(tài)為NotModified!

dw_1.SetItemStatus(1,’ghdw’,Primary!,NotModified!)

注:并不是所有的狀態(tài)都可以設(shè)置成功!滿足下面規(guī)則數(shù)據(jù)窗口-狀態(tài)位3設(shè)置數(shù)據(jù)窗口的狀態(tài)位75Demo2Demo2演示DataWindow的四種狀態(tài)位DEMODemo2Demo2DEMO76數(shù)據(jù)窗口-并發(fā)控制1并發(fā)控制

指多用戶在同一時(shí)間對(duì)相同數(shù)據(jù)同時(shí)訪問的能力,一般的關(guān)系數(shù)據(jù)庫都具有并發(fā)控制的能力,PB中用DataWindow的設(shè)置來進(jìn)行并發(fā)控制

并發(fā)控制區(qū)域數(shù)據(jù)窗口-并發(fā)控制1并發(fā)控制并發(fā)控制區(qū)域77數(shù)據(jù)窗口-并發(fā)控制2WhereClauseforUpdate/Delete

1>選項(xiàng)“KeyColumns”

比較更新前后Table的關(guān)鍵字是否發(fā)生了變化,即當(dāng)前數(shù)據(jù)庫中關(guān)鍵字的實(shí)際值和最初查詢的值做比較,如果沒有改變,則可以更新,反之不能更新

因?yàn)殛P(guān)鍵字xh=1沒有發(fā)生變化,Where條件成立,更新成功!但沒有達(dá)到并發(fā)控制的目的!

示例:修改序號(hào)為1的入庫單的金額改為3000(原金額為2000)Updatewz_rkdSetje=3000wherexh=1;數(shù)據(jù)窗口-并發(fā)控制2WhereClauseforUpd78數(shù)據(jù)窗口-并發(fā)控制3WhereClauseforUpdate/Delete2>選項(xiàng)“KeyandUpdateableColumn”

比較更新前后Table的關(guān)鍵字和可修改(更新)的列值是否發(fā)生了變化,如果沒有一項(xiàng)發(fā)生改變,更新成功;反之,若數(shù)據(jù)庫中當(dāng)前值中若任一項(xiàng)與數(shù)據(jù)窗口最初檢索出的值不一致,則更新失敗

示例:修改序號(hào)為1的入庫單的金額改為3000(原金額為2000,假設(shè)所有列都是可更新的)Updatewz_rkdSetje=3000

wherexh=1andfsdm=‘采購入庫’andghdw=‘浙江聯(lián)眾’andje=2000andbz=‘’;數(shù)據(jù)窗口-并發(fā)控制3WhereClauseforUpd79數(shù)據(jù)窗口-并發(fā)控制4WhereClauseforUpdate/Delete2>選項(xiàng)“KeyandUpdateableColumn”

上例中,假設(shè)在A用戶修改的同時(shí),B用戶將可修改列之一je的值由2000變?yōu)榱说?500,where條件不成立,因此更新失敗,并彈出出錯(cuò)信息如下數(shù)據(jù)窗口-并發(fā)控制4WhereClauseforUpd80數(shù)據(jù)窗口-并發(fā)控制5WhereClauseforUpdate/Delete

3>選項(xiàng)“KeyandModifiedColumns”

比較更新前后Table的關(guān)鍵字和要修改(更新)的列值是否發(fā)生了變化,如果沒有改變,更新成功,反之更新失敗。對(duì)于本例,即判斷關(guān)鍵字xh和將要修改字段je是否發(fā)生變化 上例中可修改(更新)列之一je的值經(jīng)修改存盤后,已由2000變成了當(dāng)前的2500,where條件不成立,因此更新失敗,但是,如果改變了其他字段的值,比如ghdw,此更新能夠成功示例:修改序號(hào)為1的入庫單的金額改為3000(原金額為2000)Updatewz_rkdSetje=3000wherexh=1andje=2000;數(shù)據(jù)窗口-并發(fā)控制5WhereClauseforUpd81數(shù)據(jù)窗口-并發(fā)控制6并發(fā)控制總結(jié)KeyColumns該選項(xiàng)在控制數(shù)據(jù)完整性方面最弱,它所允許的并發(fā)操作是最多的,所禁止的并發(fā)操作發(fā)生的可能性非常小,只有當(dāng)主鍵被更改后才起并發(fā)控制作用,當(dāng)一條記錄的關(guān)鍵字改變了才進(jìn)行控制,這顯然沒有多大意義。實(shí)際上這種方法一般只在單機(jī)版的應(yīng)用程序中使用,而在C/S模式中是很少使用的KeyandUpdateableColumns該選項(xiàng)是PB的默認(rèn)選項(xiàng),控制最為嚴(yán)格,可以實(shí)現(xiàn)最安全的并發(fā)控制,充分保證數(shù)據(jù)的完整性,但它也會(huì)禁止我們做一些本當(dāng)允許的并發(fā)修改,是并發(fā)能力最差的方法KeyandModifiedColumns該選項(xiàng)可以說是前兩者的折衷,在控制數(shù)據(jù)完整性和嚴(yán)格性方面比第一項(xiàng)強(qiáng),比第二項(xiàng)弱,在允許的并發(fā)操作數(shù)量方面比第一項(xiàng)少,比第二項(xiàng)多數(shù)據(jù)窗口-并發(fā)控制6并發(fā)控制總結(jié)82數(shù)據(jù)窗口-并發(fā)控制7數(shù)據(jù)窗口Update其他屬性KeyModificationUseDeletethenInsert數(shù)據(jù)行先被刪除,然后,重新插入新的數(shù)據(jù)行注意:這個(gè)選項(xiàng)要求用戶選擇從數(shù)據(jù)庫檢索出所有的列UseUpdate直接修改數(shù)據(jù)行UnigueKeyColumn修改時(shí)唯一鍵IdentityColumns標(biāo)識(shí)列,由DBMS自動(dòng)產(chǎn)生的流水號(hào)列,如果選中該列,不能修改該列數(shù)據(jù)窗口-并發(fā)控制7數(shù)據(jù)窗口Update其他屬性83Demo3Demo3演示DataWindow的并發(fā)控制DEMODemo3Demo3DEMO84數(shù)據(jù)窗口-并發(fā)控制8數(shù)據(jù)窗口的Update函數(shù)與狀態(tài)位的關(guān)系

在實(shí)際中,經(jīng)常需要在一個(gè)事務(wù)中同時(shí)更新主數(shù)據(jù)窗口和明細(xì)數(shù)據(jù)窗口,例如,同時(shí)更新入庫單和入庫單明細(xì)兩個(gè)數(shù)據(jù)窗口時(shí),經(jīng)常會(huì)寫下面的語句:Ifdw_rkd.Update(True,false)=1thenIfdw_rkdmx.Update(True,false)=1then

dw_rkd.ResetUpdate()dw_rkdmx.ResetUpdate()Commit;ElseRollback;EndIfEndIf數(shù)據(jù)窗口-并發(fā)控制8數(shù)據(jù)窗口的Update函數(shù)與狀態(tài)位的關(guān)系85數(shù)據(jù)窗口-并發(fā)控制9Update(Boolean,Boolean)的參數(shù)第一個(gè)參數(shù)Boolean,指定Update之前是否自動(dòng)執(zhí)行AcceptText函數(shù),True表示自動(dòng)執(zhí)行(缺省值)第二個(gè)參數(shù)Boolean,指定更新數(shù)據(jù)庫之后是否自動(dòng)復(fù)位更新標(biāo)志,True表示自動(dòng)復(fù)位更新標(biāo)志若第二個(gè)參數(shù)設(shè)置成False,必須調(diào)用ResetUpdate()清除更新標(biāo)志Resetupdate()函數(shù)清除數(shù)據(jù)窗口的主緩沖區(qū)、過濾緩沖區(qū)的更新標(biāo)志,并清空刪除緩沖區(qū)數(shù)據(jù)窗口-并發(fā)控制9Update(Boolean,Bool86Demo4Demo4演示DataWindow的Update函數(shù)Demo4Demo487數(shù)據(jù)窗口-數(shù)據(jù)拷貝PB提供的幾種數(shù)據(jù)拷貝方法的比較方法優(yōu)勢(shì)缺陷及限制Rowscopy單行/多行數(shù)據(jù)copy性能一般字段名稱、個(gè)數(shù)、順序要求完全相同(順序?)GetFullstatusSetFullstatus數(shù)據(jù)和狀態(tài)全部copy,性能較好無Dataobject.data單行和多行copy性能一般字段名稱、個(gè)數(shù)、順序要求完全相同ShareData不是copy,只是數(shù)據(jù)共享,性能最好,字段要求完全相同ImportString(Text)可以從文本字符串中導(dǎo)入性能一般字段名稱、個(gè)數(shù)、順序要求完全相同ImportString(XML)字段個(gè)數(shù)、順序可以不相同PB9.0及以上版本才提供雖然字段個(gè)數(shù)、順序可以不相同,但要求指定導(dǎo)入導(dǎo)出的XML模板必須相同內(nèi)存消耗較大,且不釋放數(shù)據(jù)窗口-數(shù)據(jù)拷貝PB提供的幾種數(shù)據(jù)拷貝方法的比較方法優(yōu)勢(shì)缺88Demo5Demo5演示DataWindow的幾種數(shù)據(jù)拷貝方式和性能DEMODemo5Demo5DEMO89數(shù)據(jù)窗口-小技巧1小技巧1可以通過數(shù)據(jù)窗口的SQLPreview事件查看數(shù)據(jù)窗口發(fā)送給數(shù)據(jù)庫的Sql語句,SQLPreview事件的參數(shù)的含義如下參數(shù)描述Request觸發(fā)該事件的函數(shù)類型(Retrieve、Update)SQLType發(fā)送給DBMS的SQL語句的類型(SELECT、INSERT、DELETE、UPDATE)SQLSyntaxSQL語句的語法Buffer產(chǎn)生SQL語句的記錄行所處的數(shù)據(jù)窗口緩沖區(qū)(Primary、Delete、filter)Row發(fā)生數(shù)據(jù)庫行為的記錄行行號(hào)數(shù)據(jù)窗口-小技巧1小技巧1參數(shù)描述Request90數(shù)據(jù)窗口-小技巧2小技巧2查看SQL語句中的數(shù)據(jù)(可以通過DBMS的DBParm參數(shù)設(shè)置來查看數(shù)據(jù),DBParm中有一個(gè)DisableBind變量,該變量的含義是在SQLSyntax參數(shù)所返回的語法串中所有實(shí)際數(shù)據(jù)的位置上是否一“?”號(hào)代替)DisableBind狀態(tài)SQL語句DisableBind=0(默認(rèn))Selectxh,fsdm,ghdw,je,bzfromwz_rkdwherexh=?DisableBind=1Selectxh,fsdm,ghdw,je,bzfromwz_rkdwherexh=1數(shù)據(jù)窗口-小技巧2小技巧2DisableBind狀態(tài)SQL語91第三章調(diào)試及跟蹤本章內(nèi)容異常處理DebugTraceView第三章調(diào)試及跟蹤本章內(nèi)容92調(diào)試及跟蹤-異常處理1異常處理(Exception)為什么要進(jìn)行異常處理?異常異常是指程序在運(yùn)行過程中錯(cuò)誤事件,比如除數(shù)為0、數(shù)組越界、空對(duì)象引用等等,這些事件的發(fā)生將會(huì)阻止應(yīng)用程序的運(yùn)行,為了提高程序的健壯性,在程序設(shè)計(jì)時(shí),應(yīng)該考慮到可能發(fā)生的異常事件,并在應(yīng)用程序中做出相應(yīng)的處理設(shè)計(jì)良好的異常處理可以讓應(yīng)用程序有計(jì)劃從錯(cuò)誤中恢復(fù)出來,繼續(xù)進(jìn)行處理,擺脫因錯(cuò)誤而導(dǎo)致的應(yīng)用程序中斷調(diào)試及跟蹤-異常處理1異常處理(Exception)93調(diào)試及跟蹤-異常處理2沒有異常處理的程序,程序被強(qiáng)行退出進(jìn)行異常處理后的程序,程序可以繼續(xù)運(yùn)行調(diào)試及跟蹤-異常處理2沒有異常處理的程序,程序被強(qiáng)行退出94調(diào)試及跟蹤-異常處理3PB中的異常處理對(duì)象

ThrowableExceptionRuntimeErrorDivideByZeroErrorNullObjectErrorDWRuntimeErrorOLERuntimeErrorCORBASystem調(diào)試及跟蹤-異常處理3PB中的異常處理對(duì)象Throwable95調(diào)試及跟蹤-異常處理4PB中的異常處理語句Try//可能發(fā)生異常的語句Catch//異常類型1異常對(duì)象變量//處理異常情況的代碼Catch//異常類型2異常對(duì)象變量//處理異常情況的代碼//……Finally//執(zhí)行公共處理部分(不管是否發(fā)生異常都會(huì)執(zhí)行這段代碼)EndTry調(diào)試及跟蹤-異常處理4PB中的異常處理語句96Demo6Demo6演示捕獲異常DEMODemo6Demo6DEMO97調(diào)試及跟蹤-Debug調(diào)試工具DebugView簡(jiǎn)介是一種第三方的調(diào)試工具,能在代碼中輸出變量的值到一個(gè)實(shí)時(shí)刷新的界面中,我們?cè)诰帉懘a時(shí),在一些關(guān)鍵的地方輸出一個(gè)信息,特別是當(dāng)程序已經(jīng)編譯成EXE之后,可以通過該工具查看程序的運(yùn)行情況如何使用只需使用一個(gè)API函數(shù)(OutputDebugStringA)像該工具中發(fā)送信息,在程序運(yùn)行時(shí)打開該工具就可以了建議自己重新封裝OutputDebugStringA函數(shù),因?yàn)樵摵瘮?shù)默認(rèn)的只能傳入字符串變量,自己封裝之后,可以傳遞任何類型的變量,甚至是DataStore(編碼將DataStore的數(shù)據(jù)轉(zhuǎn)換成字符串),實(shí)際中使用最多的情況也是查看Datastore中的數(shù)據(jù)(在基礎(chǔ)類庫中已經(jīng)進(jìn)行了封裝,參見nvo_debug對(duì)象)調(diào)試及跟蹤-Debug調(diào)試工具DebugView98Demo7Demo7演示DebugView的使用DEMODemo7Demo7DEMO99調(diào)試及跟蹤-TraceView1Trace的主要目的通過對(duì)程序的性能跟蹤,分析程序各部分的消耗,以編寫高效的代碼調(diào)試及跟蹤-TraceView1Trace的主要目的100調(diào)試及跟蹤-TraceView2打開Trace工具的兩種方式方式一:開發(fā)環(huán)境中預(yù)先設(shè)置Trace開關(guān)Trace文件存放路徑調(diào)試及跟蹤-TraceView2打開Trace工具的兩種101調(diào)試及跟蹤-TraceView3打開Trace工具的兩種方式方式二:使用PB的函數(shù)打開TraceEnab

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論