Страница: 1 | 2 | 3 |
Вопрос: Выозов нескольких копий формы
Добавлено: 26.07.08 13:15
Автор вопроса: Jasmin
Ответы
Всего ответов: 42
Номер ответа: 31
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #31
Добавлено: 30.07.08 14:43
С какой радости твоей вариант быстрее? Ты создаешь массив.. читаешь из него, пишешь туда и вообще работаешь с ним. У меня же никакого массива нету, прикинь, от скольких операций я избавляюсь в отличии от твоего варианта! По памяти ты тоже в минусе, ты хранишь массив на 5 элементов и в нем 5 ссылок на формы, у меня же одна переменная на 4 байта.
Ты не прав.. Ни о каком Hide речь не идет, в отношении формы - это зло (имхо)! VBA не открывал уже много лет но почти уверен, что там не составит труда отловить создание формы / закрытие. Даже создание, как таковое, и не нужно.. За "Создание" можно считать ту процедуру где вызывается New UserForm1 и менно там увеличивать счетчик. Вопрос только за закрытием формы, но это уже детали реализации..
Номер ответа: 32
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #32
Добавлено: 30.07.08 14:50
Обоснуй!
P.S. Brand, дружище.. ты беспокоишь меня.. вернее состояние твоего здоровья. На глаза ты что то ослаб в последнее время.. То в теме о VBA кричишь про дотнет, то называешь археологом в свежей теме.. Друг, что с тобой!!???
Номер ответа: 33
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #33
Добавлено: 30.07.08 15:05
EROS, работа с массивом быстрее, чем создание формы в памяти. А у меня они уже созданы на всё время работы user'а. Но это, вообще-то, была шутка.
Создание формы — это эквивалент создания экземпляра класса. Насколько я понимаю VBA, экземпляр класса существует до тех пор, пока есть на него ссылки (VBA это отслеживает). После этого происходит событие Terminate. В случае с экземпляром формы, полагаю, экземпляр существует не только пока есть ссылки на него. Вопрос в этих условиях. В форме есть событие Terminate — значит есть способ форму удалить из памяти. Вопрос только лишь в том, когда это происходит: когда её скрывают и нет больше ссылок, когда нажимают на "крестик" и нет больше ссылок (а может наличие ссылок в этом случае и не важно!) или есть ещё какие-то варианты.
Во вяком случае методов Close и Delete в форме нет. И им подобных — тоже.
Номер ответа: 34
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #34
Добавлено: 30.07.08 20:36
Уважаемый ADSemenov.ru открою вам великую тайну (по секрету) и рекомендую изредка заглядывать в мануалы!
Есть метод Unload, который в качестве параметра принимает ссылку на экземпляр формы. Поэтому если вы вызовете Unload Me или Unload frmMyUserForm, то эта команда приведет к закрытию указанной формы(равносильно по клику на крестик в углу формы), удалению ссылки и освобождению занимаемых ей ресурсов, что в свою очередь вызовет срабатывание события Terminate (о чем я и говорил ранее).
Это заявление по меньшей мере абсурдно по нескольким причинам:
Во первых, вы забываете о том, что ваш массив - это массив ссылок на созданные экземпляры формы, а значит чтобы заполнить этот массив вам так же надо создавать эти экземпляры формы в памяти + ссылки на них помещать в массив.
Во вторых, Рассмотрим следующую ситуацию: Поработал юзер с формами и больше они ему не понадобятся в течении часа. В моем случае ресурсы занимаемые формой освобождаются а в вашем варианте вы продолжаете хранить экземпляр формы с введенными данными(а их может быть очень много) в памяти на всем протяжении работы пользователя. Это, как минимум, является расточительством ресурсов что само по себе некорректно.
В третьих. Соверешнно ни к чему хранить в памяти ненужные экземпляры формы в то время когда ничто не мешает вам создать новые экземпляры и использовать их по назначению. И поверьте мне на слово - создание экземпляра формы никоем образом не замедлит выполнение программы и вы абсолютно ничего(ни в скорости ни в ресурсах) не выиграете если будете использовать в этой ситуации массив ссылок на заранее созданные экземпляры формы. Это не такая уж и ресурсоемкая операция.
Номер ответа: 35
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #35
Добавлено: 30.07.08 20:48
ADSemenov.ru, если вы все еще считаете что вы правы и желаете продолжить дискуссию на эту тему, то могу предложить реализовать эту задачу каждый своим способом и выложить на суд общественности.
Условия:
1. Лист с кнопкой создания формы (не более 5 штук)
2. Форма с одной кнопкой по нажатию на которую будут выполняться произвольные действия
вот, собственно, и все условия.
Желаете посмотреть что из этого получится?
Номер ответа: 36
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #36
Добавлено: 30.07.08 21:02
Только археологи залазят в VBA
Да ну, ты что, на медицинском учился?
Не беспокойся, в остальном я нормальный
Номер ответа: 37
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #37
Добавлено: 30.07.08 21:26
Нифига ты не понимаешь, я тут ностальгировал ))))) С VBA у меня все и начиналось лет 10 назад.. ))))
Номер ответа: 38
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #38
Добавлено: 30.07.08 21:27
Да я тоже собственно.
А почему остальные ответы не прокомментировал?
Номер ответа: 39
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #39
Добавлено: 30.07.08 22:36
Да. Есть глобальный метод Unload, который выгружает объект (необязательно форму). Это я проморгал. Искал в методах формы.
EROS, я не спорю ради спора. Токмо ради информации. Какая разница, что быстрее: создать пять раз объект и 95 раз на него сослаться или 100 раз просто создать тот же объект? При 3ГГц. Я же сказал, что это была шутка. Если бы вместо клавы был подключён робот, который щёлкал бы эти формы по 1000 шт/сек (или быстрее), тогда бы спор ещё имел смысл.
Остался ещё один теоретический вопрос. Если ссылка в проге осталась на форму, но user закрыл форму крестиком — существует форма в памяти? Или ссылка станет Nothing? Или ссылка станет "битая"?
Тот же вопрос, если форма сама себя выгрузит методом Unload Me.
А за напоминание спасибо. Можно было и просто одной строчкой.
Номер ответа: 40
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #40
Добавлено: 31.07.08 01:18
Насколько я помню, физически форма будет выгружена когда вызываешь Unload
По теме - речь идет о разных ресурсах - в случае массива это будет занимаемая память, в случае с созданием формы - ресурсы процессора.
На сегодняшний день по моему мнение большая нагрузка идет именно на память, поэтому о ней я бы заботился в первую очередь.
Номер ответа: 41
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #41
Добавлено: 31.07.08 07:50
Тот же вопрос, если форма сама себя выгрузит методом Unload Me.
(имхо) Не проверял, но смею предположить что по аналогии с другими языками нажатие на крестик в данном случае равносильно вызову Unload. Т.е. форма физически перестанет существовать (ресурсы разумеется тоже освободятся) и ссылка на нее будет недействительной.. В любом случае при попытке использовать эту ссылки ты по идее должен будешь получить исключение.
Номер ответа: 42
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #42
Добавлено: 31.07.08 11:47
Конечно, надо бы проверить.— Есть ещё вероятность, что ссылка станет Nothing и исключение можно избежать. У меня сложилось убеждение, что VBA (VB) отслеживает все ссылки на объект (экземпляр класса), работая с этим объектом и ничего не мешает ему "отNothing'ачить" все ссылки на выгружаемый через объект.