FAQ 0151: Läuft die Anwendung in der IDE oder als Kompilat?
von Helge Rex
Frage
Wie finde ich heraus, ob die Anwendung in der IDE oder als Kompilat läuft?
Antwort
Fehler auswerten
Eine mögliche Lösung ist das Reagieren auf einen Fehler: Debug.Print wird nicht mitkompiliert, somit auch nicht dessen Argumente. Fehlererzeugende Argumente fehlen also im Kompilat, somit kann man feststellen, ob die Anwendung als Kompilat läuft.
Function IsIDE () As Boolean On Error Goto Fehler ' Fehler produzieren Debug.Print 1/0 ' Hier angekommen wurde kein Fehler gemeldet IsIDE = False Ende: Exit Function Fehler: ' Hier angekommen wurde ein Fehler gemeldet IsIDE =True Resume Ende End Function
Beispiel von Dominic Hoffmann.
Rekursion auswerten
Debug.Assert wird ebenfalls nicht mitkompiliert, so daß man mittels Rekursion eine Prüfung realisieren kann.
Function IsCompiled( _ Optional ByVal bVal As Boolean = False _ ) As Boolean Static bComp__ As Boolean If bVal Then bComp__ = False Else bComp__ = True Debug.Assert Not IsCompiled(True) IsCompiled = bComp__ End If End Function
Call MsgBox("Kompiliert: " & CStr(IsCompiled()))
Beispiel von Konrad L. M. Rudolph.
Vorhandene Eigenschaften nutzen
Es geht aber auch viel profaner:
Function Iscompiled() As Boolean Iscompiled = Not App.LogMode End Function
Beispiel genannt von Klaus Langbein.
Eigene Steuerelemente
Ernst wird die ganze Sache, sobald die Erkennung in einem eigenen Steuerelement stattfinden soll. Hier gibt es nämlich drei mögliche Zustände:
- IDE Design: Der Code des Steuerelementes wird in der IDE zur Entwicklungszeit, also wenn man Steuerelemente auf die Form ziehen kann, ausgeführt.
- IDE Running: Der Code des Steuerelementes wird in der IDE zur Laufzeit ausgeführt.
- Kompilat: Der Code des Steuerelementes wird als Kompilat ausgeführt.
Const GW_OWNER As Long = &H4& Enum CheckIDEEnum ciIDEDesign ciIDERun ciCompiled End Enum Declare Function GetClassName Lib "user32" _ Alias "GetClassNameA" ( _ ByVal hWnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Declare Function GetParent Lib "user32" ( _ ByVal hwnd As Long) As Long Declare Function GetWindow Lib "user32" ( _ ByVal hWnd As Long, _ ByVal wCmd As Long) As Long
Function CheckIDE() As CheckIDEEnum Dim hwnd As Long Dim PhWnd As Long Dim Buffer As String Dim Result As Long hwnd = UserControl.hwnd Do While Not hwnd = 0 PhWnd = hwnd hwnd = GetParent(PhWnd) Loop Buffer = Space$(128) PhWnd = GetWindow(PhWnd, GW_OWNER) Result = GetClassName(PhWnd, Buffer, Len(Buffer)) If Left$(Buffer, 8) = "IDEOwner" Then 'MsgBox "IDE" CheckIDE = CheckIDEEnum.ciIDEDesign ElseIf Left$(Buffer, 11) = "ThunderMain" Then 'MsgBox "IDE running" CheckIDE = CheckIDEEnum.ciIDERun Else 'MsgBox "compiled" CheckIDE = CheckIDEEnum.ciCompiled End If End Function
Beispiel von idiv.
Ihre Meinung
Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.