Mit GuiXT
Controls können Sie beliebige ActiveX Controls in das SAP GUI Fenster
einblenden und über VB.NET automatisieren. Dabei stehen Ihnen die in
Windows enthaltenen Controls (z.B. HTML-Control, Common Controls wie
List Viewer, Tree), weitere von Microsoft kostenlos zur Verfügung
gestellte Controls (z.B. RTF-Control) und eine Vielzahl zusätzlich
erhältlicher Komponenten zur Verfügung, z.B. PDF-Anzeige,
Tabellenkalkulation, Grafikprogramme, CAD, Telefonanbindung.
Die Controls
können Sie im GuiXT Script über VB.NET Aufrufe steuern; es ist auch
möglich, aus einem Control unmittelbar Methoden anderer Controls
aufzurufen.
Wir zeigen das
in diesem Tutorial am Beispiel zweier gleichzeitig eingeblendeter
Controls:
RTF-Control
Damit zeigen wir ein Dokument mit SAP-Daten an, das der Benutzer
ändern und dann sichern kann
HTML-Control Das HTML-Control nutzen wir zum Einblenden einer
Tool-Leiste zum Formatieren des Dokuments
Dokument und Toolbox in
Transaktion VA23
Das Dokument
generieren wir aus einem RTF-Template und zeigen es im RTF-Control an.
Die Toolbox rechts über dem Dokument ist in HTML implementiert:
Der Benutzer
kann im Dokument einen Textabschnitt mit der Maus selektieren und dann
in der Toolbox eine Farbe, ein Textformat (fett, unterstrichen, kursiv)
oder Aufzählungszeichen wählen:
Selektion des
Textes im RTF-Control oben
Durch Klick in
der Toolbox ist die Firmenadresse rechts oben auf "fett" und "hellblau"
gesetzt
Der Benutzer
kann den Text nach Belieben anpassen und anschließend sichern:
Der Text kann
dann als E-Mail verschickt, im SAP zu dem Kunden abgespeichert
(Objektdienste) oder lokal weiter verarbeitet werden:
Wir stellen
zunächst kurz die wesentlichen Teile der Implementierung vor:
Einblenden der beiden Controls (GuiXT Script) GuiXT
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"
Aufruf einer VB.NET-Routine zum Initialisieren der Controls
(GuiXT Script) GuiXT
// initialize control in VB
CallVB "utilities.customer.rtf_init" "&V[rtf]" "&V[colorpicker]" "rtfcontent"
RTF-Dokument aus GuiXT Text laden (VB.NET, Initialisierung) 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)
Abfangen des Click-Elements der Toolbox (VB.NET, Initialisierung) VB.NET
' set handler for HTML click
Dim doc As mshtml.HTMLDocumentClass = html.Document
AddHandler CType(doc, mshtml.HTMLDocumentEvents2_Event).onclick,
AddressOf WebBrowserClick
Abfrage, wo geklickt wurde (VB.NET, WebBrowserClick)
VB.NET
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"
...
Formatänderung im RTF-Dokument (VB.NET, WebBrowserClick) VB.NET
Case "bold"
' set/delete "bold"
If IsDBNull(RTFBox.SelBold) OrElse RTFBox.SelBold = False Then
RTFBox.SelBold = True
Else
RTFBox.SelBold = False
End If
...
Farbänderung im RTF-Dokument (VB.NET, WebBrowserClick)
VB.NET
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
Lesen des Dokuments aus dem
RTF-Control nach GuiXT Langtext (VB.NET) 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
Sichern des RTF-Dokuments (GuiXT InputScript)
VB.NET
CallVB "utilities.customer.rtf_get_content" "&V[rtf]" "rtfcontent"
CopyText fromText="rtfcontent" toFile="&V[outputfile]"
if Q[ok]
Message "S: Text gesichert" -statusline
else
Message "E: Text konnte nicht gesichert werden" -statusline
endif
Return
VB.NET Coding
insgesamt
VB.NET
Imports guinet
Imports SAPFEWSELib
Imports RichTextLib
Imports SHDocVw
Public Class customer
Private RTFBox As RichTextLib.RichTextBox
Public Sub rtf_init(rtf As RichTextLib.RichTextBox, _
html As SHDocVw.WebBrowser, textname As String)
' Appearence
rtf.BorderStyle = BorderStyleConstants.rtfNoBorder
rtf.BackColor = RGB(255, 255, 255)
' load content from GuiXT long text
Dim guixt As New guinet.guixt
rtf.TextRTF = guixt.GetText(textname)
' set handler for HTML click
Dim doc As mshtml.HTMLDocumentClass = html.Document
AddHandler CType(doc, mshtml.HTMLDocumentEvents2_Event).onclick, _
AddressOf WebBrowserClick
' Save RTF object in order to find it later on in click handler
RTFBox = rtf
End Sub
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
Private Function WebBrowserClick(pEvtObj As mshtml.IHTMLEventObj) As Boolean
' where did the user click?
Dim clickedElement As mshtml.IHTMLElement = pEvtObj.srcElement
' search table cell in DOM hierarchy
While clickedElement IsNot Nothing _
AndAlso clickedElement.tagName.ToUpper <> "TD"
clickedElement = clickedElement.parentElement
End While
' table cell found? else return
If clickedElement Is Nothing Then
Return False
End If
Dim doc As mshtml.HTMLDocumentClass = clickedElement.document
' Find current RTF box
Dim RTFBox As RichTextLib.RichTextBox
RTFBox = RTFBoxes.Item(doc.parentWindow)
Select Case clickedElement.id
Case "bold"
' set/delete "bold"
If IsDBNull(RTFBox.SelBold) OrElse RTFBox.SelBold = False Then
RTFBox.SelBold = True
Else
RTFBox.SelBold = False
End If
Case "underline"
' set/delete "underline"
If IsDBNull(RTFBox.SelUnderline) _
OrElse RTFBox.SelUnderline = False Then
RTFBox.SelUnderline = True
Else
RTFBox.SelUnderline = False
End If
Case "italic"
' set/delete "italic"
If IsDBNull(RTFBox.SelItalic) OrElse RTFBox.SelItalic = False Then
RTFBox.SelItalic = True
Else
RTFBox.SelItalic = False
End If
Case "bullet"
' set/delete "bullet"
If IsDBNull(RTFBox.SelBullet) OrElse RTFBox.SelBullet = False Then
RTFBox.SelBullet = True
Else
RTFBox.SelBullet = False
End If
Case Else
Dim selectedColorRGB As String = _
pEvtObj.srcElement.style.backgroundColor
If Not selectedColorRGB.StartsWith("rgb(") Then
Return False
End If
' 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
End Select
Return True
End Function
Function RGBStringToInt(rgbstring As String) As Integer
' color string format is e.g. rgb(128,16,255)
' remove "rgb(" And ")"
rgbstring = rgbstring.Substring(4).Trim(")")
Dim rgbcomponents() As String = rgbstring.Split(","c)
Dim R As Integer = CInt(rgbcomponents(0))
Dim G As Integer = CInt(rgbcomponents(1))
Dim B As Integer = CInt(rgbcomponents(2))
' convert RGB color into integer
Return ColorTranslator.ToWin32(Color.FromArgb(R, G, B))
End Function
End Class
Dokumentation der
ActiveX-Schnittstelle für VB.NET
Für die Microsoft-Controls findet sich die Dokumentation im Internet,
meist in MSDN (Microsoft Developer Network). In unserem Fall z.B. in dem
Artikel
Visual Basic: RichTextBox Control. Die Methoden sind dort für VB6
beschrieben und können identisch in VB.NET verwendet werden.
Anzeige der Scrollbalken im RTF-Control Generell setzt man die Anzeigeattribute eines Controls am besten in
der VB.NET-Routine, die zur Initialisierung aufgerufen wird, in unserem
Fall also in der Methode rtf_init. Das funktioniert bei dem RTF-Control
allerdings nicht für die Eigenschaft ScrollBars, da diese zur
Laufzeit readonly ist. Ausschnitt
Dokumentation:
ScrollBars Property (RichTextBox
Control)
Returns
or sets a value indicating whether a RichTextBox control
has horizontal or vertical scroll bars. Read-only at
run time.
Syntax
object.ScrollBars
The object placeholder represents
an object expression that
evaluates to a RichTextBox control.
Settings
The ScrollBars property settings
are:
Constant
Value
Description
rtfNone
0
(Default) No scroll bars
shown.
rtfHorizontal
1
Horizontal scroll bar
only.
rtfVertical
2
Vertical scroll bar only.
rtfBoth
3
Both horizontal and
vertical scroll bars shown.
Daher ist es nicht möglich,
den Defaultwert 0 (keine Scrollbalken) in der VB.NET-Routine zu
ändern. Wir können stattdessen aber im GuiXT Script bei Anlegen
des Controls bereits Eigenschaften mitgeben, die auch in diesem
Fall wirksam werden:
GuiXT
Control (2,0) (20,72) name="rtf" ... properties="ScrollBars:3"
Hierbei auf Gross/Kleinschreibung
des property-Namens achten.
Planen, wie die ActiveX-Komponente später auf den Benutzer-PCs
installiert wird Bei Standard-Windowskomponenten ist das
automatisch der Fall. Zusätzlich gekaufte Komponenten werden meist über
ein eigenes Setup installiert.