Список форумов Форум Libreoffice

Форум Libreoffice

Добро пожаловать на Форум Libreoffice!
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

English French German Italian Portuguese Russian Spanish
Подсвечивание строки с активной ячейкой

 
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Basic
Предыдущая тема :: Следующая тема  
Автор Сообщение
raptor



Репутация: 0    

Зарегистрирован: 02.08.2011
Сообщения: 9

СообщениеДобавлено: Ср Сен 07, 2011 1:38 pm    Заголовок сообщения: Подсвечивание строки с активной ячейкой Ответить с цитатой

Подсвечивать строку с активной ячейком можно с помощью XSelectionChangeListener, описанным у Питоньяка (AndrewMacro.odt).
Макрос, реализующий эту возможность:
Код:
Global oListener As Object
Global oDocView As Object
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Выполните этот макрос для начала перехвата событий !!!
Sub Example_SelectionChangeListener
  Dim sName$
  oDocView = ThisComponent.getCurrentController
   ' создайте перехватчик для перехвата события "изменение выделения"
   sName = "com.sun.star.view.XSelectionChangeListener"
  oListener = CreateUnoListener( "MyApp_", sName )
   
  ' зарегистрировать этот перехватчик в контроллере документа
  oDocView.addSelectionChangeListener(oListener)
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Выполните этот макрос для прекращения перехвата событий
Sub Remove_Listener
  ' удаляет перехватчик
  oDocView.removeSelectionChangeListener(oListener)
End Sub

' Все  перехватчики должны поддерживать это событие
Sub MyApp_disposing(oEvent)
  msgbox "Вывод перехватчика (disposing the listener)"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MyApp_selectionChanged(oEvent)
Dim oCurrentSelection As Object
Dim oCell, oCell0
Dim aStr0
Dim oSheet

oCell=oEvent.source

aStr0=oCell.Selection.AbsoluteName

oSheet=ThisComponent.Sheets.getByName("Лист1")

oCell0=oSheet.getCellByposition(0,0)
oCell0.setString(an)

''''''''''''''''''''''''''''''''''''''''''''''''
'Тут решил воспользоваться способом одного из сообщений в этой теме для выделения номера строки из абсолютного адреса ячейки

spl = Trim("@#$%^&*")
aStr0 = Replace(aStr0, "$", "$" & spl)
aStr0 = Replace(aStr0, ":", "!" & spl)
aStr1 = Split(aStr0, spl)
l = LBound(aStr1)
u = UBound(aStr1)
''''''''''''''''''''''''''''''''''''''''''''''''
d1=1
ncol=Str(0)
nrow=Str(Val(aStr1(3))-d1)

d2=100
nrowmin=Str(0)
nrowmax=Str(Val(aStr1(3))+d2)


'oSheet.getCellRangeByPosition(ncol, nrowmin, ncol+15, nrowmax).CellBackColor = -1

oSheet.getCellRangeByName("$A1:$P100").CellBackColor = -1

If Val(aStr1(3))<101 Then
oSheet.getCellRangeByPosition(ncol, nrow, ncol+15, nrow).CellBackColor = RGB(255,220,100)
End If

End Sub


Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mathnew



Репутация: 0    

Зарегистрирован: 20.08.2011
Сообщения: 24

СообщениеДобавлено: Чт Сен 08, 2011 6:05 am    Заголовок сообщения: Ответить с цитатой

Все это хорошо. Но как быть, если в этой области есть окрашенные ячейки. Этот макрос сотрет всю предыдущую окраску.
Так что, по-хорошему, надо сначала запомнить окраску ячеек строки до выделения ячейки, а после ухода со строки восстановить ее предыдущую окраску.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
raptor



Репутация: 0    

Зарегистрирован: 02.08.2011
Сообщения: 9

СообщениеДобавлено: Чт Сен 08, 2011 7:10 am    Заголовок сообщения: Ответить с цитатой

Немного подправил макрос.
Теперь стирается цвет только в ранее выделенной строке, а не во всей области,как раньше.
Код:
Global oListener As Object
Global oDocView As Object
Global nrow
Global ncol

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Выполните этот макрос для начала перехвата событий !!!
Sub Example_SelectionChangeListener
  Dim sName$
  oDocView = ThisComponent.getCurrentController
   ' создайте перехватчик для перехвата события "изменение выделения"
   sName = "com.sun.star.view.XSelectionChangeListener"
  oListener = CreateUnoListener( "MyApp_", sName )
   
  ' зарегистрировать этот перехватчик в контроллере документа
  oDocView.addSelectionChangeListener(oListener)
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Выполните этот макрос для прекращения перехвата событий
Sub Remove_Listener
  ' удаляет перехватчик
  oDocView.removeSelectionChangeListener(oListener)
End Sub

' Все  перехватчики должны поддерживать это событие
Sub MyApp_disposing(oEvent)
  msgbox "Вывод перехватчика (disposing the listener)"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MyApp_selectionChanged(oEvent)
Dim oCurrentSelection As Object
Dim oCell, oCell0
Dim aStr0
Dim oSheet

oCell=oEvent.source

aStr0=oCell.Selection.AbsoluteName

oSheet=ThisComponent.Sheets.getByName("Лист1")

oSheet.getCellRangeByPosition(ncol, nrow, ncol+15, nrow).CellBackColor = -1


oCell0=oSheet.getCellByposition(0,0)
oCell0.setString(an)

''''''''''''''''''''''''''''''''''''''''''''''''
'Тут решил воспользоваться способом одного из сообщений в этой теме для выделения номера строки из абсолютного адреса ячейки

spl = Trim("@#$%^&*")
aStr0 = Replace(aStr0, "$", "$" & spl)
aStr0 = Replace(aStr0, ":", "!" & spl)
aStr1 = Split(aStr0, spl)
l = LBound(aStr1)
u = UBound(aStr1)
''''''''''''''''''''''''''''''''''''''''''''''''
d1=1
ncol=Str(0)
nrow=Str(Val(aStr1(3))-d1)

d2=100
nrowmin=Str(0)
nrowmax=Str(Val(aStr1(3))+d2)

If Val(aStr1(3))<101 Then
oSheet.getCellRangeByPosition(ncol, nrow, ncol+15, nrow).CellBackColor = RGB(255,220,100)
End If

End Sub


Про сохранение, восстановление цвета надо думать.

Если ячейки были просто окрашены, то можно сохранить цвет ячеек строки в массив, а потом восстановить из массива.

А вот если окрашивались с помощью условного форматирования, с использованием стилей (как здесь http://libreoffice.3nx.ru/viewtopic.php?t=2), то пока не знаю.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Чт Сен 08, 2011 7:17 am    Заголовок сообщения: Ответить с цитатой

Тогда другой вариант - менять не цвет фона, а обрамление... Например, нижнюю границу всех ячеек активной строки отчеркивать жирной синей линией... Хотя... В этом случае возникает проблема с ячейками объединёнными по вертикали.
Можно было бы фиксировать содержимое по ячейке ниже и правее текущей (передвигать фиксацию при смене активной ячейки). Но, похоже, так будет еще хуже.
Совсем уж бредовый вариант: где-то в настройках макроса задавать количество "столбцов левее" и "строк выше" активной ячейки. И сразу после активации очередной ячейки сдвигать видимую область так, чтобы ячейка занимала всегда одно и то же фиксированное положение относительно верхнего левого угла. После этого можно вращать таблицу влево-вправо или вверх-вниз (но не туда и сюда одновременно) и знать, что "вот где-то здесь" у нас выделена ячейка... Но это действительно совсем уж плохая идея: при каждом очередном выделении ячейки весь экран будет дергаться, передвигая страницу. С такой работой глаза через 10 минут вылезут...
Да, похоже, проще смириться и как и раньше ориентироваться на подсвеченные номер строки и букву столбца
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
covar



Репутация: 0    

Зарегистрирован: 04.09.2011
Сообщения: 7

СообщениеДобавлено: Чт Сен 08, 2011 7:37 am    Заголовок сообщения: Ответить с цитатой

Вообще-то подсвечивание строки очень полезная вещь.
Такую штуку я сделал для бухгалтерии лет 5 назад на Excel.
Девочки, которые вводили огромное число данных, говорили, что работать стало в 1000 раз легче. Не так устают глаза, а то через 4-5 часов такой работы (ввода данных) совсем хреново со вниманием и ошибки идут валом.

Правда, у нас не ячейки были окрашены, а цвет шрифта был разным.
И, честно, говоря, я считаю, что лучше (при условном форматировании, например) менять цвет шрифта, а не цвет фон ячейки.

От разнообразно раскрашенных ячеек через некоторое время начинает рябить в глазах, и очень раздражает при интенсивной работе.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Чт Сен 08, 2011 8:02 am    Заголовок сообщения: Ответить с цитатой

А-а-а... Ну, если это для интенсивного ввода данных, то я так не играю... Я думал, это для конструирования навороченных формул, где нужно ссылаться на кучу ячеек в текущей строке и хочется кликать по ним мышью, чтобы адреса правильные получать... А для ввода данных это, безусловно, каторга. Лучше чем форма ввода всё-равно ничего не придумано. А если форма еще и хорошо продумана и автоматизирована, то ей вообще цены нет. Оператору, конечно удобнее вбивать массу данных в одну строку, слов нет.
Но если экранная форма ввода максимально точно повторяет бумажную форму, с которой берутся данные, да еще и часть вписанных в форму данных машина вычисляет по уже введенным полям и заполняет сама... Но это же надо форму конструировать, макрос писать...
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
covar



Репутация: 0    

Зарегистрирован: 04.09.2011
Сообщения: 7

СообщениеДобавлено: Чт Сен 08, 2011 8:18 am    Заголовок сообщения: Ответить с цитатой

Вообще-то, иногда надо спускаться с небес (конструирования навороченных формул) на землю ( ближе к девушкам-операторам).
Уверяю, это не настолько уж плохо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Чт Сен 08, 2011 11:08 am    Заголовок сообщения: Ответить с цитатой

Ну, вот конкретный пример. Типовое заявление на, скажем, страхование КАСКО... Закон и пачка прилагающихся к нему инструкций, циркулярных писем и разъяснений требуют регистрации 16 обязательных параметров страхователя и договора... И это еще не считая параметров самой страхуемой железяки: модель, возраст, цвет и т.д., и т.п. Вся эта информация сначала от руки вписывается в бланк-пустографку, а потом девочки-операторы вбивают все эти буковки-цифирки с клавиатуры.

Возьмем только четыре параметра страхователя: дата рождения, пол, возраст, ИНН. Это у нас будет дата (6-8 цифр, в зависимости от маски ввода, а то и все 10 вместе с разделителями), пол (в лучшем случае флажок, в худшем - написать руками "муж" или "жен"), возраст две цифры, ИНН - 10 цифр. Спускаемся к девочкам, смотрим как бедняжки мучаются, поднимаемся обратно к навороченным формулам - щелк-щелк - возвращаемся обратно с решением: три из четырех полей вводить не нужно. Просто дату рождения и пол можно получить из ИНН, а возраст вычислить... Как мне кажется, при вводе в форму это сделать проще, чем при вводе по строке таблицы
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
covar



Репутация: 0    

Зарегистрирован: 04.09.2011
Сообщения: 7

СообщениеДобавлено: Чт Сен 08, 2011 12:08 pm    Заголовок сообщения: Ответить с цитатой

Я всегда делал так. Сначала "щелк-щелк", потом спускался к оператору, садился на его место и начинал делать его работу (вводить данные на сотрудников, например, кол-во отработанных часов в рабочее время, сверхурочно, в выходные и праздники, и т.д и т.п.
После данных, введенных на 50-60 сотрудников, начинаешь очень хорошо понимать, как должен выглядеть такой ввод данных.

PS. Но мы отклонились сильно от темы данного топика. Это надо обсуждать в другом месте - о дружественности интерфейса программы к пользователю.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Вс Окт 02, 2011 4:34 pm    Заголовок сообщения: Ответить с цитатой

Немного доработал макрос. Для строки и столбца с активной ячейкой дописывает (вставляет первым) простой условный формат, сдвигая уже имеющиеся форматы ниже, а когда нужда в подсвечивании отпадает - сдвигает форматы назад, вверх.

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

Текущая версия макроса находится здесь
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Пн Окт 03, 2011 7:21 am    Заголовок сообщения: Ответить с цитатой

Мощно, конечно.
Но уж очень медленно работает.
На клавиатуру не успевает реагировать (Up, Down).

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Пн Окт 03, 2011 8:15 am    Заголовок сообщения: Ответить с цитатой

Да.. И за прокруткой экрана вправо-влево не поспевает (отрисовывает не всё)... Главное, чего пока что удалось добиться - только указание направления на область, где осталась активная ячейка, если она "уползла" далеко за край видимой области.
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
mathnew



Репутация: 0    

Зарегистрирован: 20.08.2011
Сообщения: 24

СообщениеДобавлено: Вт Окт 04, 2011 9:54 am    Заголовок сообщения: Ответить с цитатой

Если ячейки окрашивались с помощью условного форматирования с использованием функций листа, так как было сделано тут http://libreoffice.3nx.ru/viewtopic.php?t=2, то можно попробовать запоминать и перезаписывать формулы в ячейках.
Макрос от raptor в этом случае будет выглядеть так
Код:
Global oListener As Object
Global oDocView As Object
Global nrow
Global nold
Global ncolmin
Global ncolmax
Global NN
Global myArrCell(1023)
Global myFormulaCell(1023)

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Выполните этот макрос для начала перехвата событий !!!
Sub AddListener
  Dim sName$
  oDocView = ThisComponent.getCurrentController
   ' создайте перехватчик для перехвата события "изменение выделения"
   sName = "com.sun.star.view.XSelectionChangeListener"
  oListener = CreateUnoListener( "MyApp_", sName )
   
  ' зарегистрировать этот перехватчик в контроллере документа
  oDocView.addSelectionChangeListener(oListener)
  NN=0
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Выполните этот макрос для прекращения перехвата событий
Sub Remove_Listener
  ' удаляет перехватчик
  oDocView.removeSelectionChangeListener(oListener)
End Sub

' Все  перехватчики должны поддерживать это событие
Sub MyApp_disposing(oEvent)
  msgbox "Вывод перехватчика (disposing the listener)"
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub MyApp_selectionChanged(oEvent)
oCell=oEvent.source

oDoc=ThisComponent
oSheet = oDoc.CurrentController.getActiveSheet()
oSelect = oDoc.CurrentSelection.getRangeAddress

oSelectAC = oSelect.StartColumn

oSelectAR = oSelect.StartRow   'используем только это, т.к. выделяем только одну ячейку
                        'остальные можно использовать для проверки на выбор не одной ячейки
oSelectZC = oSelect.EndColumn
oSelectZR = oSelect.EndRow

'''========================================================================
If NN=1 Then
   If oSelectAR<100 Then
      oSheet.getCellRangeByPosition(ncolmin, nold, ncolmax, nold).CellBackColor = -1
      For i=ncolmin To ncolmax
         myArrCell(i) = oSheet.getCellByPosition(i,nold)
         If myArrCell(i).Type=3 Then
            myArrCell(i).Formula=myFormulaCell(i)
            myFormulaCell(i)=""
         End If
      Next i
   End If
End If
'''========================================================================

ncolmin=0
ncolmax=10
nrow=oSelectAR

nold=nrow 'Запомним номер строки в другую переменную (для наглядности)

'''========================================================================
If oSelectAR<100 Then
   For i=ncolmin To ncolmax
      myArrCell(i) = oSheet.getCellByPosition(i,nrow)
      If myArrCell(i).Type=3 Then
         myFormulaCell(i)=myArrCell(i).Formula
      End If
   Next i
oSheet.getCellRangeByPosition(ncolmin, nrow, ncolmax, nrow).CellBackColor = RGB(255,220,100)
End If
'''========================================================================

NN=1
End Sub


Изменен только Sub MyApp_selectionChanged(oEvent).
(И упрощен выбор номера строки - для определения номера строки не нужно таких сложностей.)

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JohnSUN



Репутация: 0    

Зарегистрирован: 29.08.2011
Сообщения: 39
Откуда: Киев, Украина

СообщениеДобавлено: Вт Окт 04, 2011 3:00 pm    Заголовок сообщения: Ответить с цитатой

mathnew писал(а):
И упрощен выбор номера строки - для определения номера строки не нужно таких сложностей.

Такой способ выбора - еще слишком простой. В случае множественного выделения (когда с зажатым Ctrl закрашивается несколько областей) getCurrentSelection возвращает несколько диапазонов, а у них нет getRangeAddress, у них getRangeAddresses.

Похоже, никто не знает, как правильно определять адрес активной ячейки. Той единственной на листе, которая обведена черной рамкой...

И в Remove_Listener, наверное, тоже стоило очистку фона вставить.
_________________
Владислав Орлов aka JohnSUN
LibreOffice 3.4.0 OOO340m1 (Build:12) WinXP SP2
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Admin



Репутация: 0    

Зарегистрирован: 02.08.2011
Сообщения: 24

СообщениеДобавлено: Чт Окт 06, 2011 9:50 am    Заголовок сообщения: Ответить с цитатой

Вопрос "Как определить адрес активной ячейки при выделении нескольких диапазонов ячеек" выделен в отдельную тему:
Адрес активной ячейки при выделении нескольких диапазонов


Последний раз редактировалось: Admin (Чт Окт 06, 2011 10:58 am), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Basic Часовой пояс: GMT
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Вы можете бесплатно создать форум на MyBB2.ru, RSS