Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

20 Сентябрь 2020, 19:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3   Вниз
  Печать  
Автор Тема: Функция Msgbox - не влезает большой текст  (Прочитано 3575 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tigrik
Форумчанин
***
Offline Offline

Сообщений: 94


« Ответ #55090: 29 Июнь 2020, 20:55 »

Для макроса Диалога с кнопками нужен подсчёт максимальной длины строки текста и количество строк. Со вторым - ноу проблем.
С длиной строки, также, не очень тяжело, но появилась дилемма. Вставить этот просчёт в тот макрос, где происходит основная компоновка строк (при этом как-то "некрасиво" усложняется код) ИЛИ запустить это отдельным циклом, уже после сборки строк текста. Решил, что, пока, не буду усложнять функцию сборки строк - там только "разбивка" слов (если нужно) и "сборка" строк.

Но в данном примере, тоже некоторая дилемма между выбором двух похожих элементов кода.
Первая процедура - это часть макроса Диалога, где необходим анализ текста сообщений и надписей на кнопках.
Понятно, что, как говориться, "на вкус и цвет все фломастеры разные" - то есть каждый выбирает, что ему подходит. Но я стараюсь делать, по большей части, в одном цикле, если это можно, но, в данном случае, второй вариант намного легче, компактнее и понятен, но два раза повторяет один и тот же (почти тот же) цикл.
Здесь используется "облегченная" версия функции по сборке строк (LayoutOneStringWords) - там анализируется только одно строка и убраны лишние действия.
Код:
Sub PartMacroDlgStr()
Dim strText$, MaxChar%, numStrMess%, lenStrMess% '   Текст, Ограничитель по символам, кол-во строк, Макс.длина строки для Сообщения
Dim aTextButt$(), MaxCharButt%, numStrButt%,lenStrButt% '   Тоже самое, для Кнопок
Dim tt(), lenStr%, i%, tt2(), j%, s$
strText = "Первая строка текста сообщения." & chr(10) & "Вторая строка для текста." & chr(10) & "Третья строка"
'strText = "Электровоздухораспределитель - это очень длинное слово!"
aTextButt$() = Array("Первая кнопка", "Вторая кнопка", "Ещё одна кнопка", "Кнопка в двумя строками" & chr(10) & "Вторая строка надписи", "Крайняя кнопка", )
MaxChar = 20
strText = replace(strText, chr(13), chr(10))
'=========    ПЕРВЫЙ ВАРИАНТ анализа строк текста сообщения
tt() = Split(strText, chr(10))
For i = 0 To UBound(tt())
lenStr = Len(tt(i))
If lenStr > MaxChar Then '   Компоновка тех строк, где длина превышает Ограничитель
tt(i) = LayoutOneStringWords(tt(i), MaxChar)
tt2() = Split(tt(i), chr(10))
For j = 0 To UBound(tt2()) '   Поиск максимальной длины строки
lenStr2 = Len(tt2(j))
lenStrMess = IIf(lenStr2 > lenStrMess, lenStr2, lenStrMess)
Next
Else '   Поиск максимальной длины строки, если не нужна компоновка
lenStrMess = IIf(lenStr > lenStrMess, lenStr, lenStrMess)
EndIf
Next
s = Join(tt(), chr(10))
numStrMess = UBound(Split(s, chr(10))) + 1
s = "Был введен текст: " & chr(10) & strText & chr(10) & String(30, "-") & chr(10) & _
"Ограничение по количеству символов в строке: " & MaxChar & chr(10) &_
"Длина введенного текста: " & Len(strText) & chr(10) & chr(10) & _
"ПОЛУЧИЛОСЬ =>" & chr(10) & "Новый текст: " & chr(10) & s & chr(10) & String(30, "-") & chr(10) & _
"Длина полученного текста: " & Len(s) & chr(10) & "Максимальная длина строки: "  & lenStrMess & chr(10) & _
"Количество строк в тексте: " & numStrMess
Msgbox s
'=========    ВТОРОЙ ВАРИАНТ анализа строк текста сообщения
tt() = Split(strText, chr(10))
For i = 0 To UBound(tt()) '   Компоновка тех строк, где длина превышает Ограничитель
If Len(tt(i)) > MaxChar Then tt(i) = LayoutOneStringWords(tt(i), MaxChar)
Next
tt() = Split(Join(tt(), chr(10)), chr(10))
For i = 0 To UBound(tt()) '   Поиск максимальной длины строки
lenStr = Len(tt(i))
lenStrMess = IIf(lenStr > lenStrMess, lenStr, lenStrMess)
Next
numStrMess = i
s = Join(tt(), chr(10))
s = "Был введен текст: " & chr(10) & strText & chr(10) & String(30, "-") & chr(10) & _
"Ограничение по количеству символов в строке: " & MaxChar & chr(10) &_
"Длина введенного текста: " & Len(strText) & chr(10) & chr(10) & _
"ПОЛУЧИЛОСЬ =>" & chr(10) & "Новый текст: " & chr(10) & s & chr(10) & String(30, "-") & chr(10) & _
"Длина полученного текста: " & Len(s) & chr(10) & "Максимальная длина строки: "  & lenStrMess & chr(10) & _
"Количество строк в тексте: " & numStrMess
Msgbox s
End Sub


Function LayoutOneStringWords(strText$, MaxChar%) As String
Dim newText$, i%, j%, lf%, limit%
Dim lenWord%, sWord$, nPlus%, iW%, lenStrMax%
newText = replace(strText, chr(13), chr(10))
limit = MaxChar
Do While j < len(newText)
j = InStr(i+1, newText, " ")
If j = 0 Then j = len(newText) +1
If j > limit + 1 Then '   Если указатель превышает установленное ограничение
lenWord = j - i - 1
sWord = mid(newText, i + 1, lenWord)
If lenWord > MaxChar Then '   Если текущее слово длиннее, чем MaxChar
nPlus = lenWord / MaxChar - 0.501
For iW = MaxChar To Len(sWord) + nPlus - 1 Step MaxChar + 1
sWord = Left(sWord, iW) & chr(10) & Right(sWord, Len(sWord) - iW)
Next
newText = Left(newText, i) & sWord & Right(newText, Len(newText) - j + 1)
EndIf
If i Then mid(newText, i, 1, chr(10)) '   Если первое слово приходится 'разбивать', то перед ним ничего не ставим
limit = i + MaxChar * (nPlus + 1) + nPlus
End If
j = j + nPlus '   Увеличение указателя на количество пробелов в 'разбитом' слове
i = j
nPlus = 0
Loop
LayoutOneStringWords = newText
End Function

По данному примеру - есть ли какие-нибудь рекомендации в плане "стиля" или "негласных" правил программирования?
Какой вариант более "стильный"?
Записан
Страниц: « 1 2 3   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!