Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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 и менно там увеличивать счетчик. Вопрос только за закрытием формы, но это уже детали реализации..

В методах самой формы нет метода Delete
Значит должно быть что то типа Close, это не принципиально.. Главное перед тем, как закрыть форму - уменьшить значение переменной-счетчика.

Ответить

Номер ответа: 32
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #32 Добавлено: 30.07.08 14:50
EROS - археолог :)

Обоснуй!

P.S. Brand, дружище.. ты беспокоишь меня.. вернее состояние твоего здоровья. На глаза ты что то ослаб в последнее время.. То в теме о VBA кричишь про дотнет, то называешь археологом в свежей теме.. Друг, что с тобой!!???

Ответить

Номер ответа: 33
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #33
Добавлено: 30.07.08 15:05
    EROS, работа с массивом быстрее, чем создание формы в памяти. А у меня они уже созданы на всё время работы user'а. Но это, вообще-то, была шутка. :)
    Создание формы — это эквивалент создания экземпляра класса. Насколько я понимаю VBA, экземпляр класса существует до тех пор, пока есть на него ссылки (VBA это отслеживает). После этого происходит событие Terminate. В случае с экземпляром формы, полагаю, экземпляр существует не только пока есть ссылки на него. Вопрос в этих условиях. В форме есть событие Terminate — значит есть способ форму удалить из памяти. Вопрос только лишь в том, когда это происходит: когда её скрывают и нет больше ссылок, когда нажимают на "крестик" и нет больше ссылок (а может наличие ссылок в этом случае и не важно!) или есть ещё какие-то варианты.
    Во вяком случае методов Close и Delete в форме нет. И им подобных — тоже.

Ответить

Номер ответа: 34
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #34 Добавлено: 30.07.08 20:36
Во вяком случае методов Close и Delete в форме нет. И им подобных — тоже.
Ну что за люди... Таки заставили открыть VBA.. (((

Уважаемый ADSemenov.ru открою вам великую тайну (по секрету) и рекомендую изредка заглядывать в мануалы!
Есть метод Unload, который в качестве параметра принимает ссылку на экземпляр формы. Поэтому если вы вызовете Unload Me или Unload frmMyUserForm, то эта команда приведет к закрытию указанной формы(равносильно по клику на крестик в углу формы), удалению ссылки и освобождению занимаемых ей ресурсов, что в свою очередь вызовет срабатывание события Terminate (о чем я и говорил ранее).
работа с массивом быстрее, чем создание формы в памяти. А у меня они уже созданы на всё время работы user'а.

Это заявление по меньшей мере абсурдно по нескольким причинам:
Во первых, вы забываете о том, что ваш массив - это массив ссылок на созданные экземпляры формы, а значит чтобы заполнить этот массив вам так же надо создавать эти экземпляры формы в памяти + ссылки на них помещать в массив.
Во вторых, Рассмотрим следующую ситуацию: Поработал юзер с формами и больше они ему не понадобятся в течении часа. В моем случае ресурсы занимаемые формой освобождаются а в вашем варианте вы продолжаете хранить экземпляр формы с введенными данными(а их может быть очень много) в памяти на всем протяжении работы пользователя. Это, как минимум, является расточительством ресурсов что само по себе некорректно.
В третьих. Соверешнно ни к чему хранить в памяти ненужные экземпляры формы в то время когда ничто не мешает вам создать новые экземпляры и использовать их по назначению. И поверьте мне на слово - создание экземпляра формы никоем образом не замедлит выполнение программы и вы абсолютно ничего(ни в скорости ни в ресурсах) не выиграете если будете использовать в этой ситуации массив ссылок на заранее созданные экземпляры формы. Это не такая уж и ресурсоемкая операция.

Ответить

Номер ответа: 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 :)

P.S. Brand, дружище.. ты беспокоишь меня.. вернее состояние твоего здоровья.

Да ну, ты что, на медицинском учился? :)

На глаза ты что то ослаб в последнее время.. То в теме о VBA кричишь про дотнет, то называешь археологом в свежей теме.. Друг, что с тобой!!???

Не беспокойся, в остальном я нормальный :)

Ответить

Номер ответа: 37
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #37 Добавлено: 30.07.08 21:26
Только археологи залазят в VBA :)

Нифига ты не понимаешь, я тут ностальгировал :-)))))) С VBA у меня все и начиналось лет 10 назад.. ))))

Ответить

Номер ответа: 38
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #38 Добавлено: 30.07.08 21:27
Да я тоже собственно.

А почему остальные ответы не прокомментировал?

Ответить

Номер ответа: 39
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #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
Остался ещё один теоретический вопрос. Если ссылка в проге осталась на форму, но user закрыл форму крестиком — существует форма в памяти? Или ссылка станет Nothing? Или ссылка станет "битая"?
    Тот же вопрос, если форма сама себя выгрузит методом Unload Me.

(имхо) Не проверял, но смею предположить что по аналогии с другими языками нажатие на крестик в данном случае равносильно вызову Unload. Т.е. форма физически перестанет существовать (ресурсы разумеется тоже освободятся) и ссылка на нее будет недействительной.. В любом случае при попытке использовать эту ссылки ты по идее должен будешь получить исключение.

Ответить

Номер ответа: 42
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #42
Добавлено: 31.07.08 11:47
    Конечно, надо бы проверить.— Есть ещё вероятность, что ссылка станет Nothing и исключение можно избежать. У меня сложилось убеждение, что VBA (VB) отслеживает все ссылки на объект (экземпляр класса), работая с этим объектом и ничего не мешает ему "отNothing'ачить" все ссылки на выгружаемый через объект.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам