SAMLPE: Форматирование текста (подстановка параметров)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

SAMLPE: Форматирование текста (подстановка параметров)

Сообщение alibek » 31.01.2005 (Пн) 15:49

Сделал сегодня в одном проекте, а потом подумал, может еще кому пригодится?
Код: Выделить всё
'Форматирование текста

Function FirstInStr(ByVal Start As Long, ByVal Text As String, ParamArray Chars() As Variant) As Long
Dim I As Long, P As Long, PMin As Long
PMin = 0&
For I = LBound(Chars) To UBound(Chars)
  P = InStr(Start, Text, Chars(I), vbBinaryCompare)
  If P > 0 And (P < PMin Or PMin = 0) Then PMin = P
Next I
FirstInStr = PMin
End Function

Function FormatText(ByVal FormatString As String, ParamArray Args() As Variant) As String
Const TagEscape As String = "\", TagOpen As String = "{", TagClose As String = "}"
Const TagPrefix As String = "#", TagSeparator As String = ";", TagQuote As String = "'"
Dim res As String, I0 As Long, I As Long, N As Long, fTagOpen As Boolean, TagValue As Variant, TagFormat As String
I0 = 1
res = vbNullString
Do Until I0 > Len(FormatString)
  If fTagOpen Then
    I = FirstInStr(I0, FormatString, TagClose)
    If I = 0 Then I = Len(FormatString) + 1
    TagValue = Mid$(FormatString, I0 + Len(TagOpen), I - I0 - 1)
    fTagOpen = False
    I = I + 1
    N = InStr(TagValue, TagSeparator)
    If N > 0 Then
      TagFormat = Mid$(TagValue, N + Len(TagSeparator))
      TagValue = Left$(TagValue, N - 1)
    End If
    If Left$(TagValue, Len(TagPrefix)) = TagPrefix Then
      TagValue = Args(Val(Mid$(TagValue, Len(TagPrefix) + 1)) - 1 + LBound(Args))
    Else
      TagValue = Null
    End If
    If Left$(TagFormat, Len(TagQuote)) = TagQuote And Right$(TagFormat, Len(TagQuote)) = TagQuote Then
      TagFormat = Mid$(TagFormat, Len(TagQuote) + 1, Len(TagFormat) - 2 * Len(TagQuote))
    Else
      TagFormat = vbNullString
    End If
    res = res & Format$(TagValue, TagFormat)
  Else
    I = FirstInStr(I0, FormatString, TagEscape, TagOpen)
    If I = 0 Then I = Len(FormatString) + 1
    res = res & Mid$(FormatString, I0, I - I0)
    If Mid$(FormatString, I, Len(TagEscape)) = TagEscape Then
      res = res & Mid$(FormatString, I + 1, 1)
      I = I + 2
    ElseIf Mid$(FormatString, I, Len(TagOpen)) = TagOpen Then
      TagFormat = vbNullString
      fTagOpen = True
    End If
  End If
  I0 = I
Loop
FormatText = res
End Function


Пример использования:
Код: Выделить всё
?FormatText("\{ Page -{#1}- from -{#2;'000'}- \}", 1, 15)

Вернет:
Код: Выделить всё
{ Page -1- from -015- }


Краткое описание спец.символов:
\ - escape-символ. Следующий за ним символ будет подставлен без интерпретации.
{, } - поле параметра. Состоит из порядкового номера параметра, предваряемого символом '#' и необязательной строки формата, отделенной точкой с запятой. Оба аргумента передаются в функцию Format(), поэтому и интерпретация их такая же, как у этой функции.
Lasciate ogni speranza, voi ch'entrate.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList