在PowerBuilder中動態呼叫函式

hurcn發表於2007-08-13
   目前流行的大部分應用程式中都提供了Undo功能,在PowerBuilder中也可以利用Undo()函式實現該功能。Undo()函式可用於DataWindow, EditMask, MultiLineEdit, RichTextEdit和SingleLineEdit 物件,如果只對某一個物件進行Undo操作,只需在Undo選單項的單擊事件中鍵入如下指令碼:Objectname.undo(),但是當視窗中有多個物件,我們在編寫指令碼時並不知道要對哪個物件執行undo()操作,如何解決這一問題呢?在PowerBuilder中,undo()等函式只能用於可視物件,而所有可視物件均繼承自系統物件類GraphicObject。因此我們可以定義一個GraphicObject物件的例項變數go_object,等到執行時再用getfocus()函式確定具體操作物件。然後用Typeof()函式確定當前物件的型別,再用Choose case語句根據不同的型別引用不同的例項變數,程式碼如下:

graphicobject go_object
DataWindow dw_object
EditMask em_object
MultiLineEdit mle_object
RichTextEdit rte_object
SingleLineEdit sle_object

go_object=getfocus()
choose case TypeOf(go_object)
case DataWindow!
dw_object=go_object
dw_object.undo()
case EditMask!
em_object=go_object
em_object.undo()
case MultiLineEdit!
mle_object=go_object
mle_object.undo()
case RichTextEdit!
rte_object=go_object
rte_object.undo()
case SingleLineEdit!
sle_object=go_object
sle_object.undo()
case else
messagebox("Error","Can not undo")
end choose

  其實我們可以用動態呼叫函式的方法簡單地解決這一問題(只需三行程式碼),即對GraphicObject物件呼叫undo()函式,然後在函式名前加上關鍵字Dynamic。因為物件類GraphicObject並沒有undo()這個物件函式,如果不加關鍵字Dynamic,編譯時就會出現錯誤。使用了Dynamic關鍵字,PowerBuilder在編譯時不檢查該函式和所用引數的有效性,而到指令碼執行時才去檢查該函式。程式碼如下:

GraphicObject go_object
go_object=getfocus()
go_object.dynamic undo()

  允許動態呼叫函式是的PowerBuilder5.0的特性之一。在程式設計中靈活運用動態函式呼叫的方法有助於提高所設計程式的可維護性、可重用性。

  以上程式在PowerBuileer 5.0,Window95環境下執行通過。

相關文章