закраска ячейки при клике

Автор ska, 28 июня 2012, 17:44

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

ska

Нужно чтобы при клике на определенную ячейку эта ячейка получала определенный фон. Я начинающий, поэтому пока не доходит. Нашел нужный код, добавил в него закрашивание активной ячйки цветом. Проблема только в том, что в данном случае при клике на любой ячейки она получает зеленый фон, а мне нужно на определенной (например 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

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

ska

спасибо, буду разбирать)

ska

Воспользовался твоим кодом (сходил по ссылке). Немного изменил под свои нужды. Почти получилось. Единственное не пойму, почему переменная 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

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

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ska

#5
Что тут сказать. Респект и уважуха). Можно полюбопытствовать, ты чем занимаешься в профессиональном плане? Откуда такие познания в макросах? Приятно удивляют такие люди:-). Что делать простым юзерам, чтобы приблизиться к такому уровню?) . Спасибо.
p.s и еще просьба высказаться насчет, верна ли моя идея использовать подобный метод для такого типа теста с помощью макроса в calc или может есть что-то оптимальнее?

JohnSUN

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

ska

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


ThisComponent.Save() ' сохраняем просто
oneSheet.Protect("суперпароль") ' не даем изменять результат на листе с заданиями
ThisComponent.close(true) закрываем документ, чтобы не было искушения вернуться к предыдущему действию
с помощью ctrl+z

Плюс пароль на библиотеку само собой.
Хотя никто не мешает распаковать документ и пошарить там. Но на это нужно время конечно. Вряд ли в течение урока кто-то там чего-то накопает. 100% гарантии вряд ли можно обеспечить в таком случае с документами с открытым кодом да и с закрытым тоже.


JohnSUN

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

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

ska

#9

Чтобы "заныкать" код, достаточно вынести его в отдельную библиотеку (чтобы имя было не Standard) и тогда появится возможность закрыть модули этой библиотеки паролем.

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

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

JohnSUN

Упс... А что за "старинном замке?" в B26? И почему не "малллллллленького" в B28? И F26/F28 я бы очистил до начала теста...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ska

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


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

JohnSUN

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