ska
Участник

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

Offline
Пол: 
Сообщений: 7
|
спасибо, буду разбирать)
|
|
|
Записан
|
|
|
|
ska
Участник

Offline
Пол: 
Сообщений: 7
|
Воспользовался твоим кодом (сходил по ссылке). Немного изменил под свои нужды. Почти получилось. Единственное не пойму, почему переменная 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, отсутствие цвета, черный. Поэтому я в том примере и сохранял это значение в именованном диапазоне
[вложение удалено Администратором]
|
|
|
Записан
|
|
|
|
ska
Участник

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

Offline
Пол: 
Сообщений: 7
|
Будешь, наверное, смеяться - программист я, обычный кодер... Просто с большим опытом.
Нее не буду. У тебя лихо получается...). Только уважение. На какой уровень "экзаменуемых" это рассчитано? Не хакнут ли они эту таблицу в три клика?
На школьнегов). Если они хакнут, я буду только рад. Но боюсь,что не хватит у них... А вообще чтобы затруднить тестируемым "подсмотреть" ответ есть в коде такое. После нажатия на кнопку Результат выставляется оценка и далее следующее ThisComponent.Save() ' сохраняем просто oneSheet.Protect("суперпароль") ' не даем изменять результат на листе с заданиями ThisComponent.close(true) закрываем документ, чтобы не было искушения вернуться к предыдущему действию с помощью ctrl+z
Плюс пароль на библиотеку само собой. Хотя никто не мешает распаковать документ и пошарить там. Но на это нужно время конечно. Вряд ли в течение урока кто-то там чего-то накопает. 100% гарантии вряд ли можно обеспечить в таком случае с документами с открытым кодом да и с закрытым тоже.
|
|
« Последнее редактирование: 30 Июнь 2012, 14:23 от ska »
|
Записан
|
|
|
|
JohnSUN
|
Ну, закрыть код - не такая уж и проблема... Можно вообще поступить иезуитски: реальный код скрыт, запаролен и замаскирован, а для "особо продвинутых" виден не рабочий, очень запутанный код, который вообще ничего не делает... Чтобы "заныкать" код, достаточно вынести его в отдельную библиотеку (чтобы имя было не Standard) и тогда появится возможность закрыть модули этой библиотеки паролем. Для особо умных, которые умеют отключать выполнение макросов, тоже есть несколько забавных "фишек"...
О тестах. Оценка вычисляется как процент от правильных ответов? Можешь показать типовой набор "вопросы-ответы"? Схема какая? Пять вопросов - пять ответов и найти соответствия? Или вопрос и три-четыре варианта ответов, из которых один совсем правильный, один-два частично правильных и один неправильный? Или вопрос и набор из ответов, в которых нужно отметить все подходящие под правильный ответ? Тесты ведь бывают разные... Опять же, если уже отметил ответ цветом, в моем варианте есть возможность отменить (вернуть белый цвет)... Нужно ли такое? Или "тронул-ходи" (с) шахматное правило.
|
|
|
Записан
|
|
|
|
ska
Участник

Offline
Пол: 
Сообщений: 7
|
Чтобы "заныкать" код, достаточно вынести его в отдельную библиотеку (чтобы имя было не Standard) и тогда появится возможность закрыть модули этой библиотеки паролем.
Да, но в таком случае все равно остается возможность распаковать архив и "спалить" пароль на библиотеку/модуль. Если открыть в текстовом редакторе модуль, то пароль там находится после слова Protect  Чтобы не привязываться к уже имеющимся тестовым системам (по разным причинам) решил сделать свой тест на основе Calc, макросов. Пошарил в инете. Взял за пример вариант, когда результаты публикуются на отдельном листе (в моем случае лист2), этот лист скрывается, добавил макросы и поехало... С тестовым заданием выбора варианта ответа проблем не возникло. Потом вот решил добавить задание на соответствие. Может, с точки зрения профи выглядит коряво (по части создания функций и прочего я пока в процессе изучения) но тем не менее вроде оно работает и выглядит так. Тест для школьника 6 класса по учебнику Биболетовой раздел 6. Пароль на все - 1975 [вложение удалено Администратором]
|
|
« Последнее редактирование: 30 Июнь 2012, 14:52 от ska »
|
Записан
|
|
|
|
JohnSUN
|
Упс... А что за "старинном замке?" в B26? И почему не "малллллллленького" в B28? И F26/F28 я бы очистил до начала теста...
|
|
|
Записан
|
|
|
|
ska
Участник

Offline
Пол: 
Сообщений: 7
|
Упс... А что за "старинном замке?" в B26? И почему не "малллллллленького" в B28? И F26/F28 я бы очистил до начала теста...
первый раз загружал файл с ответами... Стер теперь. А с B26 и B28 вроде все нормально. (?) P.S. Каюсь. Двоечник. Да. ошибочка синтаксическая? Поправлю). [вложение удалено Администратором]
|
|
« Последнее редактирование: 30 Июнь 2012, 15:50 от ska »
|
Записан
|
|
|
|
JohnSUN
|
Ну, как по мне, такое решение тоже имеет право на существование. Хотя я бы, наверное, постарался бы замутить чего-нибудь пострашнее: несколько вариантов вопросов, которые выбираются случайным образом при открытии книги-шаблона, отдельная форма для каждого вопроса с кнопками "назад-далее" и прочее... И, соответственно, поискал бы альтернативный инструментарий... Но и так неплохо получилось. Скрыть лишние строки-столбцы и можно тестировать.
|
|
|
Записан
|
|
|
|
|