Глобальная переменная

Автор Alex16, 22 ноября 2016, 15:32

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

rami

Цитата: Alex16 от 23 ноября 2016, 14:32Но моя вина в том, что не смог понятно объяснить
Тогда давайте документ-образец с описанием что делать и что должно получиться.

Alex16

Цитата: rami от 23 ноября 2016, 14:38Тогда давайте документ-образец с описанием что делать и что должно получиться.
Пока такого документа нет. Есть куча макросов. Вы мне очень-очень сильно помогаете и пока это успешно. Уже близится момент, когда я это все объединю в один нужный документ. Могу потом его предоставить, когда уже буду не отдельно макросы тестировать, а его(документ) собирать :)

JohnSUN

Цитата: Alex16 от 23 ноября 2016, 16:30
Эту переменную проверяю в момент выбора в списке. После выбора в списке, мне нужен индекс предыдущего выбора. Нужно это, что бы не выполнять повторно некоторые действия, для определенных пунктов. Т.е. один раз выполняем и далее если выбор в списке в этих определенных пунктах, то не выполняем код пока не будет выбран "другой пункт" у которого тоже нужно выполнить похожий код один раз. Ну как-то так)
"Переведи..." (с) Карцев
А ты не думал о таком варианте: после начала выполнения макроса переписать для комбобокса список выбора, исключив выполняемый пункт? Ну, чтобы повторно его просто нельзя было выбрать?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex16

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

JohnSUN

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

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

Alex16

#35
Цитата: JohnSUN от 24 ноября 2016, 06:49даже повторенная многократно, будет совершенно незаметна - чик и всё. А ты сможешь сэкономить кучу сил и времени
Ну во первых, это не моя фишка "сделать абы как лишь бы работало" :)
во вторых - спортивный интерес ;)

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

mikekaganski

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

EDIT: Но это, похоже, нереализуемо при существующем наборе событий.
С уважением,
Михаил Каганский

Alex16

Цитата: mikekaganski от 24 ноября 2016, 10:07Мне кажется, что для изящества (чтобы избавиться от глобальных переменных)
В данном конкретном случае, как уже выше на это обратили внимание, можно воспользоваться свойством Tag. Единственный недостаток данного варианта - свойство строковое.
А вот с событиями "до" изменения и "после" - было бы действительно, проще.

Alex16

#38
Цитата: JohnSUN от 24 ноября 2016, 06:49Уверяю тебя, при нынешних скоростях машин эта операция, даже повторенная многократно, будет совершенно незаметна - чик и всё.
Вот этот код
   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

Очень медленно выполняется. Вроде бы ничего серьезного, на мой, не профессиональный взгляд. И всеж, откуда могут быть тормоза?
Кстати в другом тестовом файле, где немного больше информации это(тормоза) более заметнее

mikekaganski

С уважением,
Михаил Каганский

Alex16

#40
Цитата: mikekaganski от 24 ноября 2016, 17:17
https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=42396
Спасибо. Что-то я даже не подумал об этом.... хотя как-то давненько в 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

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

JohnSUN

Цитата: Alex16 от 24 ноября 2016, 17:26
Быстрее в разы, но все равно есть пауза... в другом, тестовом файле, хотя код один в один.
Покажь-ка тот "другой, тестовый файл"
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex16

#42
Цитата: JohnSUN от 24 ноября 2016, 20:08
Цитата: Alex16 от 24 ноября 2016, 17:26
Быстрее в разы, но все равно есть пауза... в другом, тестовом файле, хотя код один в один.
Покажь-ка тот "другой, тестовый файл"
Вот файл. Заметил, если убрать вообще всю текстовую информацию из таблицы, то ColoredRep быстро работает.
А с текстом, вот как есть сейчас, но даже еще не заполненный данными, да еще и без загрузки данных т.е. LoadRep еще только практически заглушка - имеется пауза(~500мск) при переходе от общего к пользователю и наоборот.

Alex16

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

JohnSUN

Гм... Давай сделаем так - я посмотрю эту книгу, а ты пока глянешь, как я поизмывался над TestList
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне