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

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

4 Март 2021, 18:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: закраска ячейки при клике  (Прочитано 8760 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ska
Участник
**
Offline Offline

Пол: Мужской
Сообщений: 7


« Стартовое сообщение: 28 Июнь 2012, 16:44 »

Нужно чтобы при клике на определенную ячейку эта ячейка получала определенный фон. Я начинающий, поэтому пока не доходит. Нашел нужный код, добавил в него закрашивание активной ячйки цветом. Проблема только в том, что в данном случае при клике на любой ячейки она получает зеленый фон, а мне нужно на определенной (например C5). Подскажите, какое условие добавить к этому коду.
Код:
Global oDocView As Object
Global oMouseClickHandler As Object

Sub RegisterMouseClickHandler
  oDocView = ThisComponent.currentController
  oMouseClickHandler = _
  createUnoListener("MyApp_", "com.sun.star.awt.XMouseClickHandler")

'  writedbginfo oMouseClickHandler
 
  oDocView.addMouseClickHandler(oMouseClickHandler)

End Sub


Function MyApp_mousePressed(oEvt) As Boolean
  MyApp_mousePressed = False
End Function

Function MyApp_mouseReleased(oEvt) As Boolean

if oEvt.ClickCount = 1  then
  'get the active cell!
  oActiveCell = ThisComponent.CurrentSelection
  oActiveCell.CellBackColor = RGB(0,255, 0)
end if

  MyApp_mouseReleased = False
End Function
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 28 Июнь 2012, 18:08 »

Привет и добро пожаловать на форум!
А где этот код взял?
Посмотри вот эту тему, там эти раскраски-заливки очень подробно обсуждались.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
ska
Участник
**
Offline Offline

Пол: Мужской
Сообщений: 7


« Ответ #2: 29 Июнь 2012, 00:06 »

спасибо, буду разбирать)
Записан
ska
Участник
**
Offline Offline

Пол: Мужской
Сообщений: 7


« Ответ #3: 29 Июнь 2012, 07:36 »

Воспользовался твоим кодом (сходил по ссылке). Немного изменил под свои нужды. Почти получилось. Единственное не пойму, почему переменная lColor, в которой я планировал сохранять код цвета, постоянно передает черный цвет. Нужно, кликая на колонку слева и справа, выбирать пары, закрашиваемые в один и тот же цвет. Почему правая колонка постоянно в черном? )
Код:
REM  *****  BASIC  *****
Option Explicit ' Все переменные объявляются явно через "Dim".
Option Base 0 ' Индексация каждого массива начинается с нуля

REM Глобальные переменные
Public oMouseClickHandler

REM Начать слушать события от мышки
Sub RegisterMouseClickHandler
   oMouseClickHandler =  createUnoListener("MouseOnClick_", "com.sun.star.awt.XMouseClickHandler")
   ThisComponent.getCurrentController().addMouseClickHandler(oMouseClickHandler)
End Sub

REM Остановить слушание
Sub UnregisterMouseClickHandler
On Error Resume Next
ThisComponent.getCurrentController().removeMouseClickHandler(oMouseClickHandler)
On Error GOTO 0
End Sub

REM Хоть эта процедура ничего не делает, но реализацию метода предоставить обязаны
Sub MouseOnClick_disposing(oEvt)
End Sub

REM Кнопка нажата
Function MouseOnClick_mousePressed(oEvt) As Boolean
REM Можно обрабатывать событие в этот момент
REM Но лучше (так считается) в момент отпускания кнопки
MouseOnClick_mousePressed = False
End Function

REM Кнопка отпущена
Function MouseOnClick_mouseReleased(oEvt) As Boolean
Dim lColor as Long ' Код цвета
Dim oConv
Dim strAddress as String' Адрес ячейки в строковом виде
Dim oCell As Object ' Ячейка, которая стала выделенной
Dim oSheet As Object ' Лист, на котором это произошло
Dim nColumn%, nRow% ' Номер колонки и строки, в которых находится текущая ячейка
Dim tmp ' Временная переменная на все случаи
REM В нашей задаче источник события мало чем может помочь - слишком много пересчетов
REM пришлось бы выполнить, чтобы вычислить текущую ячейку
REM Поэтому просто будем ориентироваться на ячейку, которая стала текущей (выделенной)
REM В результате щелчка

Rem Сервис преобразует адрес ячейки в удобочитаемую форму
oConv = ThisComponent.createInstance("com.sun.star.table.CellAddressConversion")

oCell = ThisComponent.getCurrentSelection()
If oCell.getImplementationName() <> "ScCellObj" Then Exit Function ' Это не ячейка - диапазон или объект
oConv.Address = oCell.getCellAddress()

strAddress=oConv.UserInterfaceRepresentation

REM В какой ячейки кликнули мышкой?
Select Case strAddress

Case "B6": ' Ячейка B6 - меняем цвет фона на красный
oCell.CellBackColor = RGB(255,0,0)
lColor=RGB(255,0,0) ' запоминаем цвет
Case "B7": ' на желтый
oCell.CellBackColor = RGB(255,255,0)
lColor=RGB(255,255,0)
Case "B8": ' на зеленый
oCell.CellBackColor = RGB(0,255,0)
lColor=RGB(0,255,0)
Case "B9": ' на голубой
oCell.CellBackColor = RGB(0,255,255)
lColor=RGB(0,255,255)
Case "B10":
oCell.CellBackColor = RGB(0,0,255)
lColor=RGB(0,0,255)
Case "B11":
oCell.CellBackColor = RGB(255,0,255)
lColor=RGB(255,0,255)
End Select

REM Проверяем другой диапазон
Select Case strAddress

Case "D6","D7","D8","D9","D10","D11": ' Меняем цвет фона на такой же, как в левой колонке
oCell.CellBackColor = lColor
End Select

MouseOnClick_mouseReleased = False    ' Разрешить офису другие обработки этого события
End Function


[вложение удалено Администратором]
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #4: 29 Июнь 2012, 12:33 »

Потому что lColor при каждом входе в функцию  MouseOnClick_mouseReleased "забывает" какой цвет мы ей присвоили в прошлый раз и получает умолчальное значение 0, отсутствие цвета, черный.
Поэтому я в том примере и сохранял это значение в именованном диапазоне

[вложение удалено Администратором]
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
ska
Участник
**
Offline Offline

Пол: Мужской
Сообщений: 7


« Ответ #5: 29 Июнь 2012, 14:26 »

Что тут сказать. Респект и уважуха). Можно полюбопытствовать, ты чем занимаешься в профессиональном плане? Откуда такие познания в макросах? Приятно удивляют такие люди:-). Что делать простым юзерам, чтобы приблизиться к такому уровню?) . Спасибо.
p.s и еще просьба высказаться насчет, верна ли моя идея использовать подобный метод для такого типа теста с помощью макроса в calc или может есть что-то оптимальнее?
« Последнее редактирование: 29 Июнь 2012, 14:28 от ska » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #6: 29 Июнь 2012, 20:44 »

Что тут сказать. Респект и уважуха).
Ну, дык! И ты не лаптем щи хлебаешь: вона какую штуку задумал и сваял  Всё хорошо
Можно полюбопытствовать, ты чем занимаешься в профессиональном плане? Откуда такие познания в макросах?
Будешь, наверное, смеяться - программист я, обычный кодер... Просто с большим опытом.
Что делать простым юзерам, чтобы приблизиться к такому уровню?
Питоньяк, Питоньяк и еще раз Питоньяк... Сначала читать трудновато. Но потом перестаешь читать все подряд и начинаешь дергать нужные главы по оглавлению - очень помогает решать текущие задачи. А чем их больше - тем больше читаешь...
p.s и еще просьба высказаться насчет, верна ли моя идея использовать подобный метод для такого типа теста с помощью макроса в calc или может есть что-то оптимальнее?
Может быть и есть... Ты ведь про постановку задачи ничего не сказал. Одно время, помнится, 1С что-то такое в Экселе делала, с ограничением по времени обдумывания... Приятно было открыть этот тест в Calc и неторопливо просмотреть все вопросы. Макросы-то в Calc не работали...
А в твоем случае - даже не знаю. На какой уровень "экзаменуемых" это рассчитано? Не хакнут ли они эту таблицу в три клика?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
ska
Участник
**
Offline Offline

Пол: Мужской
Сообщений: 7


« Ответ #7: 30 Июнь 2012, 14:00 »

Цитата:
Будешь, наверное, смеяться - программист я, обычный кодер... Просто с большим опытом.
Нее не буду. У тебя лихо получается...). Только уважение.
Цитата:
На какой уровень "экзаменуемых" это рассчитано? Не хакнут ли они эту таблицу в три клика?
На школьнегов). Если они хакнут, я буду только рад. Но боюсь,что не хватит у них... А вообще чтобы затруднить тестируемым "подсмотреть" ответ есть в коде такое.
После нажатия на кнопку Результат выставляется оценка и далее следующее

Код:
ThisComponent.Save() ' сохраняем просто
oneSheet.Protect("суперпароль") ' не даем изменять результат на листе с заданиями
ThisComponent.close(true) закрываем документ, чтобы не было искушения вернуться к предыдущему действию
с помощью ctrl+z
Плюс пароль на библиотеку само собой.
Хотя никто не мешает распаковать документ и пошарить там. Но на это нужно время конечно. Вряд ли в течение урока кто-то там чего-то накопает. 100% гарантии вряд ли можно обеспечить в таком случае с документами с открытым кодом да и с закрытым тоже.

« Последнее редактирование: 30 Июнь 2012, 14:23 от ska » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 30 Июнь 2012, 14:24 »

Ну, закрыть код - не такая уж и проблема... Можно вообще поступить иезуитски: реальный код скрыт, запаролен и замаскирован, а для "особо продвинутых" виден не рабочий, очень запутанный код, который вообще ничего не делает...
Чтобы "заныкать" код, достаточно вынести его в отдельную библиотеку (чтобы имя было не Standard) и тогда появится возможность закрыть модули этой библиотеки паролем.
Для особо умных, которые умеют отключать выполнение макросов, тоже есть несколько забавных "фишек"...

О тестах.
Оценка вычисляется как процент от правильных ответов? Можешь показать типовой набор "вопросы-ответы"? Схема какая? Пять вопросов - пять ответов и найти соответствия? Или вопрос и три-четыре варианта ответов, из которых один совсем правильный, один-два частично правильных и один неправильный? Или вопрос и набор из ответов, в которых нужно отметить все подходящие под правильный ответ?
Тесты ведь бывают разные...
Опять же, если уже отметил ответ цветом, в моем варианте есть возможность отменить (вернуть белый цвет)... Нужно ли такое? Или "тронул-ходи" (с) шахматное правило.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
ska
Участник
**
Offline Offline

Пол: Мужской
Сообщений: 7


« Ответ #9: 30 Июнь 2012, 14:45 »

Код:
Чтобы "заныкать" код, достаточно вынести его в отдельную библиотеку (чтобы имя было не Standard) и тогда появится возможность закрыть модули этой библиотеки паролем.
Да, но в таком случае все равно остается возможность распаковать архив и "спалить" пароль на библиотеку/модуль. Если открыть в текстовом редакторе модуль, то пароль там находится после слова Protect  Подмигивающий
Чтобы не привязываться к уже имеющимся тестовым системам (по разным причинам) решил сделать свой тест на основе Calc, макросов. Пошарил в инете. Взял за пример вариант, когда результаты публикуются на отдельном листе (в моем случае лист2), этот лист скрывается, добавил макросы и поехало... С  тестовым заданием выбора варианта ответа проблем не возникло. Потом вот решил добавить задание на соответствие. Может, с точки зрения профи выглядит коряво (по части создания функций и прочего я пока в процессе изучения) но тем не менее вроде оно работает и выглядит так. Тест для школьника 6 класса по учебнику Биболетовой раздел 6. Пароль на все - 1975

[вложение удалено Администратором]
« Последнее редактирование: 30 Июнь 2012, 14:52 от ska » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #10: 30 Июнь 2012, 14:59 »

Упс... А что за "старинном замке?" в B26? И почему не "малллллллленького" в B28? И F26/F28 я бы очистил до начала теста...
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
ska
Участник
**
Offline Offline

Пол: Мужской
Сообщений: 7


« Ответ #11: 30 Июнь 2012, 15:44 »

Упс... А что за "старинном замке?" в B26? И почему не "малллллллленького" в B28? И F26/F28 я бы очистил до начала теста...
первый раз загружал файл с ответами... Стер теперь. А с B26  и B28 вроде все нормально. (?)
P.S. Каюсь. Двоечник. Да. ошибочка синтаксическая? Поправлю).


[вложение удалено Администратором]
« Последнее редактирование: 30 Июнь 2012, 15:50 от ska » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #12: 30 Июнь 2012, 23:02 »

Ну, как по мне, такое решение тоже имеет право на существование.
Хотя я бы, наверное, постарался бы замутить чего-нибудь пострашнее: несколько вариантов вопросов, которые выбираются случайным образом при открытии книги-шаблона, отдельная форма для каждого вопроса с кнопками "назад-далее" и прочее... И, соответственно, поискал бы альтернативный инструментарий... Но и так неплохо получилось. Скрыть лишние строки-столбцы и можно тестировать.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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