003
12.02.2005, 13:05 Uhr
Audron-AT-www
http://www.sXene.de Audron@sxene.de (Operator)
|
Diesen Thread wollte ich nun mal wieder ansprechen... Pablo sagte, dass es nicht geht, hat damit aber unrecht Seht euch mal folgendes an...
Ich habe mich gefragt, wie man z.B. eine Form, deren Name in einer String-Variable steht zur Laufzeit laden und anzeigen kann? Oder wie man eine Formel in einer TextBox ohne zusätzlichen Parser ausrechnen? Wie das geht, habe ich dann rausgefunden... Und damit Pablo mal wieder übertrumpft ![](images/icon/biggrin_new.gif)
Die Datei vba6.dll (Bestandteil der VB6-Installation) beinhaltet eine unscheinbare aber mächtige Funktion:
Visual Basic: |
' Achtung: nur für VB6!!! Private Declare Function EbExecuteLine Lib "vba6.dll" ( _ ByVal StringToExec As Long, _ ByVal Any1 As Long, _ ByVal Any2 As Long, _ ByVal CheckOnly As Long) As Long
|
Mit dieser Funktion ist es möglich, sowohl VB-Code, der in einem String gespeichert ist, zur Laufzeit auszuführen - so als befände sich der VB-Code direkt im Projekt.
Anwendungsbeispiel 1: Formular aus String öffnen Bei der Recherche nach einer Lösung dieses Problems bin ich auf eben die oben genannte Funktion EbExecuteLine gestossen. Mit dieser Funktion lässt sich die Form dann wie folgt anzeigen:
Visual Basic: |
' VB-Code mit dynamischen Formname Dim sCode As String sCode = Rs("Formname") & ".Show"
Dim bResult As Boolean bResult = (EbExecuteLine(StrPtr(sCode), 0&, 0&, 0&) = 0)
|
Zusätzlich verpacken wir die EBExecuteLine-Funktion in eine eigene VB-Funktion, so dass wir nicht immer alle Parameter angeben müssen:
Visual Basic: |
' VB-Code ausführen Public Function VBExecute(sCode As String) As Boolean VBExecute = (EbExecuteLine(StrPtr(sCode), 0&, 0&, 0&) = 0) End Function
|
Um beim obigen Beispiel zu bleiben, erstellen wir uns eine Funktion, mit der sich eine Form aus einer String-Variable aufrufen lässt, wobei wir als Rückgabewert dann das Form-Objekt zurückbekommen:
Visual Basic: |
' VB-Form anhand Variable! zuweisen Public Function VBForm(ByVal sFormName As String) As Form Dim oForm As Form If VBExecute("Load " & sFormName) Then For Each oForm In Forms If oForm.Name = sFormName Then Set VBForm = oForm Exit For End If Next End If End Function
|
Der Aufruf sieht dann wie folgt aus:
Visual Basic: |
Dim oForm As Form Set oForm = VBForm(Rs("Formname")) oForm.Show
|
Weiteres Beispiel zur API-Funktion Natürlich kann man mit der EbExecuteLine-API noch viel mehr anstellen :-)
Rechnen - ja natürlich - rechnen kann man damit auch *grinz* Man platziere eine TextBox, ein Label, sowie einen CommandButton auf die Form. Zur Laufzeit gibt man dann in die TextBox eine Formel ein, z.B.: (5+8)*3^2. Beim Klick auf den CommandButton soll die Formel ausgerechnet und im Label angezeigt werden:
Visual Basic: |
Private Sub Command1_Click() VBExecute "Form1.Label1.Caption = CStr(" & Text1.Text & ")" End Sub
|
Wichtiger Hinweis! Die EBExecuteLine-Funktion lässt sich nur innerhalb der VB-IDE verwenden. In der kompilierten Version (EXE-Datei) wird eigenartigerweise immer ein Speicher-Fehler produziert.
Ich hoffe damit habe ich euch weitergeholfen ![](images/icon/wink_new.gif) -- Mit freundlichen Grüßen Audron, audron@sxene.de
|