Как выделить текст? - VB

Узнай цену своей работы

Формулировка задачи:

Допустим, у меня есть строковая переменная, которая содержит текст,как можно выделить красным цветом содержание этой переменной?

Решение задачи: «Как выделить текст?»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Type TColorWord
  4.     Word        As String
  5.     Color       As Long
  6. End Type
  7.  
  8. Private Type TColorRange
  9.     StartString   As String
  10.     StopString    As String
  11.     Color       As Long
  12. End Type
  13.  
  14. Private Type POINTAPI
  15.         X       As Long
  16.         Y       As Long
  17. End Type
  18.  
  19. Private Type RECT
  20.         Left    As Long
  21.         Top     As Long
  22.         Right   As Long
  23.         Bottom  As Long
  24. End Type
  25.  
  26. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  27. Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  28. Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
  29. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  30. Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
  31. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  32. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  33. Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal lpPoint As Any) As Long
  34. Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
  35. Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
  36. Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  37. Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  38. Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As POINTAPI) As Long
  39. Private Declare Function MulDiv Lib "kernel32" (ByVal nNumber As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long
  40. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
  41. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  42. Private Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal nHeight As Long, ByVal nWidth As Long, ByVal nEscapement As Long, ByVal nOrientation As Long, ByVal fnWeight As Long, ByVal fdwItalic As Boolean, ByVal fdwUnderline As Boolean, ByVal fdwStrikeOut As Boolean, ByVal fdwCharSet As Long, ByVal fdwOutputPrecision As Long, ByVal fdwClipPrecision As Long, ByVal fdwQuality As Long, ByVal fdwPitchAndFamily As Long, ByVal lpszFace As String) As Long
  43. Private Declare Function HideCaret Lib "user32" (ByVal hwnd As Long) As Long
  44. Private Declare Function ShowCaret Lib "user32" (ByVal hwnd As Long) As Long
  45. Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
  46. Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  47.  
  48. Private Const GWL_WNDPROC = (-4), _
  49.               WM_PAINT = &HF, _
  50.               WM_MOUSEMOVE = &H200, _
  51.               MK_LBUTTON = &H1, _
  52.               WM_LBUTTONUP = &H202, _
  53.               WM_PASTE = &H302, _
  54.               WM_KILLFOCUS = &H8, _
  55.               WM_SETFOCUS = &H7, _
  56.               WM_HSCROLL = &H114, _
  57.               WM_VSCROLL = &H115, _
  58.               WM_MOUSEWHEEL = &H20A, _
  59.               SB_ENDSCROLL = 8, _
  60.               WM_KEYDOWN = &H100, _
  61.               VK_BACK = &H8, _
  62.               VK_TAB = &H9, _
  63.               WM_CHAR = &H102, _
  64.               VK_SHIFT = &H10, _
  65.               EM_POSFROMCHAR = &HD6
  66. Private Const EM_LINEFROMCHAR = &HC9, _
  67.               WM_GETFONT = &H31, _
  68.               EM_LINEINDEX = &HBB, _
  69.               EM_LINELENGTH = &HC1, _
  70.               EM_GETLINE = &HC4, _
  71.               EM_CHARFROMPOS = &HD7, _
  72.               EM_GETFIRSTVISIBLELINE = &HCE, _
  73.               EM_GETRECT = &HB2, _
  74.               PS_SOLID = 0, _
  75.               DEFAULT_CHARSET = 1, _
  76.               LOGPIXELSY = 90, _
  77.               OUT_DEFAULT_PRECIS = 0, _
  78.               CLIP_DEFAULT_PRECIS = 0, _
  79.               DEFAULT_PITCH = 0, _
  80.               FW_NORMAL = 400, _
  81.               DEFAULT_QUALITY = 0, _
  82.               WM_SETFONT = &H30, _
  83.               COLOR_HIGHLIGHT = 13, _
  84.               COLOR_HIGHLIGHTTEXT = 14, _
  85.               COLOR_BTNFACE = 15, _
  86.               EM_GETLINECOUNT = &HBA
  87.  
  88. Public PrevProc                 As Long
  89.  
  90. Private ColorTextBox            As TextBox, _
  91.         ColorTextBoxParentForm  As Form, _
  92.         CWord()                 As TColorWord, _
  93.         CRange()                As TColorRange, _
  94.         TexthDC                 As Long, _
  95.         hFont                   As Long, _
  96.         hPen                    As Long, _
  97.         CharHeight              As Long, _
  98.         CharWidth               As Long, _
  99.         HLColor                 As Long, _
  100.         NColor                  As Long, _
  101.         HLTextColor             As Long, _
  102.         NTextColor              As Long, _
  103.         CurrentBkColor          As Long, _
  104.         CurrentTextColor        As Long, _
  105.         CColor                  As Long, _
  106.         CTextColor              As Long
  107.  
  108. Private Sub PrepareTextBox()
  109. Dim FontHeight As Long
  110. ColorTextBox.ForeColor = vbBlack
  111. ColorTextBox.BackColor = vbWhite
  112. FontHeight = -MulDiv(10, GetDeviceCaps(GetDC(0), LOGPIXELSY), 72)
  113. hFont = CreateFont(FontHeight, 0, 0, 0, FW_NORMAL, False, False, False, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "courier new")
  114. SendMessage ColorTextBox.hwnd, WM_SETFONT, hFont, 0
  115. TexthDC = GetDC(ColorTextBox.hwnd)
  116. SelectObject TexthDC, hFont
  117. hPen = CreatePen(PS_SOLID, 0, ColorTextBox.BackColor)
  118. SelectObject TexthDC, hPen
  119. End Sub
  120.  
  121. Private Sub PrepareVars()
  122. Dim Size As POINTAPI
  123. ReDim CWord(0)
  124. ReDim CRange(0)
  125. GetTextExtentPoint32 TexthDC, "x", 1, Size
  126. CharHeight = Size.Y: CharWidth = Size.X
  127. HLColor = GetSysColor(COLOR_HIGHLIGHT)
  128. HLTextColor = GetSysColor(COLOR_HIGHLIGHTTEXT)
  129. NColor = ColorTextBox.BackColor
  130. NTextColor = vbBlue
  131. CColor = ColorTextBox.BackColor
  132. CTextColor = ColorTextBox.ForeColor
  133. CurrentTextColor = 1
  134. End Sub
  135.  
  136. Public Sub AddColorWord(Word As String, Color As Long)
  137. Dim i As Long
  138. For i = 0 To UBound(CWord)
  139.     If CWord(i).Word = "" Or UCase(CWord(i).Word) = UCase(Word) Then
  140.         With CWord(i)
  141.             .Word = Word
  142.             .Color = Color
  143.         End With
  144.         Exit Sub
  145.     End If
  146. Next i
  147. ReDim Preserve CWord(UBound(CWord) + 1)
  148. With CWord(UBound(CWord))
  149.     .Word = Word
  150.     .Color = Color
  151. End With
  152. End Sub
  153.  
  154. Public Sub DeleteColorWord(Word As String)
  155. Dim i As Long
  156. For i = 0 To UBound(CWord)
  157.     If UCase(CWord(i).Word) = UCase(Word) Then CWord(i).Word = ""
  158. Next i
  159. End Sub
  160.  
  161. Public Sub AddColorRange(StartString As String, StopString As String, Color As Long)
  162. Dim i As Long
  163. For i = 0 To UBound(CRange)
  164.     If CRange(i).StartString = "" Or UCase(CRange(i).StartString) = UCase(StartString) Then
  165.         With CRange(i)
  166.             .StartString = StartString
  167.             .StopString = StopString
  168.             .Color = Color
  169.         End With
  170.         Exit Sub
  171.     End If
  172. Next i
  173. ReDim Preserve CRange(UBound(CRange) + 1)
  174. With CRange(UBound(CRange))
  175.     .StartString = StartString
  176.     .StopString = StopString
  177.     .Color = Color
  178. End With
  179. End Sub
  180.  
  181. Public Sub DeleteColorRange(StartString As String)
  182. Dim i As Long
  183. For i = 0 To UBound(CRange)
  184.     If UCase(CRange(i).StartString) = UCase(StartString) Then CRange(i).StartString = ""
  185. Next i
  186. End Sub
  187.  
  188. Private Sub PaintLine(LineIndex As Long, Selected As Boolean)
  189. Dim s               As String, _
  190.     ss              As String, _
  191.     Chp             As Long, _
  192.     Chp2            As Long, _
  193.     MinChp          As Long, _
  194.     MinChpIndex     As Long, _
  195.     m               As Long, _
  196.     X               As Long, _
  197.     Y               As Long, _
  198.     SChp            As Long, _
  199.     PosFromChar     As Long, _
  200.     chIndex         As Long, _
  201.     SelLength       As Long, _
  202.     i               As Long, _
  203.     SelStart        As Long, _
  204.     n               As Long, _
  205.     OK              As Boolean, _
  206.     WordForOut      As String, _
  207.     CW              As Boolean, _
  208.     WordForFinding  As String
  209. SelStart = ColorTextBox.SelStart
  210. SelLength = ColorTextBox.SelLength
  211. chIndex = SendMessage(ColorTextBox.hwnd, EM_LINEINDEX, LineIndex, 0&)
  212. s = Space(SendMessage(ColorTextBox.hwnd, EM_LINELENGTH, chIndex, 0&))
  213. SendMessage ColorTextBox.hwnd, EM_GETLINE, LineIndex, ByVal s
  214. HideCaret ColorTextBox.hwnd
  215. CW = True
  216. Do
  217.     If CW Then WordForFinding = CWord(n).Word
  218.     If WordForFinding <> "" Or Not CW Then
  219.         Do
  220.             OK = True
  221.             If CW Then
  222.                 Chp = InStr(Chp + 1, UCase(s), UCase(WordForFinding))
  223.                 If Chp = 0 Then Exit Do
  224.                 If Chp = 1 Then
  225.                     OK = True
  226.                 Else
  227.                     If Mid(s, Chp - 1, 1) = " " Then
  228.                         OK = True
  229.                     Else
  230.                         OK = False
  231.                     End If
  232.                 End If
  233.                 If OK And Chp + Len(WordForFinding) - 1 <> Len(s) Then
  234.                     ss = Mid(s, Chp + Len(WordForFinding), 1)
  235.                     If ss <> " " And ss <> "," And ss <> "(" And ss <> ")" Then OK = False
  236.                 End If
  237.             Else
  238.                 MinChpIndex = -1
  239.                 MinChp = Len(s)
  240.                 For m = 0 To UBound(CRange)
  241.                     X = InStr(Chp2 + 1, UCase(s), UCase(CRange(m).StartString))
  242.                     Y = IIf(CRange(m).StopString <> Chr(0), InStr(X + 1, UCase(s), UCase(CRange(m).StopString)), Len(s))
  243.                     If X <> 0 And X < MinChp And Y <> 0 Then
  244.                         MinChp = X
  245.                         MinChpIndex = m
  246.                         SChp = Y
  247.                     End If
  248.                 Next m
  249.                 If MinChpIndex <> -1 Then
  250.                     Chp = MinChp
  251.                     Chp2 = SChp
  252.                     OK = True
  253.                 Else
  254.                     Exit Do
  255.                 End If
  256.             End If
  257.             If OK Then
  258.                 If CW Then
  259.                     NTextColor = CWord(n).Color
  260.                     WordForOut = WordForFinding
  261.                 Else
  262.                     NTextColor = CRange(MinChpIndex).Color
  263.                     WordForOut = Mid(s, Chp, Chp2 - Chp + 1)
  264.                 End If
  265.                 PosFromChar = SendMessage(ColorTextBox.hwnd, EM_POSFROMCHAR, chIndex + Chp - 1, 1)
  266.                 'если слово не выделено:
  267.                If chIndex + Chp - 1 > SelStart + SelLength Or chIndex + Chp - 1 + Len(WordForOut) < SelStart Or Not Selected Then
  268.                     If CurrentTextColor <> NTextColor Then
  269.                         SetBkColor TexthDC, NColor
  270.                         SetTextColor TexthDC, NTextColor
  271.                         CurrentTextColor = NTextColor
  272.                     End If
  273.                     TextOut TexthDC, LoWord(PosFromChar), HiWord(PosFromChar), WordForOut, Len(WordForOut)
  274.                 Else
  275.                     'если всё слово выделено:
  276.                    If (chIndex + Chp - 1) >= SelStart And (chIndex + Chp - 1 + Len(WordForOut)) <= (SelStart + SelLength) Then
  277.                         If CurrentTextColor <> HLTextColor Then
  278.                             SetBkColor TexthDC, HLColor
  279.                             SetTextColor TexthDC, HLTextColor
  280.                             CurrentTextColor = HLTextColor
  281.                         End If
  282.                         TextOut TexthDC, LoWord(PosFromChar), HiWord(PosFromChar), WordForOut, Len(WordForOut)
  283.                     Else
  284.                         'полслова выделено, а полслова нет
  285.                        For i = chIndex + Chp - 1 To chIndex + Chp - 1 + Len(WordForOut) - 1
  286.                             If i >= SelStart And i < SelStart + SelLength Then
  287.                                 If CurrentTextColor <> HLTextColor Then
  288.                                     SetBkColor TexthDC, HLColor
  289.                                     SetTextColor TexthDC, HLTextColor
  290.                                     CurrentTextColor = HLTextColor
  291.                                 End If
  292.                             Else
  293.                                 If CurrentTextColor <> NTextColor Then
  294.                                     SetBkColor TexthDC, NColor
  295.                                     SetTextColor TexthDC, NTextColor
  296.                                     CurrentTextColor = NTextColor
  297.                                 End If
  298.                             End If
  299.                             TextOut TexthDC, LoWord(PosFromChar) + (i - (chIndex + Chp - 1)) * CharWidth, HiWord(PosFromChar), Mid(WordForOut, i - (chIndex + Chp - 1) + 1, 1), 1
  300.                         Next i
  301.                     End If
  302.                 End If
  303.             End If
  304.         Loop
  305.     End If
  306.     n = n + 1
  307.     If Not CW Then Exit Do
  308.     If CW And n > UBound(CWord) Then CW = False
  309. Loop
  310. ShowCaret ColorTextBox.hwnd
  311. End Sub
  312.  
  313. Public Sub CreateColorTextBox(TextBox As TextBox, ParentForm As Form)
  314. Set ColorTextBox = TextBox
  315. Set ColorTextBoxParentForm = ParentForm
  316. PrepareTextBox
  317. PrepareVars
  318. HookTextBox
  319. End Sub
  320.  
  321. Public Sub DestroyColorTextBox()
  322. UnHookTextBox
  323. ReDim CWord(0)
  324. ReDim CRange(0)
  325. ReleaseDC ColorTextBox.hwnd, TexthDC
  326. DeleteObject hPen
  327. ColorTextBox.Refresh
  328. Set ColorTextBox = Nothing
  329. Set ColorTextBoxParentForm = Nothing
  330. End Sub
  331.  
  332. Private Sub HookTextBox()
  333. PrevProc = SetWindowLong(ColorTextBox.hwnd, GWL_WNDPROC, AddressOf TextBoxWindowProc)
  334. End Sub
  335.  
  336. Private Sub UnHookTextBox()
  337. SetWindowLong ColorTextBox.hwnd, GWL_WNDPROC, PrevProc
  338. End Sub
  339.  
  340. Public Function TextBoxWindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  341. Dim ReDraw As Boolean
  342. If uMsg = WM_CHAR And wParam = VK_BACK Then
  343.     If Back_Pressed Then
  344.         uMsg = 0
  345.         ReDraw = True
  346.     End If
  347. End If
  348. If uMsg = WM_CHAR And wParam = VK_TAB Then
  349.     If (GetKeyState(VK_SHIFT) And &HF0000000) Then
  350.         ShiftTab_Pressed
  351.     Else
  352.         Tab_Pressed
  353.     End If
  354.     uMsg = 0
  355.     ReDraw = True
  356. End If
  357.  
  358. TextBoxWindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
  359. If uMsg = WM_CHAR Then DrawCurrentLine
  360. If uMsg = WM_PAINT _
  361.    Or uMsg = WM_LBUTTONUP _
  362.    Or uMsg = WM_PASTE _
  363.    Or (uMsg = WM_MOUSEMOVE And wParam = MK_LBUTTON) _
  364.    Or uMsg = WM_SETFOCUS _
  365.    Or uMsg = WM_KILLFOCUS _
  366.    Or ReDraw _
  367.    Or uMsg = WM_KEYDOWN _
  368.    Or uMsg = WM_CHAR _
  369. Then PaintAllLines uMsg <> WM_KILLFOCUS
  370. If uMsg = WM_KILLFOCUS Then SetTabStop True
  371. If uMsg = WM_SETFOCUS Then SetTabStop False
  372. If ((uMsg = WM_HSCROLL Or uMsg = WM_VSCROLL) And LoWord(wParam) = SB_ENDSCROLL) Or uMsg = WM_MOUSEWHEEL Then DrawVLines
  373. End Function
  374.  
  375. Public Function LoWord(DWord As Long) As Integer
  376. LoWord = IIf(DWord And &H8000&, DWord Or &HFFFF0000, DWord And &HFFFF&)
  377. End Function
  378.  
  379. Public Function HiWord(DWord As Long) As Integer
  380. HiWord = (DWord And &HFFFF0000) \ &H10000
  381. End Function
  382.  
  383. Private Sub PaintAllLines(Selected As Boolean)
  384. Dim FirstVisibleLine    As Long, _
  385.     VisibleLineCount    As Long, _
  386.     R                   As RECT, _
  387.     i                   As Long, _
  388.     LineCount           As Long
  389. LineCount = SendMessage(ColorTextBox.hwnd, EM_GETLINECOUNT, 0, 0)
  390. FirstVisibleLine = SendMessage(ColorTextBox.hwnd, EM_GETFIRSTVISIBLELINE, 0, 0)
  391. SendMessage ColorTextBox.hwnd, EM_GETRECT, 0, R
  392. VisibleLineCount = Int((R.Bottom - R.Top) / CharHeight)
  393. Debug.Print CStr(VisibleLineCount)
  394. For i = FirstVisibleLine To FirstVisibleLine + VisibleLineCount
  395.     If i >= VisibleLineCount + FirstVisibleLine Then Exit For
  396.     PaintLine i, Selected
  397. Next i
  398. End Sub
  399.  
  400. Private Sub DrawLine(LineIndex As Long)
  401. Dim s           As String, _
  402.     PosFromChar As Long, _
  403.     chIndex     As Long
  404. chIndex = SendMessage(ColorTextBox.hwnd, EM_LINEINDEX, LineIndex, 0&)
  405. s = Space(SendMessage(ColorTextBox.hwnd, EM_LINELENGTH, chIndex, 0&))
  406. SendMessage ColorTextBox.hwnd, EM_GETLINE, LineIndex, ByVal s
  407. HideCaret ColorTextBox.hwnd
  408. PosFromChar = SendMessage(ColorTextBox.hwnd, EM_POSFROMCHAR, chIndex, 1)
  409. If CurrentTextColor <> CTextColor Then
  410.     SetBkColor TexthDC, CColor
  411.     SetTextColor TexthDC, CTextColor
  412.     CurrentTextColor = CTextColor
  413. End If
  414. TextOut TexthDC, LoWord(PosFromChar), HiWord(PosFromChar), s, Len(s)
  415. ShowCaret ColorTextBox.hwnd
  416. End Sub
  417.  
  418. Private Sub DrawCurrentLine()
  419. DrawLine SendMessage(ColorTextBox.hwnd, EM_LINEFROMCHAR, ColorTextBox.SelStart, 0)
  420. End Sub
  421.  
  422. Private Sub DrawVLines()
  423. Dim ret As Long, _
  424.     R   As RECT
  425. SendMessage ColorTextBox.hwnd, EM_GETRECT, 0, R
  426. MoveToEx TexthDC, 0, 0, ret
  427. LineTo TexthDC, 0, R.Bottom
  428. MoveToEx TexthDC, R.Right, 0, ret
  429. LineTo TexthDC, R.Right, R.Bottom
  430. End Sub
  431.  
  432. Private Sub SetTabStop(Value As Boolean)
  433. Dim i As Long
  434. On Error Resume Next
  435. For i = 0 To ColorTextBoxParentForm.Controls.Count - 1
  436.    ColorTextBoxParentForm.Controls(i).TabStop = Value
  437. Next
  438. End Sub
  439.  
  440. Private Sub Tab_Pressed()
  441. Dim i           As Long, _
  442.     SelLength   As Long, _
  443.     k           As Long, _
  444.     s()         As String, _
  445.     SelStart    As Long
  446. SelLength = ColorTextBox.SelLength
  447. If SelLength = 0 Then
  448.     ColorTextBox.SelText = "    "
  449. Else
  450.     SelStart = ColorTextBox.SelStart
  451.     s = Split(ColorTextBox.SelText, vbCrLf)
  452.     For i = 0 To UBound(s)
  453.         If s(i) <> "" Then
  454.             s(i) = "    " + s(i)
  455.             k = k + 4
  456.         End If
  457.     Next i
  458.     ColorTextBox.SelText = Join(s, vbCrLf)
  459.     ColorTextBox.SelStart = SelStart
  460.     ColorTextBox.SelLength = SelLength + k
  461. End If
  462. End Sub
  463.  
  464. Private Function Back_Pressed() As Boolean
  465. Dim SelStart    As Long, _
  466.     s           As String
  467. SelStart = ColorTextBox.SelStart
  468. s = ColorTextBox.Text
  469. If SelStart < 4 Then
  470.     Back_Pressed = False
  471.     Exit Function
  472. End If
  473. If Mid(s, SelStart - 3, 4) = "    " Then
  474.     s = Mid(s, 1, SelStart - 4) + Mid(s, SelStart + 1)
  475.     ColorTextBox.SelStart = SelStart - 4
  476.     ColorTextBox.SelLength = 4
  477.     ColorTextBox.SelText = ""
  478.     Back_Pressed = True
  479. Else
  480.     Back_Pressed = False
  481. End If
  482. End Function
  483.  
  484. Private Sub ShiftTab_Pressed()
  485. Dim i           As Long, _
  486.     SelLength   As Long, _
  487.     k           As Long, _
  488.     s()         As String, _
  489.     n           As Long, _
  490.     m           As Long, _
  491.     SelStart    As Long
  492. SelLength = ColorTextBox.SelLength
  493. If SelLength = 0 Then Exit Sub
  494. SelStart = ColorTextBox.SelStart
  495. s = Split(ColorTextBox.SelText, vbCrLf)
  496. For i = 0 To UBound(s)
  497.     If s(i) <> "" Then
  498.         m = Len(s(i))
  499.         n = m - Len(LTrim(s(i))) 'количество левых пробелов
  500.        If n <> 0 Then
  501.             If n >= 4 Then
  502.                 s(i) = Space(n - 4) + LTrim(s(i))
  503.             Else
  504.                 s(i) = LTrim(s(i))
  505.             End If
  506.             k = k + m - Len(s(i))
  507.         End If
  508.     End If
  509. Next i
  510. ColorTextBox.SelText = Join(s, vbCrLf)
  511. ColorTextBox.SelStart = SelStart
  512. ColorTextBox.SelLength = SelLength - k
  513. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы