VERSION 5.00 Begin VB.Form frmVBTrace Caption = "VB Tracer (for ignitionServer)" ClientHeight = 5625 ClientLeft = 2280 ClientTop = 2565 ClientWidth = 8355 Icon = "frmVBTrace.frx":0000 LinkTopic = "Form1" ScaleHeight = 5625 ScaleWidth = 8355 Begin VB.TextBox txtTrace BeginProperty Font Name = "Courier New" Size = 8.25 Charset = 0 Weight = 400 Underline = 0 'False Italic = 0 'False Strikethrough = 0 'False EndProperty Height = 5475 HideSelection = 0 'False Left = 120 Locked = -1 'True MultiLine = -1 'True ScrollBars = 3 'Both TabIndex = 0 Top = 60 Width = 8115 End Begin VB.Menu mnuFileTOP Caption = "&File" Begin VB.Menu mnuFile Caption = "&Save..." Index = 0 Shortcut = ^S End Begin VB.Menu mnuFile Caption = "-" Index = 1 End Begin VB.Menu mnuFile Caption = "E&xit" Index = 2 End End Begin VB.Menu mnuEditTOP Caption = "&Edit" Begin VB.Menu mnuEdit Caption = "&Copy" Index = 0 Shortcut = ^C End Begin VB.Menu mnuEdit Caption = "-" Index = 1 End Begin VB.Menu mnuEdit Caption = "&Find..." Index = 2 Shortcut = ^F End Begin VB.Menu mnuEdit Caption = "Find &Next" Enabled = 0 'False Index = 3 Shortcut = {F3} End Begin VB.Menu mnuEdit Caption = "-" Index = 4 End Begin VB.Menu mnuEdit Caption = "&Select All" Index = 5 Shortcut = ^A End Begin VB.Menu mnuEdit Caption = "C&lear" Index = 6 Shortcut = {DEL} End End Begin VB.Menu mnuTraceTOP Caption = "&Tracing" Begin VB.Menu mnuTrace Caption = "&Pause" Checked = -1 'True Index = 0 Shortcut = {F5} End Begin VB.Menu mnuTrace Caption = "-" Index = 1 End Begin VB.Menu mnuTrace Caption = "&Configure..." Index = 2 End End Begin VB.Menu mnuHelpTOP Caption = "&Help" Begin VB.Menu mnuHelp Caption = "&About..." Index = 0 End End End Attribute VB_Name = "frmVBTrace" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit Private Declare Function SendMessageStringA Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long Private Declare Function SendMessageStringW Lib "user32" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SendMessageLongW Lib "user32" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SendMessageRef Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByRef wParam As Long, ByRef lParam As Long) As Long Private Declare Function SendMessageRefW Lib "user32" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByRef wParam As Long, ByRef lParam As Long) As Long Private Const EM_REPLACESEL = &HC2 Private Const EM_SETLIMITTEXT = &HC5 ' EM_LIMITTEXT /* ;win40 Name change */ Private Const EM_GETLIMITTEXT = &HD5 Private Const EM_SETSEL = &HB1 Private Const EM_GETSEL = &HB0 Private Const WM_COPY = &H301 Private Const EM_GETLINE = &HC4 Private Const EM_GETLINECOUNT = &HBA Private Const EM_LINEINDEX = &HBB Private Const EM_LINEFROMCHAR = &HC9 Private Const EM_SCROLLCARET = &HB7 Private Const EM_LINELENGTH = &HC1 Private Declare Function LocalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal wBytes As Long) As Long Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function LocalLock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function LocalUnlock Lib "kernel32" (ByVal hMem As Long) As Long Private Const GMEM_FIXED = &H0 Private Const GMEM_ZEROINIT = &H40 Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT) Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long) Private Declare Function timeGetTime Lib "winmm.dll" () As Long Private Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long Private Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long Private Declare Function LoadImageLong Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As Long, ByVal uType As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long Private Declare Function LoadImageString Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal uType As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long Private Const IMAGE_BITMAP = 0 Private Const IMAGE_ICON = 1 Private Const IMAGE_CURSOR = 2 Private Declare Function DestroyIcon Lib "user32" (ByVal hIcon As Long) As Long Private WithEvents m_cSysTray As frmSysTray Attribute m_cSysTray.VB_VarHelpID = -1 Private WithEvents m_cMessage As frmMessageWindow Attribute m_cMessage.VB_VarHelpID = -1 Private WithEvents m_cFindReplace As cFindReplace Attribute m_cFindReplace.VB_VarHelpID = -1 Private m_iLength As Long Private m_bPaused As Boolean Private m_hIcon As Long Private m_sToFind As String Private m_iLastFindIndex As Long Private m_eFindFlags As EFindReplaceFlags Private m_lStartLine As Long Public Sub Test() m_sToFind = "I've" txtTrace.Text = "This" & vbCrLf & "is " & vbCrLf & vbCrLf & "Some text " & vbCrLf & vbCrLf & "That I've added" & vbCrLf txtTrace.Text = txtTrace.Text + txtTrace.Text FindInTextBox End Sub Private Sub FindInTextBox() Dim lLines As Long Dim lFirstLine As Long Dim lLine As Long Dim sLine As String Dim hMem As Long Dim lPtrMem As Long Dim iSize As Integer Dim lR As Long Dim b() As Byte Dim eCompare As VbCompareMethod Dim iPos As Long Dim iCharIndex As Long Dim iStartPos As Long If (m_eFindFlags And FR_MATCHCASE) = FR_MATCHCASE Then eCompare = vbBinaryCompare Else eCompare = vbTextCompare End If If (IsNt) Then hMem = LocalAlloc(GPTR, 4096) Else hMem = LocalAlloc(GPTR, 2048) End If lPtrMem = LocalLock(hMem) iSize = 2048 If (IsNt) Then lLines = SendMessageLongW(txtTrace.hWnd, EM_GETLINECOUNT, 0, 0) Else lLines = SendMessageLong(txtTrace.hWnd, EM_GETLINECOUNT, 0, 0) End If lFirstLine = 0 If (m_iLastFindIndex > 0) Then If (IsNt) Then lFirstLine = SendMessageLongW(txtTrace.hWnd, EM_LINEFROMCHAR, m_iLastFindIndex, 0) Else lFirstLine = SendMessageLong(txtTrace.hWnd, EM_LINEFROMCHAR, m_iLastFindIndex, 0) End If End If lLine = lFirstLine Do sLine = "" CopyMemory ByVal lPtrMem, iSize, 2 If (IsNt) Then lR = SendMessageLongW(txtTrace.hWnd, EM_GETLINE, lLine, lPtrMem) If (lR > 0) Then ReDim b(0 To lR * 2 - 1) As Byte CopyMemory b(0), ByVal lPtrMem, lR * 2 sLine = b End If Else lR = SendMessageLong(txtTrace.hWnd, EM_GETLINE, lLine, lPtrMem) If (lR > 0) Then ReDim b(0 To lR - 1) As Byte CopyMemory b(0), ByVal lPtrMem, lR sLine = StrConv(b, vbUnicode) End If End If iStartPos = 1 If IsNt Then iCharIndex = SendMessageLongW(txtTrace.hWnd, EM_LINEINDEX, lLine, 0) Else iCharIndex = SendMessageLong(txtTrace.hWnd, EM_LINEINDEX, lLine, 0) End If If (m_iLastFindIndex > 0) Then ' does this line include m_iLastFindIndex? If (m_iLastFindIndex >= iCharIndex) And (m_iLastFindIndex <= iCharIndex + Len(sLine)) Then iStartPos = (m_iLastFindIndex + Len(m_sToFind) - iCharIndex) + 1 End If End If iPos = InStr(iStartPos, sLine, m_sToFind, eCompare) If (iPos > 0) Then iCharIndex = iCharIndex + iPos - 1 If (IsNt) Then SendMessageLongW txtTrace.hWnd, EM_SETSEL, iCharIndex, iCharIndex + Len(m_sToFind) SendMessageLongW txtTrace.hWnd, EM_SCROLLCARET, 0, 0 Else SendMessageLong txtTrace.hWnd, EM_SETSEL, iCharIndex, iCharIndex + Len(m_sToFind) SendMessageLong txtTrace.hWnd, EM_SCROLLCARET, 0, 0 End If Debug.Print iPos m_iLastFindIndex = iCharIndex txtTrace.SetFocus mnuEdit(3).Enabled = True Exit Do End If lLine = lLine + 1 Loop While lLine < lLines LocalUnlock hMem LocalFree hMem End Sub Private Function GetIcon(ByVal lId As Long) As Long If Not (m_hIcon = 0) Then DestroyIcon m_hIcon m_hIcon = 0 End If If (lId > 0) Then m_hIcon = LoadImageLong(App.hInstance, lId, IMAGE_ICON, 16, 16, 0) End If GetIcon = m_hIcon End Function Private Sub SaveTrace() On Error GoTo ErrorHandler Dim bPause As Boolean If Not (m_bPaused) Then bPause = True ActionHandler "PAUSE" End If Dim cD As New cCommonDialog Dim sFile As String If (cD.VBGetSaveFileName( _ FileName:=sFile, _ Filter:="Log Files (*.log)|*.log|CSV Files (*.csv)|*.csv|All Files (*.*)|*.*|", _ DefaultExt:="log", _ Owner:=Me.hWnd)) Then End If If (bPause) Then ActionHandler "GO" bPause = False End If Exit Sub ErrorHandler: MsgBox "An error occurred trying to save:" & Err.Description, vbExclamation If (bPause) Then ActionHandler "GO" bPause = False End If Exit Sub End Sub Private Sub CopyTrace() Dim lStart As Long Dim lEnd As Long Dim lSwap As Long Dim sBuf As String Dim bPause As Boolean On Error GoTo ErrorHandler If Not (m_bPaused) Then bPause = True ActionHandler "PAUSE" End If If IsNt Then SendMessageRefW txtTrace.hWnd, EM_GETSEL, lStart, lEnd Else SendMessageRef txtTrace.hWnd, EM_GETSEL, lStart, lEnd End If If (lStart = lEnd) Then ' everything sBuf = m_cMessage.Buffer Clipboard.Clear Clipboard.SetText sBuf Else If IsNt Then SendMessageLongW txtTrace.hWnd, WM_COPY, 0, 0 Else SendMessageLong txtTrace.hWnd, WM_COPY, 0, 0 End If End If If (bPause) Then ActionHandler "GO" bPause = False End If Exit Sub ErrorHandler: MsgBox "An error occurred trying to copy:" & Err.Description, vbExclamation If (bPause) Then ActionHandler "GO" bPause = False End If Exit Sub End Sub Private Sub SelectAll() ' Dim lLines As Long Dim lCharIndex As Long Dim lSize As Long lLines = SendMessageLong(txtTrace.hWnd, EM_GETLINECOUNT, 0, 0) - 1 lCharIndex = SendMessageLong(txtTrace.hWnd, EM_LINEINDEX, lLines, 0) lSize = SendMessageLong(txtTrace.hWnd, EM_LINELENGTH, lCharIndex, 0) SendMessageLong txtTrace.hWnd, EM_SETSEL, 0, lCharIndex + lSize ' End Sub Private Sub ConfigureTracer() ' Dim f As New frmConfigure f.Show vbModal, Me ' End Sub Private Sub ActionHandler(ByVal sAction As String) Select Case sAction Case "SAVE" SaveTrace Case "FIND" If (m_cFindReplace.hWndDialog = 0) Then m_cFindReplace.VBFindText Me.hWnd End If Case "FINDNEXT" FindInTextBox Case "COPY" CopyTrace Case "SELECTALL" SelectAll Case "CLEAR" m_cMessage.Clear txtTrace.Text = "" m_iLength = 0 Case "PAUSE" m_bPaused = True mnuTrace(0).Checked = True m_cSysTray.IconHandle = GetIcon(25) Case "GO" m_bPaused = False m_cMessage_DataAdded mnuTrace(0).Checked = False m_cSysTray.IconHandle = GetIcon(24) Case "CONFIGURE" ConfigureTracer Case "RESTORE" Me.Tag = "RESTORE" Me.Visible = True m_cSysTray.RestoreAndActivate Me.hWnd Me.Tag = "" Case "EXIT" Unload Me Case "ABOUT" Dim fA As New frmAbout Set fA.Icon = Me.Icon fA.Show vbModal, Me End Select End Sub Private Sub Command1_Click() Dim sNewData As String sNewData = String$(100, "0") & vbCrLf Dim i As Long txtTrace.Visible = False For i = 1 To 700 AddData sNewData Next i txtTrace.Visible = True Dim lStart As Long Dim lEnd As Long If IsNt Then SendMessageRefW txtTrace.hWnd, EM_GETSEL, lStart, lEnd Else SendMessageRef txtTrace.hWnd, EM_GETSEL, lStart, lEnd End If Debug.Print lStart, lEnd ' Dim sNewData As String ' sNewData = "Hi Mum" & vbCrLf ' Dim lT As Long ' Dim i As Long ' timeBeginPeriod 1 ' ' txtTrace.Text = "" ' txtTrace.Visible = False ' lT = timeGetTime() ' For i = 1 To 2000 ' txtTrace.Text = txtTrace.Text & sNewData ' Next i ' txtTrace.Visible = True ' MsgBox "VB Method: " & timeGetTime() - lT ' ' txtTrace.Text = "" ' m_iLength = 0 ' lT = timeGetTime() ' txtTrace.Visible = False ' For i = 1 To 2000 ' txtTrace.SelStart = m_iLength ' SendMessageString txtTrace.hwnd, EM_REPLACESEL, 0, sNewData ' m_iLength = m_iLength + Len(sNewData) ' Next i ' txtTrace.Visible = True ' MsgBox "API Method: " & timeGetTime() - lT ' ' timeEndPeriod 1 End Sub Public Sub AddData(ByVal sData As String) Dim lLines As Long Dim lStart As Long Dim lEnd As Long If (Len(sData) > 0) Then If (IsNt) Then lLines = SendMessageLongW(txtTrace.hWnd, EM_GETLINECOUNT, 0, 0) If (lLines > g_cConfiguration.MaxLines) Then lStart = SendMessageLongW(txtTrace.hWnd, EM_LINEINDEX, 0, 0) lEnd = SendMessageLongW(txtTrace.hWnd, EM_LINEINDEX, 1, 0) SendMessageLongW txtTrace.hWnd, EM_SETSEL, lStart, lEnd - 1 SendMessageStringW txtTrace.hWnd, EM_REPLACESEL, 0, StrPtr("") End If SendMessageLongW txtTrace.hWnd, EM_SETSEL, m_iLength, m_iLength SendMessageStringW txtTrace.hWnd, EM_REPLACESEL, 0, StrPtr(sData) Else SendMessageLong txtTrace.hWnd, EM_SETSEL, m_iLength, m_iLength SendMessageStringA txtTrace.hWnd, EM_REPLACESEL, 0, sData End If m_iLength = m_iLength + Len(sData) End If End Sub Private Sub Form_Load() TagWindow Me.hWnd Set m_cSysTray = New frmSysTray Set m_cSysTray.Icon = Me.Icon m_cSysTray.AddMenuItem "&Restore", "RESTORE", True m_cSysTray.AddMenuItem "-" m_cSysTray.AddMenuItem "E&xit", "EXIT" m_cSysTray.ToolTip = "VB Tracer" Load m_cSysTray Set m_cMessage = New frmMessageWindow Load m_cMessage Set m_cFindReplace = New cFindReplace ActionHandler "GO" End Sub Private Sub Form_Resize() If Me.Tag <> "RESTORE" Then If (Me.WindowState = vbMinimized) Then Me.Visible = False End If End If On Error Resume Next txtTrace.Move txtTrace.Left, txtTrace.Top, Me.ScaleWidth - txtTrace.Left * 2, Me.ScaleHeight - txtTrace.Top * 2 End Sub Private Sub m_cFindReplace_FindNext(ByVal sToFind As String, ByVal eFlags As EFindReplaceFlags) ' If Not (StrComp(sToFind, m_sToFind) = 0) Then m_sToFind = sToFind m_iLastFindIndex = 0 End If FindInTextBox ' End Sub Private Sub m_cFindReplace_ShowHelp() ' End Sub Private Sub m_cMessage_DataAdded() ' If Not m_bPaused Then AddData m_cMessage.NewData End If ' End Sub Private Sub m_cSysTray_MenuClick(ByVal lIndex As Long, ByVal sKey As String) ActionHandler sKey End Sub Private Sub m_cSysTray_SysTrayDoubleClick(ByVal eButton As MouseButtonConstants) ActionHandler "RESTORE" End Sub Private Sub m_cSysTray_SysTrayMouseUp(ByVal eButton As MouseButtonConstants) If (eButton = vbLeftButton) Then ActionHandler "RESTORE" ElseIf (eButton = vbRightButton) Then m_cSysTray.ShowMenu End If End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) GetIcon 0 Unload m_cSysTray Set m_cSysTray = Nothing Unload m_cMessage Set m_cMessage = Nothing EndApp End Sub Private Sub mnuEdit_Click(Index As Integer) Select Case Index Case 0 ActionHandler "COPY" Case 2 ActionHandler "FIND" Case 3 ActionHandler "FINDNEXT" Case 5 ActionHandler "SELECTALL" Case 6 ActionHandler "CLEAR" End Select End Sub Private Sub mnuFile_Click(Index As Integer) Select Case Index Case 0 ActionHandler "SAVE" Case 2 ActionHandler "EXIT" End Select End Sub Private Sub mnuHelp_Click(Index As Integer) Select Case Index Case 0 ActionHandler "ABOUT" End Select End Sub Private Sub mnuTrace_Click(Index As Integer) Select Case Index Case 0 If (mnuTrace(0).Checked) Then ActionHandler "GO" Else ActionHandler "PAUSE" End If Case 2 ActionHandler "CONFIGURE" End Select End Sub