BASIC: Как удалить элементы управления с листа? [Решено]

Автор eeigor, 15 марта 2020, 23:05

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

eeigor

Я просто изучаю Calc (попутно).
Знатоки, это, конечно, не большая проблема: сперва хотел удалить кнопки на скопированном листе (там нужны только данные, а лист-источник содержит элементы управления на листе)... но не вышло.
Пришлось скрыть. В режиме разработки они отображаются. Вопрос чисто учебный.

Кто подскажет: почему не удаляются кнопки? Связь с макросом, однако, обрывается (вне зависимости от включенного режима).

<Фрагмент кода>

   Dim e
   ' Скрываем элементы управления на скопированном листе (который новый).
REM   Xray oNewSheet.DrawPage.Forms(0)

   With oNewSheet.DrawPage.Forms(0)
'      Call SwitchControlDesignMode(True)  'включает режим разработки
'      For Each e In .ElementNames()
'         .getByName(e).EnableVisible = False  'gets button by name & hides it
'         .removeByName(e)  'увы, удаляет только связь с макросом, а кнопка остаётся (SwitchControlDesignMode?)
'      Next
'      Call SwitchControlDesignMode(False)

      For Each e In .ControlModels()
         e.EnableVisible = False  'hides button
      Next
   End With



Sub SwitchControlDesignMode(Optional vState)
   Dim document   as object
   Dim dispatcher as object

   document   = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

   Dim args1(0) as new com.sun.star.beans.PropertyValue
   args1(0).Name = "SwitchControlDesignMode"
   args1(0).Value = IIf(IsMissing(vState), Not args1(0).Value, CBool(vState))

   dispatcher.executeDispatch(document, ".uno:SwitchControlDesignMode", "", 0, args1())
End Sub
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Rafik

У меня на 5 версии LO кнопки удаляет такой цикл.
' Удаляем кнопки из нового документа
For jj = 0 To oSheet.DrawPage.Count - 1 ' получаем кол-во кнопок   
   oSheet.DrawPage(jj).Control.dispose ' Удаляем кнопку
Next

eeigor

#2
Какая-то путанная закольцованная модель...
Rafik, ваш метод <control.dispose> объекта Shape что-то таки делает: кнопки становятся невидимыми, но их по-прежнему можно (не с первой попытки) выделить, затем открыть окно свойств... Однако странный выбор термина для удаления (обычно: remove, delete, drop)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

#4
Вроде, удаляет. Тему считаем прикрытой... на время.
Цитата: Bigor от 16 марта 2020, 16:48Вот здесь, было что-то про удаление кнопок
Спасибо. Подглядел у mikekaganski.
<Фрагмент>

   Dim i%, oShape
REM   Xray oSheet.DrawPage

   For i = oSheet.DrawPage.Count - 1 To 0 Step -1
      oShape = oSheet.DrawPage.getByIndex(i)
      If oShape.supportsService("com.sun.star.drawing.ControlShape") Then
REM         oShape.Control.dispose()
         oSheet.DrawPage.remove(oShape)
      End if
   Next


' Проверим свойство DrawPage.Count - как и было до удаления. Однако, если сохранить, закрыть и заново открыть файл, то счетчик обновляется (0).

Sub TestDrawPage()
   Xray ThisComponent.CurrentController.ActiveSheet.DrawPage
End Sub

Во всяком случае, есть какая-то логика теперь: удаляет именно кнопки, не трогая чего-то ещё (стрелки и пр.), с более-менее понятным синтаксисом.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community