Страницы: 1
RSS
Перезапись Dictionary при инициации формы
 
Добрый день, знатоки.

Прошу взглянуть на код и объяснить по какой причине у меня не происходит очистка и перезапись словаря dictTable, значения которое в последствии используются  в качестве значений cbTable, и как исправить ситуацию.  
 
Есть такой косяк у словарей. Вместо RemoveAll используйте пересоздание словаря:
Код
Set dictTabac = New Dictionary
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Благодарю за совет.
Решил ситуацию по другому, сработало, но почему сработало не понимаю. :)

Добавил Unload Me в блок
Код
Private Sub NewOrder_Clic()

...

Unload Me

End Sub
Изменено: АналитикБУ - 07.11.2019 12:39:22
 
Цитата
АналитикБУ написал:
почему сработало не понимаю
В первом варианте у Вас в конце работы с формой вызывался метод формы Hide.
При следующем показе формы событие Initialize не возникало и, соответственно, метод RemoveAll для словаря dictTable не вызывался.

Оператор Unload выгружает форму из памяти. При следующем показе формы событие Initialize будет возникать.

Вариант с Hide / Show быстрее и сохраняет Ваши изменения в форме между вызовами. Если необходимо при показе формы (.Show) произвести какие-то начальные действия, то это можно выполнить путем обработки события Activate.
Изменено: sokol92 - 07.11.2019 18:41:42
Владимир
 
sokol92, Благодарю за разъяснения
 
sokol92, приветствую! А насчёт замечания
Цитата
Дмитрий (The_Prist) Щербаков: Есть такой косяк у словарей. Вместо RemoveAll используйте пересоздание словаря
есть комментарии? Потому что у меня ни разу таких проблем не было (но у Дмитрия и опыта, конечно, в разы больше, чем у меня)…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Здравствуйте, Алексей!

Мы аналогично в случае, когда объект d является словарем и нужно удалить из него всё, c незапамятных времен пишем:
Код
Set d = Nothing
Set d = CreateObject("Scripting.Dictionary")
и не пользуемся методом RemoveAll.


Возможно, в настоящее время это не более, чем суеверие. :)  
Владимир
 
sokol92, ну а я, в свою очередь, скажу, что юзаю раннее связывание + RemoveAll и ни разу не подводило)))
Если бы ТС прикрепил код, в котором "не срабатывает", то был бы разговор, а так это тоже самое, что колёса менять, когда с коробкой проблемы  :D
Изменено: Jack Famous - 08.11.2019 15:40:51
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
А автора темы проблема в #1 была не с результатом действия метода RemoveAll, а с тем, что этот метод не вызывался, начиная со второго показа пользовательской формы (поскольку находился в обработчике события  Initialize).
Владимир
 
sokol92, я попросил вас прокомментировать, потому что, из #2 кажется, что виноват именно метод. Спасибо!  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
я сталкивался с тем, что при повторных запусках процедуры с Diсtionary, на старте, при проверке 1-го значения Count=0, а Exists("чего-то там") = True, и как следствие выполнение кода не по той ветке, что ожидалось( понятно, проверка не "чего-то там" а реального первого ключа из данных, который каким-то образом оставался там жить после RemoveAll.
обьяснений не нашел((( сталкивался не часто, но это случалось, на разных проектах, в разном коде и это не отвернуло меня от использования Dictionaty))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, вы использовали раннее или позднее связывание?
Если у меня будет выявлено что-то подобное, то создам тему с примером -пока, как я понял, примеров нет…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
У меня такое было с поздним связыванием(т.к. редко использую ранее во избежание недоразумений с MISSING). С ранним в тот момент попробовать мысли не возникло, поэтому ничего более сказать не могу. Но и RemoveAll перестал использовать, т.к. и без этого на тот момент не мог понять где косячу и битый час потратил на поиск ошибки в логике кода, а оказалось ошибка в методе RemovaAll :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, т.к. у меня код либо в личной надстройке, либо внутри файла для какой-либо задачи, то я стабильно могу обеспечивать раннее связывание. Словари использую повсеместно и очень плотно. Часто словарь является публичной переменной, передаваемой в процедуры и функции. Переде началом работы комплексного макроса, все публичные переменные очищаются, в том числе и словари - методом RemoveAll. Повторюсь, проблем обнаружено не было. Получается, что, скорее всего, дело именно в типе связывания  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх