pb中窗口操作技巧兩則

pb中窗口操作技巧兩則

辛曉輝

  powerbuilder是一個功能全面、性能優異的應用開發工具,但同時它也是一個結構體系複雜的系統,學習和掌握它都有一定的難度。我在實際工作中,總結了兩條窗口操作的技巧,現寫出來與大家共享。

  一、在下拉數據窗口中查找與輸入數據匹配的數據

  我們從下拉數據窗口中查找數據時,一般是需要從下拉數據窗口的第一行開始查找。如果下拉數據窗口中的數據很少,這樣查找很方便。但是,如果下拉數據窗口中的數據很多,用此法查找起來就會很麻煩。如果下拉數據窗口具有自動匹配功能,即將數據輸入該列時,該列的下拉數據窗口自動滾動到與輸入數據最匹配的第一個數據所在的行,並且高亮度顯示該行。這樣就可以在很短的時間內查找到用戶所需的數據,省去了用戶在下拉數據窗口中查找的麻煩,提高了輸入數據的準確性及查找相關數據的效率。實現這一功能,需在數據窗口控制(dw-1)的“editchanged”事件中寫入如下代碼:

  //定義變量

  string ls_search,ls_col_name,ls_type,ls_mach

  datawindowchild child

  long ll_count=1

  long ll_mthrow

  string ll_mthtext

  long ll_searchrow=0

  //判別當前列是否具有下拉數據窗口,如果不具有,則退出事件程序

  ls_col_name=dw_1.getcolumnname()

  if dw_1.getchild(ls_col_name,child)〈0 then

   return

  end if

  //獲得下拉數據窗口的顯示列及其類型

  ls_col_name=this.describe(ls_col_name+".dddw.displaycolumn")

  ls_type=child.describe(ls_col_name+".coltype")

  //獲得輸入到列中的文本

  ls_search=dw_1.gettext()

  if len(ls_search)=0 then

   return

  end if

  //找出下拉數據窗口中與輸入數據最匹配的行

  if ls_type="number" then

  do until ll_count〉child.rowcount()

   ll_mthrow=child.getitemnumber(ll_count,ls_col_name)

   if left(string(ll_mthrow),len(ls_search))=ls_search then

   ll_searchrow=ll_count

   exit

   else

   ll_count=ll_count+1

   end if

  loop

  else

  do until ll_count〉child.rowcount()

   ll_mthtext=child.getitemstring(ll_count,ls_col_name)

   if left(ll_mthtext,len(ls_search))=ls_search then

   ll_searchrow=ll_count

   exit

   else

   ll_count=ll_count+1

   end if

  loop

  end if

  if ll_searchrow〉0 then

  //下拉數據窗口中被選中的行以高亮度顯示

  child.setrow(ll_searchrow)

if ls_type="number" then

ls_mach=string(child.getitemnumber(ll_searchrow,ls_col_name))

dw_1.setitem(dw_1.getrow(),dw_1.getcolumn(),ls_mach)

else

   ls_mach=child.getitemstring(ll_searchrow,ls_col_name)

dw_1.setitem(dw_1.getrow(),dw_1.getcolumn(),ls_mach)

end if

  child.selectrow(ll_searchrow,true)

  end if

  注意,在帶有下拉數據窗口的列中,必須指定該列的“allow editing”屬性爲true。

  二、在窗口和用戶對象間實現信息交互的技巧

  在實際應用中經常需要將窗口對象的信息傳遞給該窗口引用的一個用戶對象,或者將用戶對象的參數傳遞給窗口對象。實現兩者之間的信息交互有很多方法與技巧,我在這裏介紹其中的三種方法。

  1.直接引用對象屬性

  實現窗口與用戶對象通信的最簡單方法是直接引用對象的屬性。例如,如果在窗口中有一個名爲uo_1的用戶對象控件,它關聯一個定製的可視用戶對象,這個定製的用戶對象有一個名爲sle_1的單行編輯器,則可以在窗口的腳本中編寫如下代碼:

  uo_1.sle_1.text=string(today())

  這種方法簡單,但是窗口和用戶對象之間的接口比較模糊。爲了保持在用戶對象和窗口之間有一個清晰的界面,最好通過函數和用戶事件來與用戶對象通信。

  2.使用函數實現窗口與用戶對象的通信

  當要從窗口傳遞信息給用戶對象時,首先在用戶對象描繪器中爲用戶對象定義一個用戶對象級的函數,它的訪問權限是public。接着爲該函數定義需要傳遞的輸入參數,這些參數的實際值來自於窗口對象。當把定義好的用戶對象放入窗口後,在窗口的腳本中調用該用戶對象級函數,把實際的信息值通過用戶對象函數的參數傳遞過去。這樣,用戶對象就可以處理窗口對象中的信息了。

  例如,定義一個可視用戶對象,其中包含一個單行編輯控件,當使用者在其中輸入字符串後,將所輸入的字符串傳送到窗口的單行編輯控件sle_1中。

  首先在窗口描繪器中定義一個窗口函數wf_1,它有一個參數sf,用於接受來自用戶對象的字符串。該函數體只有一條代碼,把接受的參數顯示在單行編輯控件sle_1中:

  sle_1.text=sf

  然後在用戶對象描繪器中定義一個可視用戶對象,包括一個單行編輯控件sle_u1,在sle_u1的modified事件中輸入下面的代碼:

  parent.f2(this.text)

  其中f2是用戶對象級函數。由於在用戶對象的控件中無法調用窗口的函數,所以先在用戶對象中調用用戶對象級的函數,將字符串傳遞給f2的參數,然後在f2中調用窗口函數wf_1。用戶對象函數f2的代碼如下:

  parent.dynamic wf_1(ff)

  注意其中的dynamic關鍵字不能省略。這是因爲,在用戶對象描繪器中無法確定該用戶對象所在窗口是否有此函數,所以需要在運行時確定此語句的正確性。

  3.使用用戶事件實現窗口與用戶對象的通信

  把定製的用戶對象放在窗口或者另一個定製的用戶對象中之後,只能給該用戶對象的事件編寫腳本,而不能給該用戶對象中的控件編寫腳本。因此,經常需要爲用戶對象定義用戶事件,然後在windows描繪器中爲用戶事件編寫腳本,這樣就可以實現在窗口中引用用戶對象中的控件。

  例如,定義一可視用戶對象,包括一個命令按鈕,爲該可視用戶對象定義一個用戶事件“ue_user”,在命令按鈕的clicked事件中編寫程序代碼:

  parent.triggerevent(″ue_user″)

  把該用戶對象放在窗口中。在窗口中該用戶對象的script描繪器的select event下列表中,可以發現爲該用戶對象所聲明的用戶事件“ue_user”並可爲它編寫代碼,從而實現在窗口中引用用戶對象中的控件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章