PB詳細(xì)學(xué)習(xí)筆記_第1頁(yè)
PB詳細(xì)學(xué)習(xí)筆記_第2頁(yè)
PB詳細(xì)學(xué)習(xí)筆記_第3頁(yè)
PB詳細(xì)學(xué)習(xí)筆記_第4頁(yè)
PB詳細(xì)學(xué)習(xí)筆記_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

當(dāng)我們?cè)诔绦蛑杏眯薷臄?shù)據(jù)庫(kù)的時(shí)候,只要不用commit切程序在運(yùn)行,我們此時(shí)是查看不到數(shù)據(jù)庫(kù)中當(dāng)前操作的數(shù)據(jù)的,只有commit后,或退出該程序時(shí),才能在數(shù)據(jù)庫(kù)中查看到修改后的數(shù)據(jù)。這是因?yàn)樾薷臄?shù)據(jù)的時(shí)候是先有一個(gè)緩沖區(qū),此時(shí)還沒(méi)有修改到實(shí)際的數(shù)據(jù),多以此時(shí)沒(méi)用commit,而用rollback的時(shí)候,對(duì)緩沖區(qū)的修改代碼將不被執(zhí)行;此時(shí)就是起到出錯(cuò)數(shù)據(jù)回滾的操作但是,當(dāng)我們修改了數(shù)據(jù)沒(méi)用到commit的時(shí)候,而是直接退出程序,此時(shí)數(shù)據(jù)庫(kù)緩沖區(qū)中的修改代碼也會(huì)被執(zhí)行,也就是說(shuō),只要不用rollback,推車程序時(shí)數(shù)據(jù)也會(huì)被更改。所以,當(dāng)我們某個(gè)地方會(huì)出錯(cuò)需要數(shù)據(jù)回滾時(shí),就要在那里進(jìn)行rollback操作。在數(shù)據(jù)窗口對(duì)象里設(shè)置顯示值和實(shí)際值時(shí),要注意:當(dāng)輸出文檔時(shí)任然使用的是實(shí)際值,顯示值值是看的,沒(méi)有實(shí)際意義。在我們第一次裝PDM時(shí),裝數(shù)據(jù)庫(kù)的時(shí)候數(shù)據(jù)庫(kù)是沒(méi)有程序的內(nèi)部用戶的,所以一般是建一個(gè)空數(shù)據(jù)庫(kù),然后進(jìn)行初始化,這樣數(shù)據(jù)庫(kù)就有了2個(gè)用戶了,然后再將有數(shù)據(jù)的數(shù)據(jù)庫(kù)還原上去,但此時(shí)該數(shù)據(jù)庫(kù)也是沒(méi)有用戶的,就要給它授權(quán),即映射,此時(shí)執(zhí)行Grant的代碼就是映射授權(quán)。所以,當(dāng)沒(méi)有系統(tǒng)用戶時(shí),執(zhí)行Grant是沒(méi)有用的。我們?cè)趐b中,事件是可以繼承的,方法是不能繼承的:如果子對(duì)象中的該方法寫(xiě)了新代碼,則調(diào)用時(shí)是執(zhí)行新寫(xiě)的代碼,如果子對(duì)象該方法中什么也沒(méi)寫(xiě),則會(huì)調(diào)用父對(duì)象的該方法所以,可見(jiàn)繼承是可以先執(zhí)行父的再執(zhí)行子的,方法是不行的這個(gè)就叫做多態(tài)1.因?yàn)闃?biāo)題名字是字段名字加_t,所以,在自定義字段時(shí),設(shè)置字段名時(shí)不要有“_”.一定要注意補(bǔ)丁包升級(jí)和數(shù)據(jù)庫(kù)升級(jí),補(bǔ)丁包升級(jí)是將我們的程序進(jìn)行升級(jí),而數(shù)據(jù)庫(kù)升級(jí)是對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改操作的升級(jí)。二者不是一回事,都要進(jìn)行操作。我們要區(qū)分?jǐn)?shù)據(jù)庫(kù)版本和程序版本,兩者要對(duì)應(yīng)才能正常運(yùn)行。我們調(diào)試時(shí)用的動(dòng)態(tài)庫(kù)為PB文件夾下的動(dòng)態(tài)庫(kù),程序運(yùn)行時(shí)用的是Bin目錄下的動(dòng)態(tài)庫(kù),程序安裝時(shí)用的也是Bin目錄下的動(dòng)態(tài)庫(kù),所以要清楚不同環(huán)境下的運(yùn)行要求。修改數(shù)據(jù)窗口對(duì)象的查詢語(yǔ)句時(shí),先剪切再添加,這樣更能反映到當(dāng)前PB中來(lái)。在我們觸發(fā)事件打開(kāi)窗口的時(shí)候,一定要注意打開(kāi)窗口和當(dāng)前窗口的關(guān)系,如果他們是繼承關(guān)系,則會(huì)報(bào)錯(cuò)的~!在寫(xiě)SQL語(yǔ)句時(shí)注意where1=1的用法,我們開(kāi)始就把這個(gè)寫(xiě)在一個(gè)變量中,當(dāng)要增加條件時(shí)就直接加在后面。從而不用擔(dān)心where出現(xiàn)的位置問(wèn)題。在PB寫(xiě)代碼時(shí),不同的目標(biāo)可以引用對(duì)方的庫(kù),所以我們編譯時(shí),先編譯功能小的庫(kù),再編譯功能齊全的庫(kù)。為什么呢? 比如:我們目標(biāo)1調(diào)用目標(biāo)2的庫(kù)1,在庫(kù)1中調(diào)用了許多目標(biāo)1中的其他庫(kù)的對(duì)象,在編譯時(shí)就會(huì)將這些聯(lián)系都寫(xiě)在庫(kù)1.pbd文件中,當(dāng)編譯目標(biāo)2時(shí)也會(huì)重新生成庫(kù)1.pbd,由于在目標(biāo)2中沒(méi)有庫(kù)1中調(diào)用其他庫(kù)的對(duì)象,因?yàn)槟繕?biāo)2只是用到了庫(kù)1中很小的一部分對(duì)象,這時(shí)編譯并不會(huì)報(bào)錯(cuò),所以重新生成的.pbd文件是不全的(一般發(fā)生在多個(gè)程序集成在一起的情況)。所以,我們只能先編譯功能小的目標(biāo),再編譯功能大的目標(biāo)。防止相同庫(kù)先后編譯發(fā)生覆蓋的錯(cuò)誤。記住,在分析代碼的時(shí)候,要分功能模塊來(lái)看,不要整體的來(lái)分析,那樣會(huì)很復(fù)雜而且不容易想清楚,很容易亂。分析每一小塊的代碼,知道他的作用和關(guān)聯(lián);最后將每個(gè)塊聯(lián)系起來(lái)串一邊,就能曉得當(dāng)前腳本的功能了。有時(shí)候不一定要分析某個(gè)函數(shù)它內(nèi)部是怎么操作的,只需要曉得它的返回結(jié)果,這樣的函數(shù)就不用費(fèi)勁的去分析代碼了。在我們的程序中是有版本的,當(dāng)定義好了程序中的版本后,就要進(jìn)行數(shù)據(jù)庫(kù)升級(jí),這個(gè)升級(jí)就會(huì)將版本信息存放到數(shù)據(jù)庫(kù)中,只有程序的版本和數(shù)據(jù)庫(kù)的版本一致時(shí),才可以登錄系統(tǒng)。PB寫(xiě)的代碼調(diào)試是要依賴與環(huán)境的,所以,當(dāng)調(diào)試出問(wèn)題時(shí),就要把一些支持調(diào)試的.DLL文件拷貝到PB的安裝目錄下面去。注意考入的.dll文件要和當(dāng)前版本的程序相匹配,因?yàn)椴煌姹镜某绦蚶锏?DLL文件是不一樣的。要注意區(qū)分程序運(yùn)行的代碼和程序安裝的代碼,兩者是有區(qū)別的。我們要注意本地?cái)?shù)據(jù)源的連接,不是創(chuàng)建了數(shù)據(jù)源就可以能連的上去,同時(shí)也要為數(shù)據(jù)源指定數(shù)據(jù)庫(kù)文件。否則找不到數(shù)據(jù)。我們?cè)谑褂脤?duì)象的各種類型變量時(shí),一定要注意值的滯留問(wèn)題,如有這種情況,則要在開(kāi)頭或結(jié)尾將其進(jìn)行清空。Eg:當(dāng)有一個(gè)數(shù)組il_partid[]時(shí),開(kāi)始我們循環(huán)找到了2個(gè)值,放在il_partid[1],il_partid[2]里面,完成了滿足條件的查詢。但是當(dāng)我們下一次檢索時(shí),只找到一個(gè)滿足條件的值,放在了il_partid[1]里,此時(shí)我們查詢時(shí),則會(huì)出錯(cuò),出現(xiàn)2個(gè)滿足條件的值,因?yàn)槲覀冎蹈淖兞薸l_partid[1],但是il_partid[2]上次查詢結(jié)果的值仍然保留在,故會(huì)出錯(cuò)。所以,我們?cè)诿看螆?zhí)行代碼前就要清空:il_partid[]=ll_empt[]這樣就避免了出錯(cuò)。我們要清楚事件的觸發(fā)和函數(shù)的調(diào)用,當(dāng)我們不好用某個(gè)動(dòng)作來(lái)觸發(fā)某個(gè)自定義的事件代碼時(shí),我們可以將該事件放在另一個(gè)事件的結(jié)尾用trigger或post來(lái)觸發(fā)自定義事件。事件其實(shí)就是代碼~!注意:在我們用if判斷的時(shí)候,如果用=是表示判斷,不是賦值,而用函數(shù)返回值判斷時(shí),是要執(zhí)行該函數(shù)再判斷的,所以,不要搞混了,要清楚什么時(shí)候執(zhí)行,什么時(shí)候表示判斷。Modify基本可以修改數(shù)據(jù)窗口中所有的屬性項(xiàng)。我們要修改某對(duì)象的源時(shí),可以將其Export導(dǎo)出源碼,然后我們就雜源碼的定義部分修改對(duì)象的屬性。要知道,我們對(duì)源直接修改就是修改對(duì)象的本身屬性。any要想知道Any類型變量中保存數(shù)據(jù)的類型,可以使用函數(shù)ClassName()我們要連接多個(gè)數(shù)據(jù)庫(kù)時(shí),第一個(gè)數(shù)據(jù)庫(kù)算是默認(rèn)的,所以在我們用游標(biāo)或select語(yǔ)句時(shí)都不用usingsqlca;不用就算是默認(rèn)的。所以,當(dāng)用多個(gè)數(shù)據(jù)庫(kù)時(shí),檢索數(shù)據(jù)的時(shí)候就要在查詢的地方放用using語(yǔ)句,不然它算是連接到了默認(rèn)的數(shù)據(jù)庫(kù),則會(huì)出錯(cuò)。不管用哪個(gè)數(shù)據(jù)庫(kù)都是要定義好數(shù)據(jù)源的,同時(shí)在代碼中聲明連接,這樣才能得到數(shù)據(jù)。(聲明:sqlca.odbc=;sqlca.code;……)在應(yīng)用對(duì)象中聲明的是數(shù)據(jù)源參數(shù)的鏈接,因?yàn)閿?shù)據(jù)源和數(shù)據(jù)庫(kù)之間的關(guān)系在創(chuàng)建數(shù)據(jù)源的時(shí)候一般會(huì)定義好的。所以鏈接數(shù)據(jù)庫(kù),可看做2個(gè)部分,一個(gè)是創(chuàng)建數(shù)據(jù)源,再個(gè)是鏈接數(shù)據(jù)源。我們用自定義的數(shù)據(jù)窗口對(duì)象時(shí),選擇的是外部數(shù)據(jù)源,此時(shí)在畫(huà)板界面上,是先定義字段的屬性,再增加字段的。要分清PB中對(duì)象和類的區(qū)別:一般我們將window menu treeviewitem等就是“類”,專門(mén)作為一種數(shù)據(jù)類型來(lái)定義該類型的實(shí)例。而我們繼承是在原類的基礎(chǔ)上創(chuàng)建一個(gè)新類。New是創(chuàng)建新對(duì)象,不同與繼承。我們的PDM的代碼包CODE一般包含2個(gè)文件夾:Inte_pbr文件夾:里面存放的是程序運(yùn)行時(shí)需要的所有圖片,但是加載圖片進(jìn)去還不夠,它里面還有一個(gè)配置文件(INTEMAN.PBR;INTEPDM.PBR等),將每個(gè)圖片的路徑信息都寫(xiě)在了里面,只有這樣程序才能完全找到使用。這個(gè)文件夾要安裝到C盤(pán)下面,這是程序指定的路徑。因?yàn)樵诖a中的編譯對(duì)象中包含了這2個(gè)文件夾的路徑,所以當(dāng)編譯完成后生成的.pbd文件就包含了2部分的內(nèi)容。當(dāng)沒(méi)編譯只是運(yùn)行代碼時(shí),這個(gè)包就要放在指定路徑下了,不然運(yùn)行時(shí)圖片都不會(huì)顯示出來(lái)。另外一個(gè)就是我們代碼的安裝包了。當(dāng)你創(chuàng)建一個(gè)工作目標(biāo)(.pbt)后,它會(huì)自動(dòng)創(chuàng)建一個(gè)應(yīng)用庫(kù)(.pbl),我們創(chuàng)建和操作的對(duì)象就放在這個(gè)應(yīng)用庫(kù)下面。層次結(jié)構(gòu):—工作空間—目標(biāo) —應(yīng)用庫(kù)(多個(gè)) —對(duì)象(多個(gè))—目標(biāo)(多個(gè))一般一個(gè)工作目標(biāo)就是一個(gè)應(yīng)用程序,就是說(shuō)同一個(gè)目標(biāo)下不同應(yīng)用庫(kù)中的對(duì)象是可以互相訪問(wèn)的。同一目標(biāo)下的不同庫(kù)中的對(duì)象可以相同。不管是同一目標(biāo)還是不同目標(biāo)或是不同的庫(kù)中,我們都可以將有用的對(duì)象拷貝到指定的庫(kù)中。且一個(gè)工作目標(biāo)里面只有一個(gè)應(yīng)用庫(kù)中有且只能有一個(gè)(應(yīng)用對(duì)象)。我們創(chuàng)建的全局變量,它是在整個(gè)目標(biāo)(程序)中是有效的。應(yīng)用對(duì)象的屬性一般具有全局性,所以要慎重設(shè)置。我們?cè)赑B系統(tǒng)樹(shù)中創(chuàng)建的對(duì)象可以看做是一個(gè)實(shí)例對(duì)象,直接拿出去用,也可以看做一個(gè)類,用它來(lái)創(chuàng)建新的對(duì)象,新的對(duì)象將有原對(duì)象的所有屬性和事件、方法。不同對(duì)象中的控件名可以相同,不同庫(kù)中的對(duì)象名字可以相同,不同目標(biāo)的庫(kù)名也是可以相同的。但是,在一個(gè)目標(biāo)中,不要將庫(kù)名中的對(duì)象名取一樣的,這樣會(huì)出錯(cuò),因?yàn)橥荒繕?biāo)下的對(duì)象是可以相互訪問(wèn)的。在應(yīng)用對(duì)象中設(shè)置事務(wù)對(duì)象的連接屬性,與在DBprifile中添加DB是沒(méi)有關(guān)聯(lián)的。當(dāng)Return屬于某個(gè)腳本時(shí),就退出該腳本的運(yùn)行,當(dāng)它是某個(gè)腳本函數(shù)的代碼時(shí),則返回到調(diào)用該函數(shù)的位置。我們要清楚每個(gè)函數(shù)在各種情況下的用法。它是與控件連一起用的還是單獨(dú)可以用的,最好根據(jù)函數(shù)的功能和意思來(lái)分辨。我們要把形參當(dāng)作實(shí)際的值來(lái)看待。一定要注意每個(gè)函數(shù)的功能,以及他們之間的內(nèi)在聯(lián)系:例如:getfilesavename()它是打開(kāi)一個(gè)準(zhǔn)備要保存的文件路徑對(duì)話框,它返回路徑名和文件名,除此之外不做其他的操作。又如oleobject的saveas():它是將文件保存到一個(gè)指定路徑,當(dāng)這個(gè)路徑和getfilename()的路徑不相符時(shí)或沒(méi)有傳遞時(shí),它就會(huì)報(bào)錯(cuò)而不能保存。又如PB中的saveas()它不關(guān)前面的getfilesavename(),它的功能就是打開(kāi)保存對(duì)話框,保存到指定位置進(jìn)行保存。我們所用的對(duì)象其實(shí)就是一堆視圖化的代碼,當(dāng)我們想要改變某個(gè)對(duì)象的屬性或內(nèi)容時(shí),可以直接編輯他們的源代碼:Editsource.當(dāng)我們?cè)诙x函數(shù)時(shí),規(guī)定了返回類型,則它會(huì)要求你返回一種類型。 所以,如果不想返回值,則在定義的時(shí)候在返回值上填(none)我們用戶定義事件其實(shí)分2種情況:通過(guò)事件ID調(diào)用windows已經(jīng)存在的事件。此時(shí)各項(xiàng)參數(shù)都是設(shè)置好的,只需要設(shè)置名字。將事件ID設(shè)置為(none),此時(shí)我們就可以自己設(shè)置事件的各項(xiàng)參數(shù)了,此時(shí)可以說(shuō)才是真正的用戶事件。在pb中觸發(fā)事件有2種方法:通過(guò)我們手動(dòng)的操作,來(lái)觸發(fā)相應(yīng)的事件。通過(guò)TriggerEvent()或者Postevent()來(lái)觸發(fā)。Object.TriggerEvent(clicked!)是立即觸發(fā)用戶指定的事件,在繼續(xù)調(diào)用下面的事件,屬于同步調(diào)用。Object.Postevent(clicked!)是將用戶指定的事件放置到指定控件事件隊(duì)伍中的末尾,等所有的事件都完畢后再執(zhí)行該指定事件,屬于異步調(diào)用事件。Object.triggerevent(‘ue_delete’) 當(dāng)執(zhí)行的是用戶自定義的事件時(shí),則要加上引號(hào),而不是以感嘆號(hào)結(jié)尾。dw_department.eventtriggerue_delete()w_main_frame.eventpostue_paint()這是CB控件clicked事件的一段腳本??梢?jiàn),ue_delete()是dw_department對(duì)象的事件,現(xiàn)在是放在CB的clicked事件中去觸發(fā)dw_department對(duì)象的ue_delete()事件??梢?jiàn),事件是屬于對(duì)象的,所以前面要加限制。他們通過(guò)ODBC連接的數(shù)據(jù)源時(shí),在PB中是通過(guò)事務(wù)對(duì)象連接的ODBC的數(shù)據(jù)源,而在我們配置數(shù)據(jù)源時(shí)就定義好了要連接的數(shù)據(jù)庫(kù)。我們?cè)赑B中對(duì)數(shù)據(jù)進(jìn)行的修改操作基本都是對(duì)緩沖區(qū)進(jìn)行的。我們要區(qū)別緩沖區(qū)的數(shù)據(jù)和數(shù)據(jù)窗口顯示的數(shù)據(jù),大多情況緩沖區(qū)會(huì)直接反應(yīng)到數(shù)據(jù)窗口上,但要注意區(qū)分開(kāi)來(lái)。在pb中建的DBfile文件數(shù)據(jù)庫(kù),并不是使我們開(kāi)發(fā)的應(yīng)用與數(shù)據(jù)源連接,但是它將數(shù)據(jù)庫(kù)直接反應(yīng)到PB中來(lái)了,我們可以直接在這里對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,而不用跑去修改本身的數(shù)據(jù)庫(kù)。記住,我們用事務(wù)對(duì)象連接的是數(shù)據(jù)源,DBfile是數(shù)據(jù)庫(kù)的顯示。所以,我們通過(guò)對(duì)DBfile的修改來(lái)直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改。我們連接一個(gè)DBfile只是可以對(duì)其進(jìn)行操作,同時(shí)也必須要連,因?yàn)槲覀兲幚頂?shù)據(jù)時(shí)要進(jìn)行語(yǔ)法效驗(yàn),如果不連的話在保存時(shí)會(huì)報(bào)錯(cuò)。因?yàn)樵谖覀儧](méi)有運(yùn)行代碼時(shí),代碼中連接數(shù)據(jù)庫(kù)的代碼根本就沒(méi)有執(zhí)行,故沒(méi)有連到數(shù)據(jù)庫(kù)中,所以,進(jìn)行語(yǔ)法效驗(yàn)時(shí)是根據(jù)DBfile中連接的數(shù)據(jù)庫(kù)進(jìn)行效驗(yàn)的。所以,以后每次都要連上DBfile文件。我們創(chuàng)建數(shù)據(jù)窗口對(duì)象時(shí),會(huì)有標(biāo)題名和內(nèi)容名,內(nèi)容名就是我們數(shù)據(jù)庫(kù)表的字段名字,而標(biāo)題名一般是表的字段名字加上“_t”,,但是這是對(duì)象的名字,我們還要給標(biāo)題的每個(gè)對(duì)象設(shè)置文本內(nèi)容。別把對(duì)象的名字和存在的內(nèi)容搞混了~~~!用游標(biāo)讀取數(shù)據(jù)時(shí),讀取一行就要用sqlcode進(jìn)行檢查一邊:當(dāng)為0時(shí),這成功讀取了當(dāng)前的一條數(shù)據(jù)當(dāng)為-1時(shí),讀取錯(cuò)誤當(dāng)為100時(shí),則表示都讀取完了當(dāng)使用游標(biāo)和存儲(chǔ)過(guò)程時(shí),十分注意commit和rollback的使用,因?yàn)樗麄儗㈥P(guān)閉兩者的使用。只要是對(duì)象,一般都是可以繼承的。菜單的工具欄只能顯示在MDI窗口中。我們的全路徑是目錄\文件名。所以目錄是沒(méi)有“\”的。fileopen()以指定的方式打開(kāi)指定的(存在或不存在)文件,可讀或可寫(xiě)返回句柄Fileopen(filepath,streammode!,write!,lockwrite!,replace!)此時(shí)表示,如果該路徑文件已經(jīng)存在,那么就覆蓋該文件。此時(shí)一定要注意:當(dāng)是以寫(xiě)的方式打開(kāi)(write!)時(shí),它一定會(huì)重新創(chuàng)建一個(gè)空文件,如果路徑已經(jīng)存在,且有replace!,那么該空文件就會(huì)覆蓋指定文件。如果路徑不存在,那么就會(huì)創(chuàng)建新的指定空文件。當(dāng)是以讀的方式打開(kāi)時(shí),它不會(huì)創(chuàng)建新的文件,而是讓你指定要打開(kāi)的文件。當(dāng)lockwrite!時(shí),你可以看該文件當(dāng)lockread!時(shí),你就不能看該文件了OleObjectWord=CreateOLEObjectli_Ret=OleObjectWord.ConnectToObject("","word.application")IFli_Ret<>0THENli_Ret=OleObjectWord.ConnectToNewObject("word.application")//沒(méi)有打開(kāi)則新建 ifli_Ret<>0then MessageBox('OLE錯(cuò)誤','OLE無(wú)法連接,錯(cuò)誤ID:'+string(li_Ret)+'可能是Word安裝不正確!') endifendifOleObjectWord.Documents.Add()此時(shí),上面值是連接了操作的對(duì)象。只有當(dāng)OleObjectWord.Documents.Add()時(shí)才會(huì)打開(kāi)一個(gè)新的文件。此時(shí)它就會(huì)成為當(dāng)前活動(dòng)對(duì)象。OleObjectWord.ConnectToObject("實(shí)例路徑","指定的服務(wù)器應(yīng)用程序")也就是說(shuō):實(shí)例路徑,就是你要操作的文件全路徑服務(wù)器應(yīng)用程序,就是支持文件的應(yīng)用程序。當(dāng)我們沒(méi)有實(shí)例路徑時(shí),它會(huì)對(duì)當(dāng)前活動(dòng)對(duì)象進(jìn)行操作當(dāng)有實(shí)例路徑時(shí),它就對(duì)指定路徑的文件進(jìn)行操作。OleObjectWord.ConnectTonewObject("指定的服務(wù)器應(yīng)用程序")創(chuàng)建新的對(duì)象并連接到該對(duì)象上。此時(shí)就要注意了,它創(chuàng)建的應(yīng)用對(duì)象是空的,也就是說(shuō)它里面連空白都沒(méi)有。此時(shí)就要用OleObjectWord.Documents.Add()來(lái)增加操作空間。Saveas()既可用OLE對(duì)象,也可用于數(shù)據(jù)窗口對(duì)象2者的用法不一樣,具體情況具體分析。用于數(shù)據(jù)窗口對(duì)象時(shí),可以保存數(shù)據(jù)也可以保存統(tǒng)計(jì)圖。我們可以直接給一個(gè)表的字段定義主鍵,但是給表定義外鍵時(shí),同時(shí)也要指出是對(duì)應(yīng)的哪個(gè)表的主鍵。先找主鍵,在去聯(lián)系它的外鍵。我們?cè)谡{(diào)用外部函數(shù)前對(duì)其聲明時(shí),記住:一個(gè)聲明要寫(xiě)成一行。functionintFileExpand(stringInputFile,stringOutputFile)library"intedll.dll"(一行)subroutineFillMany(intserial_no,refstringpassword)library"intedll.dll"(一行)我們的事件一般都是定義好的,當(dāng)觸發(fā)該事件的時(shí)候,就執(zhí)行該事件中的腳本,我們是在腳本中寫(xiě)代碼,調(diào)用函數(shù)。當(dāng)是繼承對(duì)象后,它里面的事件和函數(shù)都會(huì)繼承過(guò)去,且不可修改,當(dāng)繼續(xù)加代碼時(shí),它會(huì)先執(zhí)行原有的代碼,再執(zhí)行新寫(xiě)的代碼。if keydown(keyenter!)then ifthis.text="" then return else uo_ok.setfocus() uo_ok.triggerevent(clicked!) endifendif可見(jiàn),觸發(fā)的按鍵以!來(lái)區(qū)分要出發(fā)事件時(shí),也是用事件名+!響應(yīng)式窗口一般是提示且必須執(zhí)行完才會(huì)繼續(xù)執(zhí)行的窗口,所以,當(dāng)它的事件執(zhí)行完時(shí),我們?cè)诖a結(jié)尾用close()來(lái)關(guān)掉它。要知道各種值的保存時(shí)間:實(shí)例變量:當(dāng)實(shí)例對(duì)象關(guān)閉時(shí),變量下次重置全局變量:當(dāng)程序結(jié)束下次再開(kāi)時(shí)重置。注意事件的觸發(fā)條件,如果不滿足就給它加代碼加以限制。ifisnull(ls_newcode)ortrim(ls_newcode)=''ortrim(lower(ls_newcode))='null'thenls_newcode=''注意判斷為空的幾種情況。Null要加引號(hào)用。注意用戶對(duì)象的使用:例如標(biāo)準(zhǔn)可視用戶對(duì)象,它其實(shí)就是一個(gè)控件,但是我們使用它的時(shí)候它會(huì)在窗口界面創(chuàng)建屬于該對(duì)象的控件,而不是對(duì)象本身。所以,千萬(wàn)注意對(duì)象名和你創(chuàng)建的對(duì)象控件名字。要理解這樣就可以重復(fù)使用了。注意可視對(duì)象和不可視對(duì)象引用的方法:getitemstring()、getitemnumber()它是得到數(shù)據(jù)窗口中(主緩沖區(qū))某項(xiàng)的數(shù)據(jù),注意類型Setitem()它是給數(shù)據(jù)窗口中(主緩沖區(qū))的某項(xiàng)賦值,針對(duì)的是緩沖區(qū)的。類型為Any類型。Settext()它是給浮動(dòng)數(shù)據(jù)窗口賦值,而不反應(yīng)到緩沖區(qū)里。其值要與所在列類型相兼容。當(dāng)用setitem()賦值后,要反應(yīng)到浮動(dòng)數(shù)據(jù)窗口中,這要移動(dòng)焦點(diǎn)或在代碼中調(diào)用Accepttext()函數(shù)。Accepttext()是將漂浮在數(shù)據(jù)窗口中的內(nèi)容放到緩沖區(qū)里去。(必須通過(guò)有效驗(yàn)證。)注意它的用法,當(dāng)焦點(diǎn)從漂浮數(shù)據(jù)窗口中的一項(xiàng)移到另一項(xiàng)時(shí),系統(tǒng)自動(dòng)會(huì)將漂浮狀態(tài)的數(shù)據(jù)反應(yīng)到緩沖區(qū)。但是,當(dāng)焦點(diǎn)從當(dāng)前漂浮數(shù)據(jù)窗口移到其他控件時(shí),則漂浮數(shù)據(jù)是不會(huì)反應(yīng)到緩沖區(qū)的,所以,我們一般在數(shù)據(jù)窗口的Losefocus()事件中用到此函數(shù)。記?。涸O(shè)置焦點(diǎn)一般是以對(duì)象為單位的。不要在Itemchanged或ItemErrorevent中編寫(xiě)Acceptext()函數(shù),因?yàn)锳cceptext()函數(shù)有可能驅(qū)動(dòng)ItemChanged或ItemErrorevent,這將造成死循環(huán)的出現(xiàn).

GetText():讀取編輯控件的文字.String(date,{fomate})將數(shù)據(jù)以指定格式轉(zhuǎn)換成字符串。String(ll_id,’00’) Ifll_id=1, returnll_id 則ll_id=01insertrow()dw_1.insertrow(0)它是在最后一行后再插入一行。dw_1.insertrow(row)是插入到第row行,就是在第row行前面再插入一行,也就變成了第row行了。返回值是行號(hào)。注意對(duì)象的繼承層次:當(dāng)dw_2繼承dw_1后,就有了它的所有事件和屬性,而且,我們可以對(duì)dw_2中的事件和屬性繼續(xù)修改。當(dāng)dw_3繼承了dw_2后,dw_3就有了dw_2和dw_1所有的事件和屬性,此時(shí)用到dw_3時(shí)就會(huì)出現(xiàn)層次性,看見(jiàn)不同層次時(shí)的對(duì)象代碼。我們創(chuàng)建了的用戶對(duì)象,將它丟到窗口中用時(shí),其實(shí)就是一種繼承,繼承過(guò)來(lái)的對(duì)象就有原對(duì)象的所有事件和屬性。繼承后的對(duì)象就是一個(gè)新的對(duì)象了。數(shù)據(jù)窗口對(duì)象類型:Grid時(shí),它的列排列順序是不能改的。environmentle_env 環(huán)境對(duì)象getentironment(le_env) 用這個(gè)函數(shù),應(yīng)用程序能夠得到當(dāng)前運(yùn)行的操作系統(tǒng)、使用的CPU類型、操作系統(tǒng)的版本、屏幕的大小和顏色數(shù)等信息。 成功返回1.profilestring(文件名(包含路徑),section,key,default)section:指定要得到值所在的節(jié)。key:指定要得到值的名稱(理解值的名稱,其實(shí)就是包含某個(gè)值的變量名)default:指定的文件、節(jié)名、項(xiàng)目不存在時(shí),函數(shù)返回該參數(shù)指定的值。成功返回指定的key值,錯(cuò)誤返回default的默認(rèn)值。就是:文件名,節(jié)名,值名,默認(rèn)值grouser=createu_userifNotIsValid(guo_user)then haltclose returnendif可見(jiàn),我們?cè)趧?chuàng)建用戶對(duì)象時(shí),最好是判斷它是否創(chuàng)建成功,很容易找到錯(cuò)誤。getapplication()得到當(dāng)前應(yīng)用對(duì)象的句柄,通過(guò)句柄來(lái)查詢或修改應(yīng)用對(duì)象的屬性。Applicationapp先定義一個(gè)應(yīng)用的變量App=getapplication()App.toolbartips=false 也可以直接:getapplication.toolbartips=false可知,應(yīng)用對(duì)象中修改工具欄屬性和修改字體屬性可以影響到全局窗口風(fēng)格。this.hide()iuo_timer=createu_timerguo_ge.uf_get_toolbar_profile("w_main_frame",this)PostEvent("ue_open")注意這段代碼,這的窗口w_main_frame中open()事件的一段腳本。其中,this就是代表了窗口w_main_frame,但是一定要注意參數(shù)傳遞的數(shù)據(jù)類型,同時(shí)也要注意引號(hào)的恰當(dāng)使用:(“”)。W_main_frame本身代表了窗口,但是給它加上引號(hào)后,那么它傳遞的就不是一個(gè)窗口數(shù)據(jù)類型了,我們知道窗口本身就是一種數(shù)據(jù)類型,而不是一個(gè)字符串。只有this傳遞的才是一個(gè)窗口。所以,一定要注意參數(shù)的類型和引號(hào)的使用。以及它本身代表了什么意思。如:as_window_name=”w_main_frame”我們可以this.text=’1’也可以w_main_frame.text=’1’但就是不能as_window_name.text=’1’因?yàn)閍s_window_name它是一個(gè)字符串類型,而不是對(duì)象類型。所以,在使用數(shù)據(jù)或類型時(shí),一定要注意類型的匹配。Datawindowchild是子數(shù)據(jù)窗口對(duì)象,也是一種數(shù)據(jù)類型。opensheetwithparm(對(duì)象1,string,對(duì)象2,位置,放置方式)對(duì)象1:要打開(kāi)工作表的窗口對(duì)象。Eg:w_main_child沒(méi)有引號(hào)String:不定,會(huì)將這個(gè)值保存到消息對(duì)象的Message.stringparm中。對(duì)象2:主窗口位置:就是將打開(kāi)工作表的標(biāo)題放到倒數(shù)第二個(gè)菜單中,作為選項(xiàng)。放置方式:打開(kāi)工作表放置主窗口的位置。傳遞的數(shù)據(jù)就只有3類型:數(shù)值類型 Message.DoubleParmPowerObject(比如結(jié)構(gòu))Message.PowerObjectParm字符串類型 Message.StringParm傳遞的參數(shù)就保存在Message的這3個(gè)屬性中,在子窗口中就可以將傳遞過(guò)來(lái)的數(shù)據(jù)保存下來(lái)。當(dāng)我們定義函數(shù)時(shí),在選擇傳遞參數(shù)的類型時(shí),注意傳遞參數(shù)的返回值,當(dāng)是值傳遞時(shí),他們是互不影響的。當(dāng)是reference時(shí),則表示是地址傳遞,他們的值是相互影響的。他們的變量名不一樣,但是他們的值是一樣的。且相互影響。注意:我們?cè)诖a中用到的字段名子,是數(shù)據(jù)窗口對(duì)象內(nèi)容的標(biāo)題名字,而不是標(biāo)題的名字,更不是標(biāo)題內(nèi)容的名字。動(dòng)態(tài)SQL語(yǔ)句:ls_sqlsyn_id="selectpv_objidfromdm_psetvalue_"+string(ll_psetid)+& "wherepv_codelike"+trim(ls_cucode)+"AND"+"(pv_objid<>"+string(ll_partid)+")"PREPARESQLSAFROM:ls_sqlsyn_id;DECLARElcr_cur_id DYNAMICCURSORFORSQLSA;OPENDYNAMIClcr_cur_id USINGDESCRIPTORSQLSA;dowhiletruefetchlcr_cur_idINTO:ll_partid; ifsqlca.sqlcode=0then ll_cnt_id++ ll_id[ll_cnt_id]=ll_partid elseifsqlca.sqlcode=100then exit else guo_ge.uf_warn_db_error() closelcr_cur_id; return endifloopcloselcr_cur_id;一定要注意類型,當(dāng)是string時(shí)則拿出來(lái)直接寫(xiě),當(dāng)不是string時(shí),則強(qiáng)制轉(zhuǎn)換后拿出來(lái)直接寫(xiě)。我們定義的用戶對(duì)象可以包含屬性,事件,函數(shù):用戶對(duì)象的屬性,其實(shí)就是它定義的實(shí)例變量。我們不用返回?cái)?shù)據(jù)closewithreturn()函數(shù),它會(huì)出現(xiàn)不可知的問(wèn)題,我們一般在它的某個(gè)事件中用Close()將它關(guān)閉,同時(shí)在的close()事件中用:Message.powerobjectparm=powerobject來(lái)傳出數(shù)據(jù)。同時(shí)一般將數(shù)據(jù)類型定義成實(shí)例類型,這樣就可以在不同對(duì)象中使用了。我們用openwithparm()函數(shù)時(shí),一定要注意打開(kāi)窗口的類型,當(dāng)打開(kāi)的是response!相應(yīng)式窗口時(shí),則它一定會(huì)執(zhí)行完openwithparm()函數(shù)的所有事件和代碼才會(huì)繼續(xù)執(zhí)行下去。而打開(kāi)的窗口是其他類型的窗口時(shí),則會(huì)在打開(kāi)窗口的同時(shí)喜劇執(zhí)行下面的代碼,所以要注意窗口的類型和代碼執(zhí)行的時(shí)間。在我們腳本中定義數(shù)組的時(shí)候,不要將同類型的數(shù)組名和變量名寫(xiě)成相同的。我們用distinct時(shí),一般只對(duì)查詢的第一字段使用,其他的都不需要。"selectdistinctcode,name,partidfromtb_gygck"+& "wherecodelike"+"~'%"+ls_code_name+"%~'ornamelike"+"~'%"+ls_code_name+"%~'"我們一定注意值為空(null)的情況,當(dāng)一個(gè)null值的變量取判斷條件是否成立時(shí),它都會(huì)滿足條件的。:Setnull(code) code>0或者code<0都會(huì)判斷其成立的。對(duì)于新的數(shù)據(jù)窗口,開(kāi)始時(shí)是沒(méi)有行的,你要用:fori=1toll_total ll_row=dw_data.insertrow(0) dw_data.setitem(ll_row,'partid',al_partid) dw_data.setitem(ll_row,'ord',ll_ord[i])所以,要用插入一行來(lái)賦值。當(dāng)我們?cè)谧霾樵兇翱跀?shù)據(jù)的時(shí)候,一定要在可以多次查詢控件的前面加上datawindow.reset()。因?yàn)?,如果?shù)據(jù)不清掉,在多次查詢的時(shí)候會(huì)產(chǎn)生數(shù)據(jù)的疊加。我們一定要注意“樹(shù)控件”,我們加載了一個(gè)樹(shù)控件后,里面是什么都沒(méi)有的,此時(shí)我們就要建treeviewitem定義樹(shù)視圖節(jié)點(diǎn),然后在將該節(jié)點(diǎn)加載到樹(shù)控件中,這樣才是真的樹(shù)功能了。~每個(gè)樹(shù)都有唯一的一個(gè)樹(shù)根,及tree.level=0,表示樹(shù)根,其他的都算是節(jié)點(diǎn)。創(chuàng)建樹(shù)根和樹(shù)節(jié)點(diǎn)方法一樣,只是level表示的值不一樣。一定要注意定義樹(shù)的變量:treeviewitemltv_current我們把它想成一個(gè)結(jié)構(gòu)體類型的緩沖區(qū)變量。當(dāng)我們對(duì)這個(gè)變量的屬性定義好后,用Insertitemfirst()就能將這個(gè)變量作為一個(gè)節(jié)點(diǎn)實(shí)例化,同時(shí)返回該實(shí)例的句柄。此時(shí)我們?cè)谌⌒薷脑撟兞渴遣粫?huì)改變?cè)浔?jié)點(diǎn)的,除非再次用Setitem()才能對(duì)該節(jié)點(diǎn)操作,用insertitemfirst()只會(huì)實(shí)例化另外一個(gè)節(jié)點(diǎn)。Constructor事件:該事件在控件創(chuàng)建時(shí)觸發(fā)選中該事件主要用來(lái)插入第一層TreeViewItem項(xiàng),這樣用戶一進(jìn)入檢索界面,第一層信息項(xiàng)就會(huì)出現(xiàn)在控件中。ItemPopulate事件:該事件在某TreeViewItem項(xiàng)第一次展開(kāi)時(shí)觸發(fā),觸發(fā)的同時(shí)系統(tǒng)會(huì)將該TreeViewItem項(xiàng)的句柄通過(guò)參數(shù)handle傳遞過(guò)來(lái)。此時(shí)就要理解了,因?yàn)榇蜷_(kāi)程序就會(huì)觸發(fā)Constructor事件,我們?cè)谒锩娴淖詈笕绻昧薳xpanditem()的話,則如果有子節(jié)點(diǎn)就會(huì)自動(dòng)展開(kāi)。此時(shí),如果我們?cè)贗temPopulate事件中設(shè)置了子節(jié)點(diǎn),則因?yàn)镃onstructor事件中的expanditem會(huì)自動(dòng)展開(kāi),此時(shí)馬上觸發(fā)該事件,而且會(huì)根據(jù)是哪個(gè)節(jié)點(diǎn)觸發(fā)了該節(jié)點(diǎn)的展開(kāi)事件從將其句柄傳過(guò)來(lái),所以一定要注意代碼和事件執(zhí)行的流程。Handle()ReturnvalueLong.Returnsthehandleofobjectname.IfobjectnameisanapplicationandpreviousisTRUE,Handlereturns0ifthereisnopreviousinstance.Ifobjectnamecannotbereferencedduringexecution,Handlereturns0(forexample,ifobjectnameisawindowandisnotopen). 可見(jiàn),只有是可見(jiàn)的實(shí)例才有句柄。 Pb中動(dòng)態(tài)調(diào)用函數(shù)目前流行的大部分應(yīng)用程序中都提供了Undo功能,在PowerBuilder中也可以利用Undo()函數(shù)實(shí)現(xiàn)該功能。Undo()函數(shù)可用于DataWindow,EditMask,MultiLineEdit,RichTextEdit和SingleLineEdit對(duì)象,如果只對(duì)某一個(gè)對(duì)象進(jìn)行Undo操作,只需在Undo菜單項(xiàng)的單擊事件中鍵入如下腳本:Objectname.undo(),但是當(dāng)窗口中有多個(gè)對(duì)象,我們?cè)诰帉?xiě)腳本時(shí)并不知道要對(duì)哪個(gè)對(duì)象執(zhí)行undo()操作

如何解決這一問(wèn)題呢?在PowerBuilder中,undo()等函數(shù)只能用于可視對(duì)象,而所有可視對(duì)象均繼承自系統(tǒng)對(duì)象類GraphicObject。因此我們可以定義一個(gè)GraphicObject對(duì)象的實(shí)例變量go_object,等到運(yùn)行時(shí)再用getfocus()函數(shù)確定具體操作對(duì)象。然后用Typeof()函數(shù)確定當(dāng)前對(duì)象的類型,再用Choosecase語(yǔ)句根據(jù)不同的類型引用不同的實(shí)例變量,代碼如下:記住,用go_object=getfocus()得到的是當(dāng)前得到焦點(diǎn)對(duì)象的引用。

graphicobjectgo_object

DataWindowdw_object

EditMaskem_object

MultiLineEditmle_object

RichTextEditrte_object

SingleLineEditsle_object

go_object=getfocus()

choosecaseTypeOf(go_object)

caseDataWindow!

dw_object=go_object

dw_object.undo()

caseEditMask!

em_object=go_object

em_object.undo()

caseMultiLineEdit!

mle_object=go_object

mle_object.undo()

caseRichTextEdit!

rte_object=go_object

rte_object.undo()

caseSingleLineEdit!

sle_object=go_object

sle_object.undo()

caseelse

messagebox("Error","Cannotundo")

endchoose

其實(shí)我們可以用動(dòng)態(tài)調(diào)用函數(shù)的方法簡(jiǎn)單地解決這一問(wèn)題(只需三行代碼),即對(duì)GraphicObject對(duì)象調(diào)用undo()函數(shù),然后在函數(shù)名前加上關(guān)鍵字Dynamic。因?yàn)閷?duì)象類GraphicObject并沒(méi)有undo()這個(gè)對(duì)象函數(shù),如果不加關(guān)鍵字Dynamic,編譯時(shí)就會(huì)出現(xiàn)錯(cuò)誤。使用了Dynamic關(guān)鍵字,PowerBuilder在編譯時(shí)不檢查該函數(shù)和所用參數(shù)的有效性,而到腳本運(yùn)行時(shí)才去檢查該函數(shù)。代碼如下:

GraphicObjectgo_object

go_object=getfocus()

go_object.dynamicundo()parentwindow.postdynamiceventue_whole_input()這是一個(gè)目錄的單擊事件,可見(jiàn),此時(shí)這個(gè)目錄還沒(méi)有依賴窗口,所以就要用動(dòng)態(tài)的觸發(fā)以后依賴窗口中的事件。當(dāng)我們?cè)跀?shù)據(jù)窗口對(duì)象中給每個(gè)字段的backcolour填寫(xiě)了表達(dá)式時(shí),一般就會(huì)在clicked事件中對(duì)數(shù)據(jù)窗口的每行顯示出來(lái),但是,有的時(shí)候會(huì)顯示不出來(lái),那是因?yàn)闆](méi)有在數(shù)據(jù)窗口對(duì)象中給相應(yīng)的字段設(shè)置Taborder順序值,此時(shí),他們的order值是0的,故相當(dāng)于沒(méi)有焦點(diǎn),相當(dāng)與沒(méi)有做操作。同時(shí),當(dāng)我們的某個(gè)字段是下拉列表或數(shù)據(jù)窗口時(shí),點(diǎn)擊時(shí)會(huì)出現(xiàn)下拉框,為了避免這種情況,我們也可以將相應(yīng)字段的order值設(shè)為0,此時(shí)只會(huì)顯示當(dāng)前值了。在我們?cè)跀?shù)據(jù)窗口中給某個(gè)字段設(shè)定下拉列表或數(shù)據(jù)窗口時(shí),可以設(shè)置實(shí)際值,和顯示值,注意其中的關(guān)聯(lián):比如說(shuō),要顯示某個(gè)人的名字,但是在數(shù)據(jù)里是用id來(lái)表示它,我們檢索出來(lái)的也是id,但是我們要得到它的名字,我們就可以考慮用該字段關(guān)聯(lián)相應(yīng)的數(shù)據(jù)窗口對(duì)象,注意:字段關(guān)聯(lián)的是數(shù)據(jù)窗口對(duì)象而不是數(shù)據(jù)窗口。所以,我們新建一個(gè)數(shù)據(jù)窗口對(duì)象,選擇2個(gè)字段,id和name,用id作為實(shí)際值,用name作為顯示值。本來(lái)這個(gè)數(shù)據(jù)窗口顯示的值為5,用了5后,這個(gè)數(shù)據(jù)窗口對(duì)象就根據(jù)5來(lái)找到對(duì)象的人名將其顯示出來(lái)。實(shí)質(zhì)上實(shí)際數(shù)據(jù)是沒(méi)有變的,但是相當(dāng)與用了2個(gè)數(shù)據(jù)窗口對(duì)象查詢語(yǔ)句。一定要注意在使用數(shù)據(jù)窗口的列名來(lái)取值時(shí),這個(gè)列名一定是數(shù)據(jù)窗口對(duì)象的內(nèi)容名,因?yàn)閺臄?shù)據(jù)庫(kù)中建數(shù)據(jù)窗口對(duì)象時(shí),當(dāng)一次引用2個(gè)表時(shí),他們的字段名字都會(huì)改變,變?yōu)楸砻幼侄蚊?,所以一定要注意。我們進(jìn)行連表創(chuàng)建數(shù)據(jù)窗口對(duì)象時(shí),他們其實(shí)就是一個(gè)select查詢語(yǔ)句,連表時(shí),就是用一中關(guān)聯(lián)將他們聯(lián)系起來(lái),這樣就會(huì)顯示對(duì)應(yīng)的值比如:表1中的id唯一,但是這個(gè)id創(chuàng)建了另一個(gè)表的多個(gè)use_id 表2中的user_id所以,當(dāng)我們連表時(shí),就給這2個(gè)字段指名關(guān)系,則在查詢時(shí),就會(huì)顯示對(duì)應(yīng)的數(shù)據(jù)值。 我們對(duì)數(shù)據(jù)窗口用retrieve()語(yǔ)句,其實(shí)就是執(zhí)行的數(shù)據(jù)窗口對(duì)象的sql語(yǔ)句,所以,能檢索什么出來(lái)主要看數(shù)據(jù)窗口對(duì)象的本身的sql語(yǔ)句。重點(diǎn):在用動(dòng)態(tài)select語(yǔ)句時(shí),一定要分清類型,此時(shí)的select語(yǔ)句中的字段是不用象查詢時(shí)要在變量名前加冒號(hào)的(:).ls_filter="where(ctsq_createtime>='"+string(ld_begindate,"yyyy-mm-dd")+"'andctsq_createtime<='"+string(ld_enddate,"yyyy-mm-dd")+"')"+”anduser_id=”string(llong_id)+“anduer_name=”+ls_name從上面就要看出,這個(gè)select的動(dòng)態(tài)語(yǔ)句,本身就是string類型的,所以不管是上面變量,都要現(xiàn)變?yōu)閟tring類型才能寫(xiě)入,其次,表的字段名字是沒(méi)有修飾的,而且類型任意,所以,而此時(shí)字段的類型就要和變量的類型一致,因?yàn)殚_(kāi)始的string的操作值是為將其能夠?qū)懭脒@個(gè)string類型的語(yǔ)句中,而在后臺(tái)操作時(shí),它就是一條實(shí)際的查詢語(yǔ)句,類型就要匹配所以,其實(shí)這是2個(gè)層次的類型匹配:一個(gè)是語(yǔ)句的string類型的匹配一個(gè)是字段屬性的匹配。datawindowchild ldw_childdw_data.getchild("cllx",ldw_child)“cllx”是指定子數(shù)據(jù)窗口所在的列。ldw_child.settrans(sqlca)ldw_child.retrieve()事先就檢索出來(lái)。注意,getchild()得到的是數(shù)據(jù)窗口對(duì)象的引用。此時(shí),就要注意,當(dāng)我們?cè)谥鲾?shù)據(jù)窗口中引用子數(shù)據(jù)窗口時(shí),不管主的是不是有sql語(yǔ)句:要注意,在子數(shù)據(jù)列上能否自動(dòng)檢索到數(shù)據(jù)有2中辦法:在數(shù)據(jù)窗口對(duì)象Edit畫(huà)板中有Autoretrieve選項(xiàng),夠上后就能自動(dòng)檢索到數(shù)據(jù),但是前提是它與事務(wù)對(duì)象連接了,因?yàn)檫@個(gè)選項(xiàng)只是起到檢索的作用。可以利用上述2.中的getchild得到子的引用,再進(jìn)行連接并檢索。此時(shí)如果主的與事務(wù)對(duì)象slqca相連,則子數(shù)據(jù)窗口不用與事務(wù)對(duì)象相連也能顯示出數(shù)據(jù)。如果主的沒(méi)有與事務(wù)對(duì)象相連,但是子數(shù)據(jù)窗口與事務(wù)對(duì)象相連了,則也會(huì)顯示出數(shù)據(jù)。注意:當(dāng)我們建的數(shù)據(jù)窗口對(duì)象是沒(méi)有sql語(yǔ)句時(shí),則我們不用使其對(duì)應(yīng)的數(shù)據(jù)窗口與事務(wù)對(duì)象相連,因?yàn)榕c事務(wù)對(duì)象相連就是能檢索到數(shù)據(jù),能檢索到數(shù)據(jù)就是因?yàn)橛衧elect的sql語(yǔ)句,本身就沒(méi)有sql語(yǔ)句,那么用事務(wù)對(duì)象也沒(méi)用,此時(shí),我們有幾種辦法給其賦值:一般在腳本中用setitem()給其賦值。利用下啦數(shù)據(jù)框或下拉列表來(lái)賦值。有數(shù)據(jù)窗口對(duì)象時(shí),則動(dòng)態(tài)建sql查詢條件語(yǔ)句用:dw_result.setsqlselect(select)沒(méi)有數(shù)據(jù)窗口對(duì)象時(shí),則先建數(shù)據(jù)窗口對(duì)象(源),再建sql查詢條件。我們知道,數(shù)據(jù)窗口對(duì)象本身是源,但是功能就象一條sql語(yǔ)句,當(dāng)數(shù)據(jù)庫(kù)連接好后,在數(shù)據(jù)窗口對(duì)象畫(huà)板中就能看到這條slq語(yǔ)句查詢出來(lái)的數(shù)據(jù)了,但是當(dāng)其與數(shù)據(jù)窗口聯(lián)合使用時(shí),要想顯示數(shù)據(jù)就必須使相應(yīng)的數(shù)據(jù)窗口與事務(wù)相連,然后再retrieve()。當(dāng)我們使用動(dòng)態(tài)的sql語(yǔ)句時(shí),即dw_result.setsqlselect(select)時(shí),就是為了數(shù)據(jù)窗口分配了查詢條件,只要數(shù)據(jù)窗口對(duì)象相應(yīng)的字段屬性匹配,就可以檢索出相應(yīng)的值。但是,我們?cè)O(shè)置的動(dòng)態(tài)sql只能設(shè)置where的條件,即檢索出相應(yīng)條件的數(shù)據(jù)條件,而不能改變每個(gè)字段本身的屬性,因?yàn)樽侄伪旧淼膶傩允菙?shù)據(jù)窗口對(duì)象創(chuàng)建時(shí)源的代碼定義的,我們所建立的動(dòng)態(tài)sql語(yǔ)句只是查詢條件。我們可以理解為,當(dāng)沒(méi)有給數(shù)據(jù)窗口分配數(shù)據(jù)窗口對(duì)象時(shí),我們動(dòng)態(tài)的分配查詢語(yǔ)句給它,是不夠的,因?yàn)闆](méi)有顯示數(shù)據(jù)的載體,此時(shí)首先給他動(dòng)態(tài)的創(chuàng)建數(shù)據(jù)窗口對(duì)象的源(實(shí)質(zhì)就是創(chuàng)建一個(gè)沒(méi)有sql查詢條件的數(shù)據(jù)窗口對(duì)象),其次再給它建sql查詢條件,即dw_result.setsqlselect(select),這時(shí)就相當(dāng)與給它動(dòng)態(tài)的分配了數(shù)據(jù)窗口對(duì)象,此時(shí)數(shù)據(jù)窗口連接事務(wù)對(duì)象再用retrieve()就可以檢索到相應(yīng)的數(shù)據(jù)。同時(shí),我們要注意,再動(dòng)態(tài)建立sql語(yǔ)句時(shí),如果有了數(shù)據(jù)窗口對(duì)象,我們只會(huì)建立好where條件,但是如果沒(méi)有數(shù)據(jù)窗口對(duì)象時(shí),我們建立的sql查詢語(yǔ)句就要根數(shù)據(jù)窗口對(duì)象的源代碼相對(duì)應(yīng)。 也就是說(shuō):源中有name字段,sql語(yǔ)句中也要有name字段,如果沒(méi)有,則都沒(méi)有。 因此,我們得到一個(gè)結(jié)論,動(dòng)態(tài)的創(chuàng)建數(shù)據(jù)窗口對(duì)象時(shí)一般沒(méi)有創(chuàng)建sql查詢條件,然后再創(chuàng)建sql查詢條件才能完整的顯示出數(shù)據(jù)。我們也可以在創(chuàng)建源時(shí)同時(shí)創(chuàng)建sql查詢條件,就象在new創(chuàng)建數(shù)據(jù)窗口對(duì)象時(shí)同時(shí)創(chuàng)建。我們最好是將所有的主數(shù)據(jù)窗口與事務(wù)對(duì)象相連。避免子數(shù)據(jù)窗口沒(méi)有顯示出數(shù)據(jù)的情況。為什么加載到列的子數(shù)據(jù)窗口對(duì)象能顯示出數(shù)據(jù),而不用檢索,那是因?yàn)樵趯傩皂?yè)面上點(diǎn)擊了Autoretrieve。我們一定要注意數(shù)據(jù)窗口對(duì)象的名字問(wèn)題:標(biāo)題名字內(nèi)容名字內(nèi)容名字對(duì)應(yīng)的在數(shù)據(jù)庫(kù)中的名字。標(biāo)題名字比內(nèi)容名字多了_t。記住,內(nèi)容名字不一定和數(shù)據(jù)庫(kù)中相應(yīng)的字段名字一樣:當(dāng)只有一個(gè)表時(shí),他們是一樣的當(dāng)是多表聯(lián)合時(shí)則內(nèi)容名字和數(shù)據(jù)庫(kù)名字是不一樣的。在數(shù)據(jù)窗口對(duì)象畫(huà)板中我們就可以看見(jiàn)內(nèi)容名字和對(duì)象的數(shù)據(jù)庫(kù)名字,此時(shí)就要注意:當(dāng)我們對(duì)數(shù)據(jù)窗口進(jìn)行操作時(shí),即getitemstring()就要用內(nèi)容的名字來(lái)操作代碼。但是我們是對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),即象select語(yǔ)句時(shí),就要用對(duì)應(yīng)的數(shù)據(jù)庫(kù)的名字來(lái)操作。所以,一定要注意名字問(wèn)題,同時(shí)注意多表聯(lián)合使用的情況。//動(dòng)態(tài)數(shù)據(jù)窗口

數(shù)據(jù)窗口對(duì)象語(yǔ)法:

ls_syntax=sqlca.syntaxFromSql('selectkind,namefromtab_t','style(type=tabular)',ls_err1)

dw_1.create(ls_syntax,ls_err2)

dw_1.setTransObject(sqlca)

dw_1.retrieve()//在程序中動(dòng)態(tài)設(shè)定列的編輯風(fēng)格為下拉數(shù)據(jù)窗口(DropDownDataWindow)

//假設(shè)所設(shè)定列為部門(mén)號(hào)"department_id",相關(guān)連的子數(shù)據(jù)窗口為"d_dddw_dep",

//顯示列為部門(mén)名稱"dept_name",數(shù)據(jù)列為部門(mén)號(hào)"dept_id",實(shí)現(xiàn)方法如下:

dw_1.Modify("department_id.DDDW.Name=d_dddw_dep")

dw_1.Modify("department_id.DDDW.DisplayColumn='dept_name'")

//或:

dw_1.object.department_="d_dddw_dep"

dw_1.object.department_id.DDDW.DisplayColumn="dept_name"

//注:PowerBuilder有一個(gè)小工具DWSyntax(程序名為:dwsyn60.exe),提供了獲得及修改數(shù)據(jù)窗口、列等的各項(xiàng)屬性值的語(yǔ)法,對(duì)編程非常有幫助。上述腳本在DWSyntax中都能找到。//如何將COLUMN的顯示風(fēng)格在EDIT、DDDW、DDLB之間相互切換:

(1)切換成DDDW:

dw_1.Modify("#1.dddw.Name='dddw_jg'")

dw_1.Modify("#1.dddw.DisplayColumn='name_jg'")

dw_1.Modify("#1.dddw.DataColumn='id_jg'")

(2)切換成DDLB:

dw_1.Modify("#1.ddlb.case='any'")

dw_1.Object.#1.Values="red~t1/white~t2"

(3)切換成EDIT:

dw_1.Modify("#1.edit.case='any'")

dw_1.Modify("#1.edit.AutoSelect='Yes'")

(4)獲取當(dāng)前風(fēng)格:

dw_1.Describe("#1.Edit.Style")

(5)如果還不行,可能得要如下操作:

dw_1.Modify("#1.dddw.Name=''")一下;//如果符合條件,則顯示灰色的背景,否則白色;

本方法同樣可以設(shè)置該列的字體顏色:其中"column_name"為列名。

dw_1.object.column_name.background.color="16777215~tif(fromid='string',rgb(192,192,192),rgb(255,255,255))"

也可以是一行都變色:

dw_1.object.Datawindow.detail.color="16777215~tif(fromid='string',rgb(192,192,192),rgb(255,255,255))"http://超鏈接,連到指定的網(wǎng)站。

Inetlinet_base

GetContextService("Internet",linet_Base)

linet_Base.HyperlinkToURL('')

Destroy(linet_base)//如何取出DDDW中的DisplayColumn的內(nèi)容。

dw_1.describe("Evaluate('lookupdisplay(column_name)',1)")

//column_name=列名,'1'表示第一行;看看Help中的Describe我們?cè)趯?duì)MDI窗口時(shí),打開(kāi)時(shí)直接放中間用一個(gè)函數(shù),當(dāng)改變窗口的大小時(shí),就要在其Resize()事件中寫(xiě)一個(gè)函數(shù)來(lái)使其按比例縮放,即改變窗口大小,同時(shí)也要改變窗口中相應(yīng)控件的大小,做到比例一致。//怎樣得到字符串中漢字的個(gè)數(shù)

Fori=1toLen(aString)

ls_ch=Mid(aString,i,1)

IfAsc(ls_ch)>=128then //判斷是否是漢字可以用它的ASCII碼是否大于127來(lái)判斷。li_num++

i=i+1

Endif

Next補(bǔ)空行:分組表示,每多少行插入一空行來(lái)分組。

在窗口的open事件中寫(xiě)如下代碼:

longli_count,li_i

li_count=dw_1.retrieve()

ifmod(li_count,25)<>0then //求余

forli_i=1to25-mod(li_count,25)

dw_1.insertrow(0)

next

endif我們一定要注意實(shí)例變量或?qū)嵗龜?shù)組的值的滯留問(wèn)題,所以,一般在相應(yīng)的地方賦空。Dde是動(dòng)態(tài)數(shù)據(jù)交換服務(wù)器函數(shù)。我們一定要注意不同對(duì)象的實(shí)例變量的區(qū)別,特別是在調(diào)試時(shí)注意:當(dāng)在代碼中跳進(jìn)一個(gè)窗口函數(shù)時(shí),窗口對(duì)象定義的實(shí)例變量和這個(gè)函數(shù)中用到的實(shí)例變量是一致的,因?yàn)檫@個(gè)函數(shù)本身就屬于這個(gè)窗口。但是當(dāng)我們?cè)诖a中跳進(jìn)一個(gè)用戶函數(shù)時(shí),此時(shí)里面所有的實(shí)例變量都是屬于該對(duì)象的,特別注意用戶對(duì)象中定義的變量都是以i開(kāi)頭的,很容易以為是窗口對(duì)象中定義的實(shí)例變量,有時(shí)候名字都會(huì)一樣,此時(shí)就一定要注意了,這是不一樣的,要區(qū)別。子對(duì)象繼承父對(duì)象時(shí),用Call可以引用父對(duì)象的屬性和方法當(dāng)一個(gè)主窗口中,放了一個(gè)一級(jí)自定義對(duì)象,一級(jí)中又有二級(jí)自定義子對(duì)象,此時(shí)就會(huì)有3個(gè)層次的機(jī)構(gòu),此時(shí),大的都可以對(duì)小的屬性和事件進(jìn)行操作,但是小的卻不能對(duì)大的屬性和事件進(jìn)行操作。Commit:當(dāng)你對(duì)數(shù)據(jù)庫(kù)的值進(jìn)行修改或增加的時(shí)候,在PB中要進(jìn)行提交。可以看做是將數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行保存操作。所以,修改一次,一般就作一次Commit,多次修改,就多次提交。這樣就避免中間修改了,后面要用到該數(shù)據(jù)時(shí)進(jìn)行修改時(shí)而找不到正確的數(shù)據(jù)。當(dāng)我們?cè)赑B中進(jìn)行一次修改數(shù)據(jù)的時(shí)候,數(shù)據(jù)庫(kù)中也會(huì)做修改,但是沒(méi)有commit的數(shù)據(jù)在數(shù)據(jù)庫(kù)查看不到,但是PB中可以將修改后的數(shù)據(jù)查

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論