Функция Msgbox - не влезает большой текст

Автор Tigrik, 15 июня 2020, 19:06

0 Пользователи и 1 гость просматривают эту тему.

Tigrik

Цитата: rami от 18 июня 2020, 23:12
Цитата: Tigrik от 18 июня 2020, 03:49... но появилась идея сделать универсальный макрос (мне нравится делать универсальные программы).
В данном случае это плохая идея, чтобы написать хорошую универсальную программу нужно сначала написать несколько (желательно много) программ с общим функционалом и какими-нибудь различиями, а затем уже пытаться делать что-то универсальное. Да и исполнение в стиле говнокода, тяжело разбираться с таким кодом. Самое тяжёлое и неоправданное это размещение нескольких строк кода на одной физической строке с помощью двоеточия. А с учётом других "особенностей" кода, лучше не надо...

Старайтесь писать код проще, без "наворотов".
Конечно, я не собираюсь спорить и что-то доказывать.
Возможно, я не правильно сказал про универсальность, но я имел ввиду, что этот макрос может выводит диалог с различным количеством кнопок и разным текстом на них и в сообщении.
Опять же, не оправдании ради, но я только с начала года осваиваю макросы и обучаюсь этому только на своём опыте и некоторых примерах (из книги Питоньяка, из стандартной библиотеки, с этого форума). Поэтому, пока, нет вообще никакого стиля.
А для чего тогда придуманы эти двоеточия (в примерах их применяют, достаточно, часто) - на мой взгляд, несложные элементы коды очень не плохо "читаются" по несколько на одной строке. А в данном примере, я это сделал и для экономии строк - я не знаю сколько строк кода можно вложить в сообщение.
Ну, ладно, это лирика - некоторые эмоциональные реакции.

На самом деле, макрос далеко не оптимизирован, хоть и рабочий (во всяком случае, у меня работает нормально). Я поспешил его выложить, так как у нас был "разговор" о правильном вычисление размеров знакоместа символа. По большому счету, мне не хотелось бы менять шрифт (попытка поменять шрифт и некоторые его параметры - что бы было легче увидеть изменения в тексте). Если получится без изменения шрифта - хорошо, если без моноширинного шрифта не обойтись, тогда буду менять шрифт.
Вы попросили образец диалога - я его предоставил (в этом диалоге есть текст - это то, что нужно). Если этот макрос не подходит - скажите об этом, я сделаю другой.

rami

Цитата: Tigrik от 19 июня 2020, 01:30Поэтому, пока, нет вообще никакого стиля.
Отсутствие стиля очень плохо, на самом деле у вас есть неплохой стиль, вы объявляете переменные, пишете комментарии — это хорошо, но есть вещи которые сильно ухудшают восприятие кода, делают его трудноредактируемым. Говнокод — это не ошибка, это "дурной стиль", компьютер его выполнит так же хорошо, как и хороший чистый код, но человеку работать с говнокодом очень тяжело.

Цитата: Tigrik от 19 июня 2020, 01:30А для чего тогда придуманы эти двоеточия (в примерах их применяют, достаточно, часто) - на мой взгляд, несложные элементы коды очень не плохо "читаются" по несколько на одной строке.
Это пережитки прошлого, перевод книги Питоньяка сделан в 2008г. а оригинал написан в 2004г.
Если ваш макрос состоит из 5 строчек, то нет проблем, но в вашем коде из Ответ #13 есть 131 строка (ещё там не хватает двух макросов). Работа с переменными должна выглядеть так:

переменная1 = выражение1 'комментарий
переменная2 = выражение2 'комментарий
переменная3 = выражение3 'комментарий
переменная4 = выражение4 'комментарий
переменная5 = выражение5 'комментарий
переменная6 = выражение6 'комментарий
переменная7 = выражение7 'комментарий

если нужно найти "переменная4", то я "пробегаю" взглядом по левому краю редактора кода и нахожу переменную, но если тот же код записан так:

переменная1 = выражение1 : переменная2 = выражение2 'комментарий
переменная3 = выражение3 : переменная4 = выражение4 : переменная5 = выражение5 'комментарий
переменная6 = выражение6 : переменная7 = выражение7 'комментарий

то вместо поиска по вертикальной линии (линейная сложность — в 10 раз больше строк, в 10 раз трудней найти), нужно искать по всей площади кода (квадратичная сложность — в 10 раз больше строк, в 100 раз труднее найти). Можно использовать "Поиск", но это не оправдывает использование двоеточия. Если нужно закомментировать или поставить точку останова, прийдётся переписывать код, не лучше ли сразу писать "для людей" (компьютер с экрана код не читает, ему всё равно)?
Использование двоеточия допустимо в простых конструкциях: в однострочных If  Then или простых Select Case, например:
Select Case onRezult
Case -2 : Msgbox "Большое количество кнопок!", 0, "Ошибка!"
Case -1 : Msgbox "Очень большой текст!", 0, "Ошибка!"
Case 0 : Msgbox "Выход без кнопки!"
Case Else : Msgbox ("Нажата кнопка № " & onRezult)
End Select

или
If i = 0 Then If nn+1 > maxCharY(0) Then DlgMsgButtonLight=-1 : Exit Sub

Ещё желательно избегать символов подчёркивания _ в переменных и именах функций (за исключением методов листенера), редактор считает подчёркивание как разделитель слов и при щелчке по переменной не выделяет её полностью, приходится выделять протягиванием курсора, что не удобно.

Почитайте чем функции Function отличаются от процедур Sub, у вас Sub Dlg_MsgButton_Light(aTextButton(), Optional strDlgTitle$, Optional strDlgMess$) As Integer по факту является функцией (возвращает значение), но вы его обозначаете как Sub, что может сбивать с толку (хотя работает как надо)

Очень полезно использовать константы Const вместо переменных, это сокращает возможность ошибок, улучшает читаемость кода (константы принято писать в верхнем регистре, а переменные в нижнем), сокращает код (не нужно объявлять переменные и присваивать им значения в макросе)

Цитата: Tigrik от 19 июня 2020, 01:30А в данном примере, я это сделал и для экономии строк - я не знаю сколько строк кода можно вложить в сообщение.
Не имеет значения, пишете ли вы одну строку с тысячей символов или тысячу строк с одним символом, есть какое-то ограничение на количество символов, но как говорится "ограничение есть, но вы пишите" ;D

Цитата: Tigrik от 19 июня 2020, 01:30Вы попросили образец диалога - я его предоставил (в этом диалоге есть текст - это то, что нужно). Если этот макрос не подходит - скажите об этом, я сделаю другой.
Я думал, что по вашему коду станет ясно что вы хотите, но вы погрязли в мелочных расчётах которые никому не нужны, а главное — взаимодействие с пользователем у вас в стиле: "эй, ты, неудачник, пешы исчё, у тибя многа букав" (пользователь должен догадаться где и сколько лишних букв он написал не видя никакого диалога)

Если вы хотите отработать взаимодействие с пользователем, достаточен такой код:
Sub StartDlgMsgButton
Dim aTextButtom(), strDlgTitle$, strDlgMess$, onRezult%
aTextButtom() = Array("ДА", "НЕТ", "Надо подумать!!!")
strDlgTitle = "Окно Диалога с кнопками"
strDlgMess = "Текст сообщения может быть длинным!"  & chr(10) & "А нужно выбрать одну кнопку."
' aTextButtom() = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15") 'Большое кол-во кнопок
' aTextButtom() = Array("ДА", "НЕТ", String(56+1, "A")) 'Большой текст на Кнопке для проверки ошибки
' strDlgMess = String(180+1, "A") 'Большой текст Сообщения для проверки ошибки
' For onRezult = 1 To 45+1 : strDlgMess = strDlgMess & "A" & chr(10) : Next 'Большое кол-во строк Сообщения
' onRezult = DlgMsgButtonLight(Array("Запустить какую-то программу", "Взять какие-то данные", "Что-нибудь ещё")) 'Только кнопки
onRezult = DlgMsgButtonLight(aTextButtom(), strDlgTitle, strDlgMess)
Select Case onRezult
Case -2 : Msgbox "Большое количество кнопок!", 0, "Ошибка!"
Case -1 : Msgbox "Очень большой текст!", 0, "Ошибка!"
Case 0 : Msgbox "Выход без кнопки!"
Case Else : Msgbox ("Нажата кнопка № " & onRezult)
End Select
End Sub

Function DlgMsgButtonLight(aTextButton(), Optional strDlgTitle$, Optional strDlgMess$) As Integer
Const MAXLENMESS = 70, MAXBUT = 2 'изменить допустимые параметры
If IsMissing(strDlgMess) Then strDlgMess = "" Else If len(strDlgMess) > MAXLENMESS Then DlgMsgButtonLight = -1 : Exit Function 'Ошибка - превышена длина сообщения
If UBound(aTextButton) +1 > MAXBUT Then DlgMsgButtonLight = -2 : Exit Function 'Ошибка - превышено число кнопок
DlgMsgButtonLight = 0
End Function


А если хотите отработать правильную компоновку кнопок в диалоге, то создайте один единственный макрос создающий диалог с кнопками и больше ничего. Задачу нужно сводить к необходимому минимуму, чтобы ничего не отвлекало от решения.

(продолжение следует...)

Tigrik

Rami, большое спасибо.
Самое смешное (или не очень смешно), что некоторые вещи из того, что Вы сказали, мне известно. Но я не предавал этому, вообще никакого, внимания. Теперь придется следить за этим и взять за привычку всё это применять.
Пока не отошли далеко от двоеточий, хотелось бы задать вопрос. Допустимы ли такие элементы кода (2 или 3 такие строчки, не больше), но в большом макросе:

wChar = 5 : hChar = 8
maxXD = wCWin - indXY * 2 : maxYD = hCWin - indXY * 2

или

NumNum(1) = 1 : NumNum(2) = 2 : NumNum(3) = 3 : NumNum(4) = 2 : NumNum(5) = 2

Когда невозможно использовать такой способ: NumNum() = Array(1, 2, 3, 2, 2)

Или, все-таки, лучше вообще этого избегать в большом коде.


Подчеркивание в именах макросов - это временное - так я визуально выделяю эти макросы в библиотеках (у меня очень много тестовых и пробных макросов в различных модулях и библиотеках - после какого-то этапа будет "генеральная уборка" в Каталоге Объектов.

Tigrik

Решил оформить отдельным постом.

Скорее всего, Вы сами об этом скажите, так как это явно видно в большом макросе - не совсем правильно (ещё мягко сказано) подобранные переменные.
Мне, например, самому очень не нравится этот двумерный массив из 8 элементов - придумался на скорую руки, что бы, просто, посмотреть как будет всё работать. Это будет однозначно переделываться - этот вариант макроса очень "сырой" (это касается и некоторых других расчётов).

И я бы хотел узнать Ваше мнение. Вы рекомендуете, пока, не усложнять диалог, но я планирую, в любом случае, продолжит заниматься и этим вопросом. У меня есть два варианта избавится от этого массива.
1. Создать свою структуру-тип, наподобие PosSize: W, H, X, Y. Одна такая структура содержит информацию для Окна Диалога. Массив из двух элементов с такой структурой для Сообщения и Кнопки. Плюс ещё один двумерный массив для количество строк, кнопок и максимального числа символов в строке.

2. Вообщем-то, тоже самое, только без структуры, а через небольшие массивы.

Спасибо.

rami

Цитата: Tigrik от 19 июня 2020, 19:57Допустимы ли такие элементы кода (2 или 3 такие строчки, не больше), но в большом макросе:
Допустимо всё, что выполняется правильно, но если вы планируете редактировать код и показывать его другим людям, он должен быть "дружественным" и не "стыдным", чтобы не спрашивали "какой урод эту ересь написал?"

Если wChar = 5 не будет меняться во время выполнения кода, можно оформить как константу.
Цитата: Tigrik от 19 июня 2020, 20:32Вы рекомендуете, пока, не усложнять диалог, но я планирую, в любом случае, продолжит заниматься и этим вопросом.
Я не говорил не усложнять диалог, диалог должен быть таким, как вам нужно, я сказал, что не нужно усложнять решение задачи, задачу нужно разбить на более простые подзадачи, например, компоновка кнопок в диалоге, взаимодействие с пользователем и др.


Заполнять массивы вручную в коде макроса (как во втором примере) — не лучший вариант.
Не думаю, что структуры вам помогут.

Напишите макрос, который создаёт кнопки в диалоге в соответствии с массивом имён (без лишних наворотов).

Tigrik

Что-то я сразу "не догнал" - надо было раньше рассказать, хотя бы, коротенько, как я вижу алгоритм работы этого макроса.
На вход могут поступать три параметра: необязательный заголовок диалога, необязательный текст сообщения и обязательный массив надписей на кнопки. Максимальная надпись берется для расчета ширины кнопок (они все одинакового размера и на одном расстоянии друг от друга и от "стенок" диалога). Соответственно для текста сообщения, аналогично - максимальная длина строка задает ширину текста сообщения. Компоновка кнопок уже выбрана и отработана - всё работает. Небольшой вопрос был и, пока, остается (но он не критичен) - размер знакоместа символа текущего шрифта (или установленного). Сейчас, это взято с запасом (про что Вы и говорили, еще до демонстрации макроса) и текст выводится хорошо, при условии одно-строчной надписи на кнопках.
Я же, планирую это никак не ограничивать и будет выводится любой текст, что на кнопках, что в сообщение. Главное, что бы этот текст был шириной не больше установленного размера диалога (применяются отступы (по X и Y) от границы монитора до окна диалога и от границы диалога до текста или кнопок - хочется сделать, что бы выглядело красиво). Для этого и введены коды ошибок, но они, в данном исполнении, для "внутреннего потребления" - для пользователя можно придумать более эстетическое и информативное.
В текущий момент, идёт работа над отдельным блоком (скорее всего, из трех небольших функций), который будет проверять текст (отбросит лишние пробелы по краям строк; если строка длиннее, чем нужно, то часть слов переносится на следующую строку (или вместе с этой строкой (если всё это влезает), или отдельно). Отдельная небольшая функция (всего 6 строк), при необходимости разделяет слово (это может пригодится - если кнопка узкая (в пределах допустимого, конечно), а слово - большое и не вмещается на кнопку. В основной макрос будет возвращаться обновленная (если так получилось) строка и длина максимальной строки (всё это будет в цикле: для сообщения и для кнопок).
Я, уже, тестирую эти функции, но они не обязательные для применения в этой "облегченной" версии - там будет достаточно просчёт длины строк.


---
Когда делал тест для максимального количества кнопок, которые могут разместиться в диалоге (при определенных условиях), подумал что музыкант может себе сделать типа небольшого синтезатора (из макроса, наверное, можно "цеплять" файлы со звуками нот).
Да и много другого интересного сделать можно.

Tigrik

Цитата: rami от 19 июня 2020, 21:24
Напишите макрос, который создаёт кнопки в диалоге в соответствии с массивом имён (без лишних наворотов).
Хорошо, попробую, но надписи кнопок, все равно, придется анализировать (что бы найти параметры кнопок) - это основная часть кода.

eeigor

#22
В старые добрые времена Ken Getz & Paul Litwin в книге Microsoft Access 2000 много чего наворотили... В том числе там и была такая MsgBox с кодом (с возможностью расширения).
Я делаю справки как в отдельной форме (информация лежит на рабочем листе), так и с помощью MsgBox. Просто разбиваю информацию по страницам. Вверху счетчик номера страницы/общее количество страниц, внизу текст "Для продолжения нажмите ОК..." и две кнопки: ОК, Отменить. И на последней странице текст "Конец" и одна кнопка "ОК".


Быстро делал. Как-то так:
MsgHelp()
Dim response As Integer
Dim prompt As String, prompt2 As String

prompt = "<Страница 1/2>" _
& Chr$(10) _
& Chr$(10) & "<Текст 1>"

prompt2 = "<Текст 3 (общий на всех страницах, если это необходимо)>"

prompt = prompt & Chr$(10) & Chr$(10) & prompt2 & Chr$(10) & Chr$(10) & "Для продолжения нажмите ""OK""..."
response = MsgBox(prompt, 64 + 1, "Справка")
If response = 2 Then  'Отменить (1 is OK)
Exit Sub
End If

MsgBox "<Страница 2/2>" _
& Chr$(10) _
& Chr$(10) & "<Текст 2>
& Chr$(10) & prompt2 & Chr$(10) & Chr$(10) & "Конец" _
, 64, "Справка"
End Sub
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Tigrik

Цитата: eeigor от 20 июня 2020, 21:22
В старые добрые времена Ken Getz & Paul Litwin в книге Microsoft Access 2000 много чего наворотили... В том числе там и была такая MsgBox с кодом (с возможностью расширения).
Я делаю справки как в отдельной форме (информация лежит на рабочем листе), так и с помощью MsgBox. Просто разбиваю информацию по страницам. Вверху счетчик номера страницы/общее количество страниц, внизу текст "Для продолжения нажмите ОК..." и две кнопки: ОК, Отменить. И на последней странице текст "Конец" и одна кнопка "ОК".
eeigor, да, если условие не слишком ветвисто и не очень разнородно, то можно обойтись только с помощью функции Msgbox.
Допустим у меня, есть всего три выбора: удалить последнюю страницу, удалить все страницы и ничего не удалять.
На вскидку, можно попробовать как-то так:

Sub Msg3But()
Dim onRezult%
onRezult = Msgbox ("Хотите удалить страницы (последнюю или все)?", 3, "Удаление страниц!")
Select Case onRezult
Case 6
onRezult = Msgbox ("Хотите удалить последнюю страницу?", 4, "Удаление страниц!")
If onRezult = 6 Then
Msgbox ("Удаляем последнюю страницу", "Удаление страниц!")
Else
Msgbox ("Удаляем все страницы", "Удаление страниц!")
EndIf
Case 7 : Msgbox "Ничего не удаляем!", "Сохранение всех страниц"
Case Else : Msgbox "Выходим из программы!", "Выход"
End Select
End Sub

Не всегда четко поставлен вопрос, но понять можно. Ради этого, возможно, и не нужно "городить" отдельный большой макрос с диалогом.
Чуть более сложное "дерево" можно, также, попробовать что-то придумать.

Но если предположить три совершенно разных вопросов: удалить страничку, нарисовать фигуру, перейти в программу N, то только, насколько я вижу, можно только перебором вопросом.
Возможно, уже на втором вопросе, пользователь нажмет Отменить или Крестик.
Конечно, если пользователю ОЧЕНЬ надо "доползти" до нужного места, то он стерпит любой каскад вопросов.

Tigrik

Если Диалог только с кнопками и без анализа надписей на кнопках (только длину строки), тогда макрос выглядеть совсем простенько:

REM  *****  BASIC  *****
Dim oDlg '  Объект Диалог
Const DELTAXY = 12 '  Отступ
Const WCHAR = 5 '  Ширина символа
Const HCHAR = 8 '  Высота символа
'   Структура для координат и размеров для Диалога с кнопками
Type PosSizeDlg
X&
Y&
WX&
HY&
End Type

Sub StartDlgButton()
  Dim aTextButtom(), strDlgTitle$, onRezult%
strDlgTitle = "Окно Диалога с кнопками"
aTextButtom() = Array("ДА", "НЕТ", "Надо подумать!!!")
' aTextButtom() = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", _
' "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34")
onRezult = DlgButtonLight(aTextButtom(), strDlgTitle)
Select Case onRezult '   Можно использовать для кодов ошибок
Case 0 : Msgbox "Выход без кнопки!", 0, "Выход из программы"
Case Else : Msgbox "Нажата кнопка № " & onRezult, 0, "Диалог успешно выполнен"
End Select
End Sub


Sub DlgButtonLight(aTextButton(), Optional strDlgTitle$) As Integer
  Dim oDlgModel, oModel, oListener, DlgRez
  Dim ConvSize As Object '   Для конвертации размеров
  Dim cooDlg As PosSizeDlg '   Координаты и Размеры Окна Диалога
  Dim cooButt As PosSizeDlg '   Координаты и Размеры Кнопки
  Dim aText() '   Массив с надписями на кнопках
  Dim nButt '   Количество Кнопок
  Dim strLen% '   Длина строки в тексте на кнопках
  Dim txtStr$ '   Текст строки на кнопках
  Dim MaxLenStr% '   Максимальная длина строки
  Dim i&, nn&
  Dim oWindow, ATWSize
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
ATWSize = oWindow.ActiveTopWindow.Size '   Размеры Окна Windows в пикселях
oDlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
oDlgModel.setPropertyValue("Title", strDlgTitle)
oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
oDlg.setModel(oDlgModel)
oDlg.createPeer(oWindow, null)

If IsMissing(strDlgTitle) Then strDlgTitle = ""
REM   =========   По максимальной длине строки на кнопке вычисляются ширины кнопок
aText() = Split(Trim(Join(aTextButton(), chr(10))), chr(10))
nn = UBound(aText())
For i = 0 To nn
txtStr = Trim(aText( i ))
aText( i ) = txtStr
strLen = Len(txtStr)
MaxLenStr = IIf(MaxLenStr < strLen, strLen, MaxLenStr) '   Макс. длина строки в строках Сообщения или на Кнопках
Next
REM   =========   Координаты и размеры текста, кнопок, окна диалога
nButt = UBound(aText()) + 1 '   Количество Кнопок
cooButt.WX = MaxLenStr * WCHAR '   Ширина Кнопки
cooButt.HY = 1 * HCHAR + DELTAXY '   Высота Кнопки ( 1 - кол-во строк надписи на кнопке)
cooButt.X = DeltaXY '   Координата X до первой кнопки
cooButt.Y = DeltaXY '   Координата Y до ряда кнопок
REM   =========   Координаты и Размеры Окна Диалога
cooDlg.WX = nButt * (cooButt.WX +  DELTAXY) + DELTAXY '   Ширина Окна Диалога
cooDlg.HY = cooButt.HY + DELTAXY * 2 '   Высота Окна Диалога
ConvSize = oDlg.convertSizeToLogic(ATWSize, 18)
cooDlg.X = (ConvSize.Width - cooDlg.WX) / 2
cooDlg.Y = (ConvSize.Height - cooDlg.HY) / 2
oDlgModel.setPropertyValue("PositionX", Clng(cooDlg.X))
oDlgModel.setPropertyValue("PositionY", Clng(cooDlg.Y))
oDlgModel.setPropertyValue("Width", cooDlg.WX)
oDlgModel.setPropertyValue("Height", cooDlg.HY)
REM   =========   Задать свойства элемента управления (кнопки) в Модель Диалога
oListener = CreateUnoListener("Button_", "com.sun.star.awt.XActionListener")  '  Listener - Обработчик Событий Кнопки
  For i = 1 To nButt
strLen = Clng(cooButt.X  * i + cooButt.WX * ( i - 1 )) '   Координата X до i-ой кнопки
oModel = oDlgModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
oModel.setPropertyValues( Array(_
"PositionX","PositionY","Width",   "Height",   "Label","TabIndex","Tabstop","PushButtonType",    "VerticalAlign","Align"),_
Array(Clng(strLen),cooButt.Y, cooButt.WX, cooButt.HY, aText( i - 1 ),  i,  True, com.sun.star.awt.PushButtonType.STANDARD, 1, 1) )
oDlgModel.insertByName("ComButton" & i, oModel)
oDlg.getControl("ComButton" & i).addActionListener(oListener)
  Next
DlgButtonLight = oDlg.execute()
End Sub


Sub Button_actionPerformed(ActionEvent)
oDlg.endDialog(ActionEvent.Source.Model.TabIndex)
End Sub

Для интереса можно посмотреть максимальное количество кнопок в одном ряду (при данных значениях DELTAXY), когда Диалог весь помещается на экране монитора (на конкретном моём мониторе).

Кнопки, кстати, можно выводить и не в один ряд (не сильно усложнит код), а, при желании, делать не ряд (ряды) кнопок, а колонку (колонки) из кнопок - если это будет нужно.

Не очень сильно увеличится код макроса, если добавить в него возможность (по дополнительному входному параметру) изменять расположение кнопок: по горизонтали или по вертикали (это я имел ввиду, говоря об универсальности макроса).
Или лучше сделать два разных макроса (во многих элементах будут похожи), которые будут выполнят каждый свою задачу?
Rami, что Вы можете сказать по этому поводу.

Спасибо.

rami

Уже намного лучше, но есть ещё что улучшать.

Зачем вам собственная структура, если есть готовая?
Ваша самодельная Dim cooDlg As PosSizeDlg абсолютно то же самое, что и "фирменная" Dim cooDlg As New com.sun.star.awt.Rectangle (только имена двух параметров не совпадают, но это не важно)

В данном случае, вам подобные структуры не нужны вообще, вы сначала "запаковываете" данные в структуру, чтобы немедленно их распаковать и использовать в расчётах, это никому не нужный дигитальный цирк.

sokol92

Для тех случаев, когда мы ожидаем выбор пользователя между несколькими вариантами, есть и другие простые подходы:

Sub TestInputBox
  Dim retval
  retval=InputBox("Укажите номер нужного действия" & chr(10) &  _
                  "1: действие первое" & Chr(10) & _
                  "2: действие второе" & Chr(10) & _
                  "3: действие третье" & Chr(10))
  Msgbox "Ваш ответ: " & retval
End Sub


Преимущество - более низкая вероятность необдуманного ("рефлекторного") ответа.
Владимир.

economist

Писал в 2005 г. систему расчета БЧЗП зарплаты с KPI с 1500 msgbox и 3 кнопками: Да/Нет/Не знаю. За 15 лет - время просмотра каждого сообщения уменьшилось с 20 сек до 5 сек. Если бы знал что к этом сведётся - сделал бы все диалоги в виде листов Calc/Excel c контролами, потому что 80% времени программирования диалогов/ответов было связано с набором текста самих сообщений, с чем прекрасно справились бы сами пользователи.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Tigrik

Цитата: rami от 21 июня 2020, 13:40
Зачем вам собственная структура, если есть готовая?
Ваша самодельная Dim cooDlg As PosSizeDlg абсолютно то же самое, что и "фирменная" Dim cooDlg As New com.sun.star.awt.Rectangle (только имена двух параметров не совпадают, но это не важно)
Как-то, даже совсем недавно, видел её, но подзабыл - может быть пригодится
Цитата: rami от 21 июня 2020, 13:40
В данном случае, вам подобные структуры не нужны вообще, вы сначала "запаковываете" данные в структуру, чтобы немедленно их распаковать и использовать в расчётах, это никому не нужный дигитальный цирк.
В окончательном коде, если какие-то переменные не повторяются, то я, стараюсь (если это не слишком громоздкое вычисление) вставлять эти вычисление сразу по месту.
Здесь, они оставлены для наглядности и возможного дальнейшего усложнения (все-таки, хочу сделать версию и с текстом и обработкой текста сообщений и кнопок).
Если буду думать над двух-вариантным расположением кнопок (горизонтально и вертикально), то, скорее всего, будет удобнее не со структурой, а таким же массивом (X, Y, W, H) - мне, почему-то, думается, что так будет удобнее высчитывать координаты по размерам при смене расположения кнопок. Но это - мысли вслух - пока, буду заниматься простыми вариантами, а там будет видно.

Rami, я извиняюсь, что "перебил", когда Вы хотели продолжить "беседу" про, скажем так, правильность программного кода. Если у Вас будет возможность и желание, то расскажите, пожалуйста, какие ещё встречаются наиболее грубые ошибки или неудачные методы программирования.

Tigrik

Цитата: sokol92 от 21 июня 2020, 14:56
Для тех случаев, когда мы ожидаем выбор пользователя между несколькими вариантами, есть и другие простые подходы:
Sub TestInputBox
  Dim retval
  retval=InputBox("Укажите номер нужного действия" & chr(10) &  _
                  "1: действие первое" & Chr(10) & _
                  "2: действие второе" & Chr(10) & _
                  "3: действие третье" & Chr(10))
  Msgbox "Ваш ответ: " & retval
End Sub

Преимущество - более низкая вероятность необдуманного ("рефлекторного") ответа.

Да, это хороший вариант и может, даже, подойти и для большого количество вариантов.
Но, лично для меня, как для пользователя, намного легче нажать нужную кнопку, чем что-то вводить - пусть даже всего одну цифру. Возможно, именно эта "лень" и подтолкнула меня к этому макросу.
Другим, думаю, наоборот - легче что-то набрать.

===

Цитата: economist от 21 июня 2020, 17:50
Писал в 2005 г. систему расчета БЧЗП зарплаты с KPI с 1500 msgbox и 3 кнопками: Да/Нет/Не знаю. За 15 лет - время просмотра каждого сообщения уменьшилось с 20 сек до 5 сек. Если бы знал что к этом сведётся - сделал бы все диалоги в виде листов Calc/Excel c контролами, потому что 80% времени программирования диалогов/ответов было связано с набором текста самих сообщений, с чем прекрасно справились бы сами пользователи.

Я три варианта (в примере выше) "раскидывал" по Msgbox-ам минут 40, наверное (изначально начал не с того), а у Вас - ПОЛТОРЫ ТЫСЯЧИ - о б а л д е т ь!
Вашей усидчивости можно только позавидовать.
Не зная специфики Ваших расчетов, интересно узнать - такой макрос (кнопки с разными надписями плюс, возможно, текст пояснительный) помог бы в Вашей работе или нет?