コントロールのイベントを処理する

ここまで、コントロールの属性を設定し、コントロールのメソッドを呼び出しました。ユーザーの操作(マウスクリックなど)に応答するには、ユーザーが操作を行ったときに作成した関数が呼び出されるようにコントロールを設定する必要があります。これは”イベント処理”として知られています。

コントロールのインターフェイスの説明では、起こりうるすべてのイベントがパラメーターとともにリスト表示されます。以下に、”VBSEdit”の例を示します。

特定のイベントが発生したときに作成したいずれかの関数を呼び出すことをコントロールに通知するには、以下の関数を使用します。

guixt.SetEventHandler(obj1, obj2)

この関数の2つのパラメーターは、処理したいイベントのオブジェクトobj1と、イベントを処理するオブジェクトobj2です。例えば、obj1にて”ColumnClick”イベントが発生したとき、obj2の”OnColumnClick”関数が呼び出され、イベントパラメーターが渡されます。命名規則として、各イベント名の先頭に”On”を付けて、呼び出される関数の名前を取得しています。この名前の関数が存在しない場合、関数呼び出しは行われません。

引き続き、チュートリアル4のサンプルを見ていきます。最初のオブジェクトであるobj1はリストビューコントロールで、変数lhにより参照されます。では、VBScriptスクリプトにてどのようにしてイベント処理オブジェクトobj2を作成するのでしょうか。このオブジェクトを作成するには、Class … End Classステートメントを使用して新しいクラスを定義します。クラス名は何でも構いません(例: va03_list_events)。

Class va03_list_events

Function OnDblClick

End Function
Function OnColumnClick(ColumnHeader)

End Function
    
    
End Class

このリストビューコントロールの初期化後、このクラスの新しいオブジェクトを作成し、今回使用するリストコントロールのイベントハンドラーとしてこのオブジェクトを宣言します。

 

Function va03_init(lv, date_from)

‘ handle  events
Set e = New va03_list_events
Call guixt.SetEventHandler(lv, e)

End Function

イベントハンドラーオブジェクトを作成したら、GuiXTの”Trace”(トレース)に切り替えて、このリストコントロールで発生したすべてのイベントをパラメーターとともにトレースします。

通常、イベントを処理するオブジェクトにイベントを上げるオブジェクトへの参照を保存すると便利です。そうすれば、このイベントハンドラー関数内にあるすべてのオブジェクト属性に容易にアクセスできます。

Function va03_init(lv, date_from)

‘ handle  events
Set e = New va03_list_events
Set e.ListView = lv
Call guixt.SetEventHandler(lv, e)

End Function

Class va03_list_events

Dim ListView

‘ double click  
Function OnDblClick

End Function
    
    
      
    Function OnColumnClick(ColumnHeader)

End Function
    
    
    
End Class

これで、このフレームワーク内に目的のイベントハンドラー関数が実装できました。ユーザーが列のタイトルをクリックすると、リストコントロールの行がこの列をキーにして並べ替えられるとともに、昇順と降順が切り替えられます。ユーザーがリストビューの行をブルクリックすると、guixt.input(…)によりSAPの入力フィールドへの値の入力およびSAPのアクションが実行され、トランザクションVA03の顧客発注情報が表示されます。

今回作成したVBScriptの全体は以下のようになります。チュートリアル4から変更がない部分はグレーで示してあります。

‘ Utility function: cut or enlarge a string to the specified length
Function xlen(f,n)
xlen = Mid(f,1,n)
If Len(xlen) < n Then
xlen = xlen + Space(n-Len(xlen))
End If

End Function

‘ Utility function:  build up a select option line for SAP RFCs
Function set_selopt(name,field,sign,opt,val1,val2)
set_selopt = xlen(name,30) & xlen(field,30) & xlen(sign,1) & xlen(opt,2) & xlen(val1,45) & xlen(val2,45)
End Function

‘ Utility function: pixel to twips (“TWentieth of an Inch Point”)
‘ screen.deviceXDPI - Retrieves the actual number of horizontal dots per inch (DPI)
‘ screen.deviceYDPI - Retrieves the actual number of vertical dots per inch (DPI) 
Function Twips_x(x)
Twips_x = x * (1440 / screen.deviceXDPI)
End Function

Function Twips_y(y)
Twips_y = y * (1440 / screen.deviceYDPI)
End Function

Function va03_init(lv, date_from)

If IsEmpty(lv) Then
Set lv = CreateObject(“ComCtl.ListViewCtrl”)
End If

‘ font
lv.Font.Name = ”Arial”
lv.Font.Size = 10

‘ color
lv.BackColor = RGB(240,240,240)

lv.View = 3    ’ 3=lvwReport (from MS documentation)

‘ no label editing
lv.LabelEdit = 1  ’ 1=manually  (from MS documentation)

‘ column headers
Call lv.ColumnHeaders.Add(,,guixt.get(“coltitle_VBELN”), 1500)
Call lv.ColumnHeaders.Add(,,guixt.get(“coltitle_BSTDK”), 2000)
Call lv.ColumnHeaders.Add(,,guixt.get(“coltitle_KUNNR”), 2000)
Call lv.ColumnHeaders.Add(,,guixt.get(“coltitle_BSTKD”), 3000)

‘ array of select options
Dim selopt(0)

selopt(0) = set_selopt(“VMVAA”,”BSTDK”, ”I”, ”GE”,  date_from, ””)

‘ array of orders
Dim orders

Call guixt.Rfc(“Z_S10_SEARCHHELP”, ”in.SEARCHHELP”, ”VMVAA”,  ”in.COLUMNS”,  ”VBELN(10),BSTDK(10),KUNNR(10),BSTKD(20)”, ”table.SELOPT”, selopt, ”table.DATA(WIDTH:50)”, orders)

For Each Order In  orders

Dim itmX
Set itmX = lv.ListItems.Add(,,Mid(Order,1,10))

itmX.SubItems(1) = Mid(Order,11,10)
itmX.SubItems(2) = Mid(Order,21,10)
itmX.SubItems(3) = Mid(Order,31,20)

Next

‘ handle  events
Set e = New va03_list_events
Set e.ListView = lv
Call guixt.SetEventHandler(lv, e)

End Function

Class va03_list_events

Dim ListView

Private ascending(4)

Function OnColumnClick(ColumnHeader)

Dim colno
colno = ColumnHeader.Index - 1

If IsEmpty(ascending(colno)) Then
ascending(colno) = 1
End If

ascending(colno) = 1 - ascending(colno)

ListView.SortKey = colno
ListView.SortOrder = ascending(colno)
ListView.Sorted = True

End Function

‘ mouse coordinates of last click
Dim click_x
Dim click_y

‘ Mouse down
Function OnMouseDown(Button, Shift, x, y)

‘ save pixel coordinates
click_x = x
click_y = y

End Function

‘ double click
Function OnDblClick

Dim item

‘ get clicked list item
             
        ’   Remark:
        ’   a simple way to get the clicked list item, without the need to 
        ‘   capture the MouseDown coordinates, is to use 
        ’     item = ListView.selectedItem
        ’   but then the user has to double-click the order number column, 
        ‘   not one of the other columns
        ’   this is why we use mouse coordinates and HitTest
        
        ’ HitTest requires coordinates in twips, not pixels !
        ’ we use x-coordinate = 1 so that the user may click 
        ‘ anywhere in the list row

Set item = ListView.HitTest(1, Twips_y(click_y))

If Not item Is Nothing then

guixt.input(“U[VBELN]:” & item.Text)
guixt.input(“OK:/0,process=va03_enter.txt”)

End If    
        
        
        
    End Function
    
    
End Class

InputScriptの”va03_enter.txt”は、発注番号を設定して”Enter”を実行します。

Parameter VBELN
Set F[VBAK-VBELN] “&U[VBELN]”
Enter

このアプリケーションは、ユーザーには以下のように見えます。

例えば”PO date”(発注日)をクリックすると、リストが発注日の順(この例では降順)に並べ替えられます。

行をダブルクリックすると、選択されたトランザクションVA03の顧客発注情報が表示されます。