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

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

21 Сентябрь 2017, 11:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 4 »   Вниз
  Печать  
Автор Тема: Глобальная переменная  (Прочитано 3360 раз)
0 Пользователей и 1 Гость смотрят эту тему.
rami
Гуру
*******
Offline Offline

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


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #30: 23 Ноябрь 2016, 16:38 »

Но моя вина в том, что не смог понятно объяснить
Тогда давайте документ-образец с описанием что делать и что должно получиться.
Записан

Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #31: 23 Ноябрь 2016, 16:52 »

Тогда давайте документ-образец с описанием что делать и что должно получиться.
Пока такого документа нет. Есть куча макросов. Вы мне очень-очень сильно помогаете и пока это успешно. Уже близится момент, когда я это все объединю в один нужный документ. Могу потом его предоставить, когда уже буду не отдельно макросы тестировать, а его(документ) собирать Улыбка
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #32: 23 Ноябрь 2016, 17:08 »

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

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

Сообщений: 114


« Ответ #33: 23 Ноябрь 2016, 23:18 »

исключив выполняемый пункт? Ну, чтобы повторно его просто нельзя было выбрать?
Да нет, не все так просто) выбранный пункт списка можно выбирать сколько угодно раз. Вот примерный список:
(Общий)
Пользователь1
Пользователь2
Пользователь3
Пользователь4
Пользователь5
Так вот если выбрать какого либо пользователя, то некоторые ячейки нужно перекрасить и сделать доступными для редактирования. При выборе Общий соответственно запретить редактирование и перекрасить их. Поэтому когда в списке переходим от пользователя к пользователю - не нужно их каждый раз красить и делать редактируемыми. Это нужно делать только от перехода из общего к пользователю и наоборот. Понимаю, что можно и по другому это сделать, но не думаю, что мой вариант совсем плох. Завтра на работе выложу тестовые макросы.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #34: 24 Ноябрь 2016, 08:49 »

когда в списке переходим от пользователя к пользователю - не нужно их каждый раз красить и делать редактируемыми. Это нужно делать только от перехода из общего к пользователю и наоборот. Понимаю, что можно и по другому это сделать...
А! Так вот где собака-то порылась! За несколько дней мы добрались-таки до сути задачи!

Мой тебе дружеский совет - не парься! Сделай так, как понимаешь - то есть по другому. При каждой смене значения в списке
Код:
blockAllCells ' Режим "Общий"
if list.Text <> "(Общий)" Then unblockCells(list.Text)
Ну, в смысле, после каждого выбора "нужно их каждый раз красить и делать редактируемыми", причем дважды. Уверяю тебя, при нынешних скоростях машин эта операция, даже повторенная многократно, будет совершенно незаметна - чик и всё. А ты сможешь сэкономить кучу сил и времени на другие проблемы, а не на поиск способа продублировать значение в памяти.
Записан

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

Сообщений: 114


« Ответ #35: 24 Ноябрь 2016, 09:05 »

даже повторенная многократно, будет совершенно незаметна - чик и всё. А ты сможешь сэкономить кучу сил и времени
Ну во первых, это не моя фишка "сделать абы как лишь бы работало" Улыбка
во вторых - спортивный интерес Подмигивающий

Я человек не настырный, к мнениям других прислушиваюсь, но в данном случае ничего суперсложного я не нагородил.
if list.Text <> "(Общий)" Then unblockCells(list.Text)
Это мне одно из первых что пришло в голову. Но в таком случае можно вообще тогда ничего в этом плане не делать. Т.е. никаких проверок не проводить а просто красить-блокировать-перекрашивать-разблокировать.... Ведь в данном случае в твоем примере либо следующая строка должна быть BlockCells(List.Text) либо она должна быть в части else.
Сейчас попробую собрать тестовый файл...
Вот:

* TestList.ods (11.51 Кб - загружено 8 раз.)
« Последнее редактирование: 24 Ноябрь 2016, 09:51 от Alex16 » Записан
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 580


« Ответ #36: 24 Ноябрь 2016, 12:07 »

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

EDIT: Но это, похоже, нереализуемо при существующем наборе событий.
« Последнее редактирование: 24 Ноябрь 2016, 12:55 от mikekaganski » Записан

С уважением,
Михаил Каганский
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #37: 24 Ноябрь 2016, 13:43 »

Мне кажется, что для изящества (чтобы избавиться от глобальных переменных)
В данном конкретном случае, как уже выше на это обратили внимание, можно воспользоваться свойством Tag. Единственный недостаток данного варианта - свойство строковое.
А вот с событиями "до" изменения и "после" - было бы действительно, проще.
Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #38: 24 Ноябрь 2016, 16:44 »

Уверяю тебя, при нынешних скоростях машин эта операция, даже повторенная многократно, будет совершенно незаметна - чик и всё.
Вот этот код
   
Код:
const StartColRow = 13
const EndColRow = 187
const StrColumns = "E,F,H,I,K,L,N,O,Q,R"
const Pass = "12345"

Sub ColoredRep(CommonRep as Boolean)
Dim StrColumnsArr(), N%, Range as String, CellProtection, shtReport
StrColumnsArr = Split(StrColumns, ",")
        shtReport = ThisComponent.Sheets(0)
if shtReport.isProtected() Then shtReport.unprotect(Pass)
For N = LBound(StrColumnsArr) to UBound(StrColumnsArr)
 Range = StrColumnsArr(N) & StartColRow + 1 & ":" & StrColumnsArr(N) & EndColRow + 1
 
 CellProtection = shtReport.getCellRangeByName(Range).CellProtection
 if CommonRep then
   'print "Color Common Rep"
shtReport.getCellRangeByName(Range).CellBackColor = 14540253
CellProtection.IsLocked = True
 else
   'print "Color User"
   shtReport.getCellRangeByName(Range).CellBackColor = 15202046
   CellProtection.IsLocked = False
 endif
 shtReport.getCellRangeByName(Range).CellProtection = CellProtection
 
Next N
shtReport.protect(Pass)
End Sub
Очень медленно выполняется. Вроде бы ничего серьезного, на мой, не профессиональный взгляд. И всеж, откуда могут быть тормоза?
Кстати в другом тестовом файле, где немного больше информации это(тормоза) более заметнее

* TestList.ods (19.72 Кб - загружено 5 раз.)
« Последнее редактирование: 24 Ноябрь 2016, 16:53 от Alex16 » Записан
mikekaganski
Ветеран
*****
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 580


« Ответ #39: 24 Ноябрь 2016, 17:17 »

https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=42396
Записан

С уважением,
Михаил Каганский
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #40: 24 Ноябрь 2016, 17:26 »

Спасибо. Что-то я даже не подумал об этом.... хотя как-то давненько в MS Excel что-то подобное делал...
Я воспользовался вот этим:
Код:
myDoc = ThisComponent
myDoc.lockControllers()
myDoc.addActionLock()
' --- modify your cells here ---
myDoc.removeActionLock()
myDoc.unlockControllers()
т.е. так
Код:
Sub ColoredRep(CommonRep as Boolean)
Dim StrColumnsArr(), N%, Range as String, CellProtection, shtReport
StrColumnsArr = Split(StrColumns, ",")
myDoc = ThisComponent        
shtReport = ThisComponent.Sheets(0)
myDoc.lockControllers()
myDoc.addActionLock()
if shtReport.isProtected() Then shtReport.unprotect(Pass)
For N = LBound(StrColumnsArr) to UBound(StrColumnsArr)
 Range = StrColumnsArr(N) & StartColRow + 1 & ":" & StrColumnsArr(N) & EndColRow + 1
 
 CellProtection = shtReport.getCellRangeByName(Range).CellProtection
 if CommonRep then
   'print "Color Common Rep"
shtReport.getCellRangeByName(Range).CellBackColor = 14540253
CellProtection.IsLocked = True
 else
   'print "Color User"
   shtReport.getCellRangeByName(Range).CellBackColor = 15202046
   CellProtection.IsLocked = False
 endif
 shtReport.getCellRangeByName(Range).CellProtection = CellProtection
 
Next N
shtReport.protect(Pass)
myDoc.removeActionLock()
myDoc.unlockControllers()
End Sub
Быстрее в разы, но все равно есть пауза... в другом, тестовом файле, хотя код один в один.
« Последнее редактирование: 24 Ноябрь 2016, 19:47 от Alex16 » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #41: 24 Ноябрь 2016, 20:08 »

Быстрее в разы, но все равно есть пауза... в другом, тестовом файле, хотя код один в один.
Покажь-ка тот "другой, тестовый файл"
Записан

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

Сообщений: 114


« Ответ #42: 24 Ноябрь 2016, 20:30 »

Быстрее в разы, но все равно есть пауза... в другом, тестовом файле, хотя код один в один.
Покажь-ка тот "другой, тестовый файл"
Вот файл. Заметил, если убрать вообще всю текстовую информацию из таблицы, то ColoredRep быстро работает.
А с текстом, вот как есть сейчас, но даже еще не заполненный данными, да еще и без загрузки данных т.е. LoadRep еще только практически заглушка - имеется пауза(~500мск) при переходе от общего к пользователю и наоборот.

* DailyRep.ods (51.93 Кб - загружено 9 раз.)
« Последнее редактирование: 25 Ноябрь 2016, 10:57 от Alex16 » Записан
Alex16
Постоялец
***
Offline Offline

Сообщений: 114


« Ответ #43: 25 Ноябрь 2016, 11:03 »

Может тогда на момент долгой работы макроса, как-то блокировать (например ListBox.Enabled = False <ColoredRep> ListBox.Enabled = True) И выводить окошко <Идет загрузка данных...>?
Если это так, то каким способом это лучше сделать, не усугубив ситуацию?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #44: 25 Ноябрь 2016, 12:01 »

Гм... Давай сделаем так - я посмотрю эту книгу, а ты пока глянешь, как я поизмывался над TestList

* TestList традиционный.ods (19.68 Кб - загружено 5 раз.)
Записан

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

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