Обработка группы элементов диалога

Автор siti, 21 апреля 2022, 08:27

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

siti

Подскажите как можно массово опросить или изменить значения однотипных элементов диалога. Например есть 12 элементов с именами CheckBox1...CheckBox12.
Можно ли разом изменить или опросить их статус в цикле или еще как то?

eeigor

#1
Да. Вы можете в цикле по всем элементам управления проверить тип элемента управления (oControl.ClassId). Или задать им метку (текст) в свойстве  "Дополнительная информация" – прямо в окне диалога – и при обходе проверить значение свойства oControl.Model.Tag. Можно анализировать и имя, но оно, как правило, должно быть осмысленным.

При этом надо помнить, что checkbox принимает не логические значения, а: 0, 1 и 2. Присвоить ему True (-1) не получится.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Диалогам посвящена глава 18 Книги А.Питоньяка OOME_4_0.odt.
Для обхода элементов управления можно использовать следующую схему (см. также комментарии к макросу):
Sub TestControls
  Dim oDoc, oDlgDesc, oDialog, oControl, s As String
  oDoc=GlobalScope      ' диалог в библиотеке приложения (My Macros)
  ' oDoc=ThisComponent  ' диалог встроен в документ
  oDlgDesc=oDoc.DialogLibraries.GetByName("Standard").GetByName("Dialog1")
  oDialog=CreateUnoDialog(oDlgDesc)
 
  For Each oControl In oDialog.Controls
    ' mri oControl   ' можно исследовать элемент управления с помощью Mri
    s=s & Chr(10) & oControl.Model.Name
  Next oControl
 
  Msgbox s,,"Dialog controls"
End Sub
Владимир.

siti

Цитата: eeigor от 21 апреля 2022, 08:41При этом надо помнить, что checkbox принимает не логические значения, а: 0, 1 и 2. Присвоить ему True (-1) не получится.
А почему тогда работает следующее
   If Dlg.getControl("ChB11").State = false Then

sokol92

Атрибут State имеет тип Short (соответствует Integer в Basic).

Msgbox CInt(False)

выдает 0.
Владимир.