Bisher bin ich bei meinen Programmen mit Debug-Ausgaben so verfahren, dass ich Compiler-Flags gesetzt habe. #If Debug_TraceIn Or Debug_ Then glLog.TraceIn MyName & ".Main" #End If Das hat natürlich zur Folge, dass im Falle eines Fehlers eine neue EXE-Datei erstellt werden muss, welche diese Compiler-Flags aktiviert hat. Oftmals natürlich nicht gerne gesehen. Die Idee, die ich daraufhin hatte war, eine Schnittstelle zu erstellen, welche durch zwei Klassen implementiert wird. Hierbei erzeugt eine der Klassen alle nötigen Debug-Ausgaben und die zweite Klasse stellt eine Dummy-Klasse dar. Ausschnitt Schnittstelle: Public Function TraceError( _ ByVal sFunction As String, _ ByVal msg As String, _ Optional ByVal vPrintErr As Boolean = False _ ) As Boolean End Function Ausschnitt Dummy-Klasse: Public Function IDebug_TraceError( _ ByVal sFunction As String, _ ByVal msg As String, _ Optional ByVal vPrintErr As Boolean = False _ ) As Boolean IDebug_TraceError = True End Function Ausschnitt Debug-Klasse: Public Function IDebug_TraceError( _ ByVal sFunction As String, _ ByVal msg As String, _ Optional ByVal vPrintErr As Boolean = False _ ) As Boolean Dim tmpStr As String tmpStr = sFunction & ": " & msg If vPrintErr Then tmpStr = tmpStr & " - " & CStr(Err.Number) & ": " & Err.Description End If DebugOutput tmpStr IDebug_TraceError = m_StopOnError Debug.Assert IDebug_TraceError End Function Die private Function DebugOutput verteilt dann die Ausgaben: Private Sub DebugOutput( _ ByVal Data As String _ ) Debug.Print Data ' Watch Window Ausgabe OutputDebugString Data ' DbgView Ausgabe, Erklärung folgt If m_boWriteFile Then PrintMsg Data ' Datei Ausgabe, siehe Beispielprojekt End If End Sub Die Function OutputDebugString sendet Debug-Ausgaben an den Windows-Kernel - API Deklaration: Private Declare Sub OutputDebugString Lib "kernel32" _ Alias "OutputDebugStringA" ( _ ByVal lpOutputString As String) Das frei verfügbare Programm Mittels zweier Routinen, welche in ein Standardmodul gepackt werden können, kann dann die Debug-Ausgabe de-/aktiviert werden: Public Sub DebugEnable() Set DBGView = New CDebug DBGView.Init "MyProject", False, True 'Siehe Download End Sub Public Sub DebugDisable() Set DBGView = New CDebugNull DBGView.Init "MyProject", False, False 'Siehe Download End Sub Falls erforderlich, kann geprüft werden, welche Ausgabe aktiv ist: Public Property Get DebugEnabled() As Boolean DebugEnabled = (TypeOf DBGView Is CDebug) End Property Die Ausgabe in das Dummy-Objekt oder in das richtige Debug-Objekt, kann problemlos zur Laufzeit umgeschaltet werden. Ich habe das z.B. so realisiert, dass die Debug-Ausgabe aktiviert wird, wenn im Hauptform zweimal <Strg><w> innerhalb von 2s gedrückt wird. Nun wäre noch zu klären, warum die Debug/Trace Funktionen der Schnittstelle als Functions und nicht als Subs ausgelegt wurden. Der Vorteil liegt darin, dass im Code geschrieben werden kann: Debug.Assert DBGView.Trace(MyName & ".AFunction", "AString") Und ich damit die Möglichkeit habe, direkt bei der Entwicklung zu entscheiden, dass diese Ausgabe niemals in der Exe enthalten sein soll. Das geht so mit einer Sub nicht. Außerdem habe ich die Möglichkeit durch Suchen und Ersetzen den/die Text(e) Debug.Assert DBGView. durch Call DBGView. und umgekehrt zu ersetzen, falls Bedarf besteht ein Release ohne/mit Debug-Ausgaben zu erstellen. Zusammenfassung: Außerdem, hoffe ich mit dem Tipp, eine schöne und sinnvolle Anwendungsmöglichkeit von Schnittstellen und Klassen aufgezeigt zu haben. Dieser Tipp wurde bereits 13.470 mal aufgerufen.
Anzeige
![]() ![]() ![]() (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 ![]() Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats ![]() Dietrich Herrmann Umbrechen langer Strings mittels Measurement-Methode und speziellen Funktionen Der Tipp befasst sich mit dem Umbrechen von langen Strings bei Anwendung der Funktion DrawString. Es wird eine vorgegebene Breite (evtl. Breite des Ausgaberechtecks) und der anzuwendende Font beachtet. TOP! Unser Nr. 1 ![]() Neu! sevDataGrid 3.0 Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |