ActiveXコントロールを組み込む
GuiXTコントロールを使用すると、SAP GUIウィンドウにActiveXコントロールを組み込んで、VB.NETを介してコントロールを自動化することができます。Windows標準のすべてのコントロールを使用することができます(HTMLコントロールまたはWindowsコモンコントロールのリストビューやツリーコントロールなど)。さらに、追加のActiveXコントロールがMicrosoftから無償で提供されています(リッチテキストコントロールなど)。また、インターネット上で数多くのコントロールを入手できます(PDFの表示、スプレッドシート、グラフィックス、CAD、電話接続など)。
このチュートリアルでは、VB.NET経由で接続される2つのコントロールを扱います。
- RTFコントロール
SAPデータを含むドキュメントを表示します。ユーザーは、ドキュメントを変更して新しい内容を保存できます。 - HTMLコントロール
HTMLコントロールを使用して、ドキュメントの書式設定(太字、下線、イタリック、箇条書き、色)が可能なツールバーを実装します。
ここでは、HTMLドキュメントのクリック要素を処理して、選択したアクションをRTFドキュメントに適用するというのが興味深いポイントです。
トランザクションVA23のドキュメントとツールボックス
このドキュメントはRTFテンプレートを用いて作成し、RTFコントロールで表示しています。ツールボックスはHTMLで実装しています。
ユーザーは、テキストの一部をマウスで選択し、ツールボックスにあるいずれかの書式設定ボタンをクリックできます。
RTFコントロールにおけるテキストの選択
ツールバーボタンクリックして、アドレスを“太字“の“水色“に設定
ユーザーは、テキストの書式を変更し、その書式を保存できます。
これで、このテキストをEメールで送信したり、SAPシステムに保存したり(オブジェクトサービス)、ローカルで処理(MS Wordなどで)したりできます。
実装の主な部分は以下のとおりです。
SAP GUIウィンドウに2つのコントロールを組み込む(GuiXT Script)
Control (2,0) (20,72) name=”rtf” progid=“RICHTEXT.RichtextCtrl”
initflag=“initcontrol” properties=“ScrollBars:3”
Control (0.8,49) (1.9,72) name=“colorpicker”
progid=“file://colorpicker.html”
VB.NET関数にてコントロールを初期化する(GuiXT Script)
// initialize control in VB
CallVB “utilities.customer.rtf_init” “&V[rtf]” “&V[colorpicker]”
“rtfcontent”
RTFドキュメントを読み込む(VB.NET、初期化)
Public Sub rtf_init(rtf As RichTextLib.RichTextBox, html As
SHDocVw.WebBrowser, textname As String)
‘ load content from GuiXT long text
Dim guixt As New guinet.guixt
rtf.TextRTF = guixt.GetText(textname)
ツールボックスのクリック要素を処理する(VB.NET、初期化)
‘ set handler for HTML click
Dim doc As mshtml.HTMLDocumentClass = html.Document
AddHandler CType(doc, mshtml.HTMLDocumentEvents2_Event).onclick, AddressOf
WebBrowserClick
クリックされた要素を判定する(VB.NET、Webブラウザーのクリック)
Private Function WebBrowserClick(pEvtObj As mshtml.IHTMLEventObj)
As Boolean
‘ where did the user click?
Dim clickedElement As mshtml.IHTMLElement = pEvtObj.srcElement
While clickedElement IsNot Nothing AndAlso clickedElement.tagName.ToUpper <> “TD”
clickedElement = clickedElement.parentElement
End While
Select Case clickedElement.id
Case “bold”
…
Case “underline”
…
テキストの書式を変更する(VB.NET、Webブラウザーのクリック)
Case “bold”
‘ set/delete “bold”
If IsDBNull(RTFBox.SelBold) OrElse RTFBox.SelBold = False Then
RTFBox.SelBold = True
Else
RTFBox.SelBold = False
End If
…
テキストの色を変更する(VB.NET、Webブラウザーのクリック)
Dim selectedColorRGB As String = pEvtObj.srcElement.style.backgroundColor
‘ convert RGB color into integer
Dim selectedColorInt As Integer = RGBStringToInt(selectedColorRGB)
‘ set/delete color
If IsDBNull(RTFBox.SelColor) OrElse RTFBox.SelColor <> selectedColorInt
Then
RTFBox.SelColor = selectedColorInt
Else
RTFBox.SelColor = RGB(0, 0, 0)
End If
変更されたRTFテキストをGuiXTロングテキスト変数に読み込む(VB.NET)
Public Sub rtf_get_content(rtf As RichTextLib.RichTextBox, textname As
String)
‘ read content into GuiXT long text
Dim guixt As New guinet.guixt
guixt.SetText(textname, rtf.TextRTF)
End Sub
RTFドキュメントを保存する(InputScript)
CallVB “utilities.customer.rtf_get_content” “&V[rtf]” “rtfcontent”
CopyText fromText=“rtfcontent” toFile=“&V[outputfile]”
if Q[ok]
Message “S: Text saved” -statusline
else
Message “E: Text not saved” -statusline
endif
Return
全体のVB.NETコード
1 |
Imports guinet |
2 | Imports SAPFEWSELib |
3 | Imports RichTextLib |
4 | Imports SHDocVw |
5 | |
6 | Public Class customer |
7 | |
8 | Private RTFBox As RichTextLib.RichTextBox |
9 | |
10 | Public Sub rtf_init(rtf As RichTextLib.RichTextBox, _ |
11 | html As SHDocVw.WebBrowser, textname As String) |
12 | |
13 | ‘ Appearence |
14 | rtf.BorderStyle = BorderStyleConstants.rtfNoBorder |
15 | rtf.BackColor = RGB(255, 255, 255) |
16 | |
17 | |
18 | ‘ load content from GuiXT long text |
19 | Dim guixt As New guinet.guixt |
20 | rtf.TextRTF = guixt.GetText(textname) |
21 | |
22 | ‘ set handler for HTML click |
23 | Dim doc As mshtml.HTMLDocumentClass = html.Document |
24 | AddHandler CType(doc, mshtml.HTMLDocumentEvents2_Event).onclick, _ |
25 | AddressOf WebBrowserClick |
26 | |
27 | ‘ Save RTF object in order to find it later on in click handler |
28 | RTFBox = rtf |
29 | |
30 | End Sub |
31 | |
32 | Public Sub rtf_get_content(rtf As RichTextLib.RichTextBox, _ |
33 | textname As String) |
34 | |
35 | ‘ read content into GuiXT long text |
36 | Dim guixt As New guinet.guixt |
37 | guixt.SetText(textname, rtf.TextRTF) |
38 | |
39 | End Sub |
40 | |
41 | Private Function WebBrowserClick(pEvtObj As mshtml.IHTMLEventObj) As Boolean |
42 | |
43 | |
44 | ‘ where did the user click? |
45 | Dim clickedElement As mshtml.IHTMLElement = pEvtObj.srcElement |
46 | |
47 | ‘ search table cell in DOM hierarchy |
48 | While clickedElement IsNot Nothing _ |
49 | AndAlso clickedElement.tagName.ToUpper <> “TD” |
50 | clickedElement = clickedElement.parentElement |
51 | End While |
52 | |
53 | ‘ table cell found? else return |
54 | If clickedElement Is Nothing Then |
55 | Return False |
56 | End If |
57 | |
58 | |
59 | |
60 | Dim doc As mshtml.HTMLDocumentClass = clickedElement.document |
61 | |
62 | Select Case clickedElement.id |
63 | |
64 | Case “bold” |
65 | ‘ set/delete “bold” |
66 | If IsDBNull(RTFBox.SelBold) OrElse RTFBox.SelBold = False Then |
67 | RTFBox.SelBold = True |
68 | Else |
69 | RTFBox.SelBold = False |
70 | End If |
71 | |
72 | Case “underline” |
73 | ‘ set/delete “underline” |
74 | If IsDBNull(RTFBox.SelUnderline) _ |
75 | OrElse RTFBox.SelUnderline = False Then |
76 | RTFBox.SelUnderline = True |
77 | Else |
78 | RTFBox.SelUnderline = False |
79 | End If |
80 | |
81 | Case “italic” |
82 | ‘ set/delete “italic” |
83 | If IsDBNull(RTFBox.SelItalic) OrElse RTFBox.SelItalic = False Then |
84 | RTFBox.SelItalic = True |
85 | Else |
86 | RTFBox.SelItalic = False |
87 | End If |
88 | |
89 | Case “bullet” |
90 | ‘ set/delete “bullet” |
91 | If IsDBNull(RTFBox.SelBullet) OrElse RTFBox.SelBullet = False Then |
92 | RTFBox.SelBullet = True |
93 | Else |
94 | RTFBox.SelBullet = False |
95 | End If |
96 | |
97 | |
98 | Case Else |
99 | Dim selectedColorRGB As String = _ |
100 | pEvtObj.srcElement.style.backgroundColor |
101 | |
102 | If Not selectedColorRGB.StartsWith(“rgb(“) Then |
103 | Return False |
104 | End If |
105 | |
106 | ‘ convert RGB color into integer |
107 | Dim selectedColorInt As Integer = RGBStringToInt(selectedColorRGB) |
108 | |
109 | ‘ set/delete color |
110 | If IsDBNull(RTFBox.SelColor) _ |
111 | OrElse RTFBox.SelColor <> selectedColorInt Then |
112 | RTFBox.SelColor = selectedColorInt |
113 | Else |
114 | RTFBox.SelColor = RGB(0, 0, 0) |
115 | End If |
116 | |
117 | End Select |
118 | |
119 | Return True |
120 | End Function |
121 | |
122 | Function RGBStringToInt(rgbstring As String) As Integer |
123 | |
124 | ‘ color string format is e.g. rgb(128,16,255) |
125 | ‘ remove “rgb(” And “)” |
126 | rgbstring = rgbstring.Substring(4).Trim(“)”) |
127 | |
128 | Dim rgbcomponents() As String = rgbstring.Split(“,”c) |
129 | |
130 | Dim R As Integer = CInt(rgbcomponents(0)) |
131 | Dim G As Integer = CInt(rgbcomponents(1)) |
132 | Dim B As Integer = CInt(rgbcomponents(2)) |
133 | |
134 | ‘ convert RGB color into integer |
135 | Return ColorTranslator.ToWin32(Color.FromArgb(R, G, B)) |
136 | |
137 | End Function |
138 | |
139 | End Class |
140 | |
141 | |
142 | |
143 | |
144 |
すべてのファイルをzip形式でダウンロードすることができます。zip形式の全ファイル
実装に関するいくつかの追記事項を以下に示します。
VB.NET用ActiveXインターフェイスのドキュメント
Microsoftのコントロールについては、インターネット(通常、MSDN)上でドキュメントを見つけることができます。今回の例に関するドキュメントはVisual Basic: RichTextBoxコントロールです。メソッドはVB6用に書かれていますが、このメソッドはVB.NETでもVB6と同じように使用できます。
RTFコントロールでスクロールバーを表示する方法
通常、組み込んだコントロールの表示属性は、自分が作成したVB.NET初期化関数で設定することができます。今回の例ではrtf_initメソッドです。RTFコントロールのScrollBarsのプロパティは実行時に設定できないため、初期化関数はこのプロパティに対しては機能しません。Microsoftのドキュメントでは以下のように記述されています。
ScrollBarsプロパティ(RichTextBoxコントロール)
RichTextBoxコントロールが水平または垂直のどちらのスクロールバーを持つかを返します(または設定します)。実行時は読み取り専用です。
構文
object.ScrollBars
objectプレースフォルダーは、RichTextBoxコントロールとして評価されるオブジェクト式を表します。
設定
ScrollBarsプロパティの設定は以下のとおりです。
定数 | 値 | 説明 |
---|---|---|
rtfNone | 0 | (デフォルト)スクロールバーを表示しません。 |
rtfHorizontal | 1 | 水平スクロールバーのみ |
rtfVertical | 2 | 垂直スクロールバーのみ |
rtfBoth | 3 | 水平スクロールバーと垂直スクロールバーを両方表示します。 |
ただし今回の例では、プロパティを設定するもうひとつの方法があります。Controlステートメントのproperties=オプションを使用します。
Control (2,0) (20,72) name=“rtf” … properties=“ScrollBars:3”
なお、プロパティ名は大文字と小文字が区別されます。すなわち、scrollbar:3は機能せず、GuiXTの構文エラーメッセージが表示されます。
ユーザーのPCへのActiveXコンポーネントのロールアウト
これは、標準のWindowsコントロールでは必要ありません。個別に購入したコンポーネントには、通常、各PCで実行する必要があるセットアッププログラムが付属しています。
今回の例(RTFコントロール)では、このコントロールがWindows 8および64bit版を含むすべてのバージョンのWindowsで使用できることをMicrosoftが保証しています。ただし、このコントロールは各バージョンのWindowsに自動的にはインストールされません。詳細は、Windows Vista、Windows Server 2008、Windows 7、Windows 8におけるVisual Basic 6.0のサポートに関するMicrosoftの声明を参照してください。
64bit版Windows 7などでは、以下の操作が必要な場合があります。
- “richtx32.ocx”をC:\Windows\SysWoW64にコピーします。
- “管理者として実行”にてMS DOSウィンドウ(コマンドプロンプト)を開きます。
- 以下のコマンドを実行します。
C:\Windows\SysWoW64\regsvr32.exe richtx32.ocx
各ユーザーに対し、Windowsのログオフを使用してこのインストール手順を実行することができます。