明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

PowerBuilder超級(jí)技巧8則

[摘要]本文介紹的方法和技巧都是筆者在實(shí)踐中的一點(diǎn)積累,在此拿出來與大家一起分享。希望在閱讀本文后會(huì)對(duì)您有所幫助或啟發(fā)。文中如有任何不足之處還望同行們給予指教。在此,我先道聲謝。   一、實(shí)現(xiàn)運(yùn)行窗口居中  眾所周知,PowerBuilder 7.0在以前的版本中提供了圖形化的預(yù)覽工具,可以很方便的在設(shè)計(jì)...
本文介紹的方法和技巧都是筆者在實(shí)踐中的一點(diǎn)積累,在此拿出來與大家一起分享。希望在閱讀本文后會(huì)對(duì)您有所幫助或啟發(fā)。文中如有任何不足之處還望同行們給予指教。在此,我先道聲謝。

  一、實(shí)現(xiàn)運(yùn)行窗口居中

  眾所周知,PowerBuilder 7.0在以前的版本中提供了圖形化的預(yù)覽工具,可以很方便的在設(shè)計(jì)階段實(shí)現(xiàn)窗口居中。但是,到了7.0似乎該項(xiàng)工具被取消了,也沒有什么屬性來設(shè)置,至少我沒有找到。每當(dāng)我們需要將窗口居中的時(shí)候只有一點(diǎn)一點(diǎn)地調(diào)整它的X,Y值,這一點(diǎn)十分讓人頭痛。出于無奈,只好通過編程實(shí)現(xiàn)。我們只在每個(gè)需要居中的窗口的Open事件中寫上這些代碼就會(huì)實(shí)現(xiàn)窗口的自動(dòng)居中。

  要實(shí)現(xiàn)窗口的自動(dòng)居中,我們可以用函數(shù)Move()來實(shí)現(xiàn)。但是,由于我們開發(fā)出來的應(yīng)用程序往往會(huì)在不同的設(shè)置環(huán)境中運(yùn)行,雖然一般情況下是由我們?yōu)橛脩襞渲煤玫模覀兛偛荒鼙WC用戶顯示器的設(shè)置模式不會(huì)改變。所幸的是,PB為我們提供了環(huán)境對(duì)象Environment,該對(duì)象其實(shí)是一個(gè)系統(tǒng)結(jié)構(gòu),其中保存了PB應(yīng)用程序的運(yùn)行平臺(tái)信息,例如,代碼集,CPU類型等。其中當(dāng)然會(huì)有我們需要的屏幕寬和高。為了得到該結(jié)構(gòu)我們可以用函數(shù)GetEnvironment()。該函數(shù)的作用是得到關(guān)于操作系統(tǒng),處理器和屏幕的系統(tǒng)信息。具體用法如下:

  Environment my_system

  Integer li_ScreenWidth, li_ScreenHeight

  GetEnvironment(my_system)

  // 得到屏幕的總寬度和長(zhǎng)度

  li_ScreenWidth = PixelsToUnits(my_system.ScreenWidth, XPixelsToUnits!)

  li_ScreenHeight = PixelsToUnits(my_system.ScreenHeight, XPixelsToUnits!)

  // 函數(shù)PixelsToUnits()的作用是將屏幕的像數(shù)轉(zhuǎn)換成PowerBuilder使用的單位,因?yàn)橄駭?shù)通常不用于方形中,具體用法請(qǐng)參見函數(shù)手冊(cè)。

  然后就可以用Move()來實(shí)現(xiàn)窗口居中。

  This.Move((li_ScreenWidth - this.Width)/2, &

   (li_ScreenHeight - this.Height)/2 )

  二、數(shù)據(jù)窗口中實(shí)現(xiàn)字段的組合

  你有沒有碰到這樣的情況,我們輸入了客戶的詳細(xì)地址資料,包括省份,城市,地址,郵編。當(dāng)我們要給客戶們郵寄信函時(shí)需要將他們的省份,城市,地址,郵編連成在一起打印出來。然而,這些信息是分開存儲(chǔ)的,即存在不同的字段。這時(shí)我們就可以利用PowerBuiler提供的在數(shù)據(jù)窗口添加計(jì)算域(Compute Field)來實(shí)現(xiàn)字符字段的組合顯示。

  現(xiàn)在假設(shè)客戶的省份,城市,地址,郵編分別存放在不同的字段中,它們是Province,City,Address,PC。我們要得到“郵編+省份+城市+地址”的格式,如:“(214001)江蘇省無錫市人民路1號(hào)。",具體實(shí)現(xiàn)如下:

  1、在需要顯示的位置添加一個(gè)計(jì)算域(Compute Field)

  2、在它的表達(dá)式欄中寫上“ '(' + PC + ' )' + Province + City + Address ”

  3、單擊確定完成。

  很容易是不是。需要提醒大家的是,計(jì)算域只能用來顯示,不能對(duì)它進(jìn)行修改,因?yàn)樗鼪]有TAB屬性,不能得到焦點(diǎn)。

  三、數(shù)據(jù)窗口中的條碼顯示

  在數(shù)據(jù)窗口中顯示條碼是不是很神秘?這對(duì)于沒有接觸過條碼的人來說也許是這樣。其實(shí),它簡(jiǎn)單的不能再簡(jiǎn)單了。別忘了我們?cè)趯懳母鍟r(shí)是如何使文稿看上去更有藝術(shù)化。沒錯(cuò)我們會(huì)給它用上各種字體。問題不就解決了嗎?條碼也是種字體,只不過我們看不懂罷了。我們只要將需要用條碼顯示的字段的字體換上相應(yīng)的條碼字體就行了,比如,常用的3 of 9條碼字庫(kù)等。這些字體大多數(shù)是免費(fèi)的,可以到網(wǎng)上去下載,然后安裝就行了。

  四、數(shù)據(jù)窗口的自動(dòng)刷新技術(shù)

  在我們編寫諸如像庫(kù)存,銷售等應(yīng)用系統(tǒng)時(shí),總希望程序能動(dòng)態(tài)的自動(dòng)刷新庫(kù)存量或銷售量,比如說每隔1秒刷新一次。要實(shí)現(xiàn)這樣的功能只要我們利用數(shù)據(jù)窗口的時(shí)間間隔屬性(Timer Interval),當(dāng)該值為0時(shí)數(shù)據(jù)窗口不進(jìn)行刷新,如果要使數(shù)據(jù)窗口以每一秒鐘的頻率刷新的話,只要將該值設(shè)為1000,即1000毫秒。

  我們還可以為應(yīng)用程序添加閃爍報(bào)警的功能。就拿庫(kù)存量來說吧,最常用的是當(dāng)某貨物的庫(kù)存量達(dá)到一個(gè)最低庫(kù)存量時(shí)程序應(yīng)能自動(dòng)判別,并用警告色顯示,通常是紅色。此時(shí),我們只要在運(yùn)用了上述的方法后再在需要閃爍的字段上,比如,庫(kù)存量,在它的顏色屬性中寫上相應(yīng)的語(yǔ)句。下面這段代碼實(shí)現(xiàn)“當(dāng)某一物品的庫(kù)存量小于20的時(shí)候,程序以紅色閃爍顯示警告”

  if ( Store_Num < 20, &

  if mod( Second(Now()), 2) <> 0, & // 每秒一次,偶數(shù)顯示紅色,奇數(shù)顯示白色,即底色

  RGB(255, 255, 255), RGB(255, 0, 0) )

  五、數(shù)據(jù)窗口中實(shí)現(xiàn)自動(dòng)折行

  有時(shí)為了界面的考慮需要將一些長(zhǎng)字段折行顯示,但又不能確保在所有情況下都會(huì)出現(xiàn)長(zhǎng)字段。比如,我們要求當(dāng)客戶地址超過50個(gè)字符時(shí)將它分兩行顯示,對(duì)于沒滿50個(gè)字符的客戶仍然按照正常格式顯示。

  具體如下:

  1、在數(shù)據(jù)窗口中選擇要自動(dòng)折行的列Address。

  2、選擇位置屬性(Position)并選中Autosize Height選項(xiàng)

  3、 選擇編輯屬性(Edit)并去掉Auto Horz Scroll選項(xiàng)

  4、選擇數(shù)據(jù)窗口中細(xì)目帶的屬性Autosize Height選項(xiàng)。注意,是當(dāng)你拖動(dòng)細(xì)目欄時(shí)出現(xiàn)的屬性。

  設(shè)置完畢后在左下角預(yù)覽窗口中將顯示圖例的結(jié)果。

  在進(jìn)行列自動(dòng)折行顯示的時(shí)候,還要注意一點(diǎn),系統(tǒng)判斷自動(dòng)折行的斷點(diǎn)是以空格或標(biāo)點(diǎn)符號(hào)為依據(jù)的,如果我們輸入一長(zhǎng)串字符且中間沒有任何標(biāo)點(diǎn)符號(hào)或空隔的話,即使該字符串再長(zhǎng)也無濟(jì)于事。因此,我們一定要提醒用戶在錄入時(shí)適當(dāng)?shù)募尤胍恍┛崭窕蚧剀嚒?

  六、數(shù)據(jù)窗口中記錄顏色的隔層顯示

  相信你一定見過這樣的顯示,第一行記錄的背景色是淺黃色,第二行記錄的背景色是白色,第三行又是淺黃色,第四行又是白色……,依次類推。

  要想讓顯示的數(shù)據(jù)達(dá)到上述效果,我們首先要知道的是這些數(shù)據(jù)存放在數(shù)據(jù)窗口中的什么地方。很顯然,數(shù)據(jù)窗口中的所有數(shù)據(jù)是在細(xì)目帶中列出的,因此只要在細(xì)目帶中設(shè)置一些數(shù)據(jù)屬性就會(huì)影響到這個(gè)細(xì)目帶中的所有內(nèi)容。具體實(shí)現(xiàn)如下:

  1、打開數(shù)據(jù)窗口,單擊細(xì)目帶(Detail),注意是點(diǎn)擊有“Detail”字的一欄,不是它存放數(shù)據(jù)的地方。點(diǎn)擊它鼠標(biāo)會(huì)出現(xiàn)上下小箭頭。

  2、選擇常規(guī)屬性,單擊顏色屬性(Color)旁邊的一個(gè)帶有紅色圖標(biāo)的小按鈕。

  3、在表達(dá)式一欄中輸入

  if ( Mod( GetRow(), 2) = 0, RGB(255, 255, 200), RGB(255, 255, 255))

  // RGB(255, 255, 200),淺黃色

  OK,預(yù)欄一下,效果不錯(cuò),大功告成。

  七、實(shí)現(xiàn)數(shù)據(jù)窗口的動(dòng)態(tài)排序

  在用到Windows的資源管理器的時(shí)候,當(dāng)我們需要按照文件的類型或名稱排序的時(shí)候只要用鼠標(biāo)點(diǎn)擊一下相應(yīng)的標(biāo)題欄,系統(tǒng)會(huì)按照升序或降序交替排序,這完全取決于用戶鼠標(biāo)點(diǎn)擊的奇偶數(shù)。如此方便的操作何不用到我們的數(shù)據(jù)窗口中——實(shí)現(xiàn)按某列的動(dòng)態(tài)排序。

  為了實(shí)現(xiàn)上述功能,程序首先需要用到一個(gè)全局變量(相對(duì)于PB來說可以用窗體變量),用它來控制連續(xù)兩次點(diǎn)擊之間的排序方向。因?yàn)樽侄蔚呐判蚍较蛑挥猩蚝徒敌騼煞N,所以我們可以用一個(gè)Boolean型。本例中是Boolean ib_flag。接著在數(shù)據(jù)窗口控件的Clicked事件中寫上如下代碼

  /*****************************程序代碼******************************/

  String ls_column, ls_sort

  ls_column = this.GetObjectAtPointer() // 得到鼠標(biāo)按下位置的對(duì)象名

  ls_column = left(ls_column, len(ls_column) - 2) // 得到列標(biāo)題名字

  if not Lower(right(ls_column, 2)) = "_t" then return

  // 如果不是缺省的列標(biāo)題,即以“_t”結(jié)尾或鼠標(biāo)根本沒有點(diǎn)在列標(biāo)題上則退出

  ls_column = left(ls_column, len(ls_column) - 2) // 去掉列標(biāo)題末尾的“_t”,得到有效的列標(biāo)題名

  // 進(jìn)行升序和降序的切換

  if ib_flag then

   ls_sort = ls_column + " A" // 升序

  else

   ls_sort = ls_column + " D" // 降序

  end if

  ib_flag = not ib_flag // 為下一次排序準(zhǔn)備

  ls_sort = ls_sort

  this.setsort(ls_sort)

  this.sort()

  /*****************************結(jié)束******************************/

  注:這里所敘述的數(shù)據(jù)窗口中列的動(dòng)態(tài)排序是以系統(tǒng)默認(rèn)的列標(biāo)題名為前提,即在標(biāo)題欄中列標(biāo)題名字是以“_t”結(jié)尾。

  八、設(shè)置系統(tǒng)時(shí)間

  在開發(fā)具有數(shù)據(jù)服務(wù)器的應(yīng)用軟件時(shí),有時(shí)為了使所有計(jì)算機(jī)的時(shí)間都保持相同,或者接近相同,主要是為了避免數(shù)據(jù)錄入時(shí)出現(xiàn)的時(shí)間差異,通常我們會(huì)在客戶機(jī)每次使用應(yīng)用軟件前將本地時(shí)間設(shè)置成跟服務(wù)器相同。從而確保輸入的數(shù)據(jù)在時(shí)間上具有較高的正確性。即,要實(shí)現(xiàn)系統(tǒng)時(shí)間的設(shè)置。下面就講述一下實(shí)現(xiàn)的過程。

  本程序是通過調(diào)用外部函數(shù)SetSystemTime()實(shí)現(xiàn)系統(tǒng)時(shí)間的設(shè)置,該函數(shù)返回布爾型。查閱一下有關(guān)參考手冊(cè)就會(huì)發(fā)現(xiàn)該函數(shù)需要一個(gè)表示系統(tǒng)時(shí)間結(jié)構(gòu)(Struct)的數(shù)據(jù)類型作為參數(shù)。此結(jié)構(gòu)的定義如下:

  struct _SYSTEMTIME {

    INT iYear;

    INT iMonth;

    INT iDayOfWeek;

    INT iDay;

    INT iHour;

    INT iMinute;

    INT iSecond;

    INT iMilliseconds; // 毫秒

  } str_SystemTime;

  要在程序中使用外部函數(shù)首先需要要進(jìn)行外部函數(shù)聲明,可以根據(jù)函數(shù)的使用范圍放在全局外部函數(shù)聲明區(qū)或局部外部函數(shù)區(qū)聲明。具體聲明如下:

  Function Boolean SetSystemTime(str_SystemTime str_MyTime) Library "Kernel32.dll"

  聲明之后就可以使用了。下面代碼實(shí)現(xiàn)將系統(tǒng)日期設(shè)置成“2000年8月10日”

  /*****************************程序代碼******************************/

  str_SystemTime str_MyTime

  // 給結(jié)構(gòu)賦值

  str_MyTime.iYear = 2000 // 2000年

  str_MyTime.imonth = 8 / /8月

  str_MyTime.iDay = 10 // 10日

  // 設(shè)置系統(tǒng)日期

  if SetSystemTime(ref str_MyTime)then

   Beep(1)

   MessageBox("提示","系統(tǒng)日期設(shè)置成功!")

  else

   Beep(1)

   MessageBox("提示","系統(tǒng)日期設(shè)置失!")

  end if

  /*****************************結(jié)束******************************/

  注意,如果只有日期沒有時(shí)間的話系統(tǒng)會(huì)將時(shí)間設(shè)置成默認(rèn)的上午8點(diǎn)整。設(shè)置系統(tǒng)的時(shí)間方法和設(shè)置日期類似,只要將結(jié)構(gòu)中的時(shí)、分、秒分別設(shè)置成想要的就行了。具體實(shí)現(xiàn)請(qǐng)讀者自己完成。

  至此,本文所講述的八個(gè)技巧到此結(jié)束。