|
|
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
Вопросы по загрузке и выгрузке форм (VB6, SP5) Объясните, пожалуйста, почему желательно загружать основную форму так: Private m_OMyForm as frmMyForm sub Main() set m_OMyForm = new frmMyForm m_OMyForm.Show end sub Почему не ограничится: frmMyForm.Show ???? Может это где-то уже описано, дайте ссылки. И ещё вопрос: Почему при повторной загрузке неглавной формы(нестартовой) переменные контейнера не инициализируются (сохраняют старые значения)? Приходиться их очищать в Form_Load Так и должно быть, или это глюки? (Форма выгружается с помощью Unload Me) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2004, 15:47:19 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
HiMik2004Объясните, пожалуйста, почему желательно загружать основную форму так: Private m_OMyForm as frmMyForm sub Main() set m_OMyForm = new frmMyForm m_OMyForm.Show end sub Почему не ограничится: frmMyForm.Show ???? потому что в первом случае ты имеешь указатель на объект формы и можешь по этому указателю замочить форму из любой части программы, впрочем как и показать/скрыть. HiMik2004И ещё вопрос: Почему при повторной загрузке неглавной формы(нестартовой) переменные контейнера не инициализируются (сохраняют старые значения)? Приходиться их очищать в Form_Load Так и должно быть, или это глюки? (Форма выгружается с помощью Unload Me) просто ты не убил форму а убрал ее, и она все еще жива в памяти. смотри первый ответ. Если бы у тебя была ссылка на форму как в "правильном" примере, ты бы сделал так: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2004, 16:05:53 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
HiMik2004Вопросы по загрузке и выгрузке форм (VB6, SP5) Объясните, пожалуйста, почему желательно загружать основную форму так: Private m_OMyForm as frmMyForm sub Main() set m_OMyForm = new frmMyForm m_OMyForm.Show end sub Почему не ограничится: frmMyForm.Show ???? Может это где-то уже описано, дайте ссылки. На самом деле, это вопрос стилистики и понимания instancing-а форм VB6. Коллекция форм и сами формы автоматически получают instancing GlobalMultyUse (by design). В соответствии с этим, VB сам создает экземпляр GlobalMultyUse объекта при первом обращении к его свойствам/методам. Об этом сказано в MSDN (советую прочитать всю статью) MSDN Life Cycle of Visual Basic Forms Dim frm As New Form1 frm.ANewMethod Because frm is declared As New, the form is not created until the first time the variable is used in code — in this case, when ANewMethod is invoked. After the code above is executed, the form remains created, but not loaded. Note Executing Form1.ANewMethod, without declaring a form variable, has the same effect as the example above. As explained in "Customizing Form Classes," Visual Basic creates a hidden global variable for each form class. This variable has the same name as the class; it's as though Visual Basic had declared Public Form1 As New Form1. Когда и почему лучше использовать GlobalMultiUse объекты - см. статью MSDN Global Objects and Code Libraries ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2004, 16:39:34 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
Похоже помогает поместить в Form_Unload: set frmMyForm = Nothing т.е. форма сама себя и очищает (а вот set Me = Nothing использовать нельзя) Ну а при использовании ключевого слова New просто старая форма, похоже действительно убивается и создаётся абсолютно новая. А MSDN обязательно почитаю, спасибо всем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2004, 17:48:23 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
Не нравится так: автор Код: plaintext 1. 2. 3. 4. 5. 6. 7. Пиши: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. автор Похоже помогает поместить в Form_Unload: set frmMyForm = Nothing т.е. форма сама себя и очищает (а вот set Me = Nothing использовать нельзя) Ну а при использовании ключевого слова New просто старая форма, похоже действительно убивается и создаётся абсолютно новая. Если ты в классе frmMyForm в Unload напишешь set frmMyForm = Nothing, то я даже не знаю, как это назвать :-)... Почитай MSDN... Без понимания ключевых моментов жизни форм в VB , ИМХО, кодить тяжеловато... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2004, 18:28:14 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
Конечно, немного странно чистить ссылку на форму в Form_Unload. Но всё равно, основную форму приходится убивать из неё самой. У меня там есть специальная кнопочка для выхода. Если убивать формы в Sub Main - то прога закруглится едва начавшись. (Я ещё пробовал запускать основную форму из Sub Main модально: frmMain.Show vbModal но тогда нет кнопки приложения на панеле задач, и вообще как-то подозрительно, хотя в памяти вроде не остаётся...) Так что я теперь делаю так: в Form_Unload: For Each f In Forms Unload f Set f = Nothing Next ' а теперь и главная форма: Set frmMain = Nothing В любом случае, когда выполняется инструкция (Set frmMain = Nothing) основная форма ещё существует. Можно её и не чистить. Мне главное было, чтобы при повторной загрузке неосновных форм инициализировались их переменные. А MSDN я почитал, и ещё почитаю ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2004, 21:00:59 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
авторЕсли убивать формы в Sub Main - то прога закруглится едва начавшись. А так не пробовал? Sleep - чтобы счетчик не показывал 100% загрузку процессора :-)))) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2004, 11:45:47 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
2 Durak: Код: plaintext 1. 2. 3. По-моему, не есть хорошо! А если форма в трей спрячется? Да и вообще конструкция кривая(без обид). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2004, 11:48:57 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
2MegaDimon Какие обиды :-)? Ваши предложения? Кстати, а почему кривая-то :-)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2004, 12:06:12 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
Кривая потому, что цикл вертиться зря(хоть и со слипом) и условие выхода не для любой ситуации подойдет. Мож лучше так: 1. Нафиг Sub Main() 2. В главной форме делаем деструктор. В нем аккуратно мочим все что еще живо. 3. При закрытии главной формы деструтор делает свое дело и в конце вызывает End/ Как вам такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2004, 12:29:25 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
авторКривая потому, что цикл вертиться зря(хоть и со слипом) и условие выхода не для любой ситуации подойдет. Ну условие-то, можно, положим любое придумать :-)... А End мне принципиально не нравится... Думаю, тут мы останемся при своем мнении и с миром разойдемся, пока наши гуру не предложат что-нибудь более красивое... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2004, 12:58:37 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
А как тебе такой пример из эмэздыэна: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Форма убивает себя по End. Думаю они знают что делают, иначе бы не писали это в эмэздыэне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2004, 13:01:53 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
Общее правило такое: закончил работать с объектом - выгрузи его. Т.е. отпала надобность в форме - освободи на нее ссылку. Если в конце приложения остались невыгруженые формы, то надо искать место, где они должны выгружаться и выгрузить их там. Потому что наличие "хвостов" - это сигнал о том, что в программе возможен Memory Leak. Мне кажется, что наличие всяческих циклов в конце приложения for each form, for each Recordset, for each file и т.п. - это признак плохого дизайна. Все эти формы, рекордсеты и файлы _уже_ должны быть закрыты на момент окончания приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2004, 13:43:28 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
Alexey KudinovОбщее правило такое: закончил работать с объектом - выгрузи его. Т.е. отпала надобность в форме - освободи на нее ссылку. Если в конце приложения остались невыгруженые формы, то надо искать место, где они должны выгружаться и выгрузить их там. Потому что наличие "хвостов" - это сигнал о том, что в программе возможен Memory Leak. Мне кажется, что наличие всяческих циклов в конце приложения for each form, for each Recordset, for each file и т.п. - это признак плохого дизайна. Все эти формы, рекордсеты и файлы _уже_ должны быть закрыты на момент окончания приложения. Золотые слова. Однако юзер нажмет кнопку выхода в основной форме, даже если неосновные формы открыты (а там открытые рекордсеты есть ...). Так что, иногда надо принудительно самому закрывать формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2004, 15:39:41 |
|
||
|
Вопросы по загрузке и выгрузке форм
|
|||
|---|---|---|---|
|
#18+
HiMik2004 Золотые слова. Однако юзер нажмет кнопку выхода в основной форме, даже если неосновные формы открыты (а там открытые рекордсеты есть ...). Так что, иногда надо принудительно самому закрывать формы. Тут смотря что считать "основной формой", а что "неосновными" формами. 1 Если у вас "основная" форма - это MDI форма, а "неосновные" - это MDIChild формы, то ничего предумывать не надо, VB сам за вас корректно выгрузит открытые MDIChild формы, и все события Unload, QueryUnload и т.п. в них вызовутся. 2 Если "основная" форма - это некая форма, а "неосновные" из нее модально вызываются, то пользователь на "основной" форме при открытой "неосновной" ничего не нажмет 3 Если же в приложении просто есть N форм, никак не связанных, не модальных и одну из них вы назвали "основной", то да, при ее выгрузке надо выгрузить все остальные принудительно. Но и в этом случае закрытие открытых рекордсетов и файлов нужно делать там, где они используются: в Unload или QueryUnload "неосновных" форм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2004, 15:58:44 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=32708864&tid=2168851]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 372ms |

| 0 / 0 |
