Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопросы по загрузке и выгрузке форм / 15 сообщений из 15, страница 1 из 1
21.09.2004, 15:47:19
    #32704623
HiMik2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
Вопросы по загрузке и выгрузке форм (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)
...
Рейтинг: 0 / 0
21.09.2004, 16:05:53
    #32704683
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
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.
m_OMyForm.Hide
Set m_OMyForm = Nothing
...
Рейтинг: 0 / 0
21.09.2004, 16:39:34
    #32704763
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
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
...
Рейтинг: 0 / 0
21.09.2004, 17:48:23
    #32704976
HiMik2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
Похоже помогает поместить в Form_Unload:
set frmMyForm = Nothing
т.е. форма сама себя и очищает
(а вот set Me = Nothing использовать нельзя)
Ну а при использовании ключевого слова New просто старая форма, похоже действительно убивается и создаётся абсолютно новая.

А MSDN обязательно почитаю, спасибо всем.
...
Рейтинг: 0 / 0
21.09.2004, 18:28:14
    #32705093
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
Не нравится так:

автор

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private m_OMyForm as frmMyForm

sub Main()

set m_OMyForm = new frmMyForm
m_OMyForm.Show
end sub


Пиши:
Код: 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.
Private m_OMyForm as New frmMyForm

sub Main()
m_OMyForm.Show

 ' ля-ля-ля... 

Call Dispose

end sub

sub Dispose 
Dim frm as Form

 ' выгружаешь все... 
For Each frm In Forms
  Unload frm
Next

 ' теперь уничтожаешь 
set m_OMyForm = Nothing

end Sub


автор
Похоже помогает поместить в Form_Unload:
set frmMyForm = Nothing
т.е. форма сама себя и очищает
(а вот set Me = Nothing использовать нельзя)
Ну а при использовании ключевого слова New просто старая форма, похоже действительно убивается и создаётся абсолютно новая.

Если ты в классе frmMyForm в Unload напишешь
set frmMyForm = Nothing,
то я даже не знаю, как это назвать :-)...

Почитай MSDN... Без понимания ключевых моментов жизни форм в VB , ИМХО, кодить тяжеловато...
...
Рейтинг: 0 / 0
21.09.2004, 21:00:59
    #32705252
HiMik2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
Конечно, немного странно чистить ссылку на форму в 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 я почитал, и ещё почитаю ...
...
Рейтинг: 0 / 0
22.09.2004, 11:45:47
    #32705960
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
авторЕсли убивать формы в Sub Main - то прога закруглится едва начавшись.


А так не пробовал?
Sleep - чтобы счетчик не показывал 100% загрузку процессора :-))))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Main()

Set MainForm = New MainFrame
MainForm.Show

Do While MainForm.Visible
    DoEvents
    Sleep  1 
Loop

...
Рейтинг: 0 / 0
22.09.2004, 11:48:57
    #32705972
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
2 Durak:
Код: plaintext
1.
2.
3.
Do While MainForm.Visible
    DoEvents
    Sleep  1 
Loop

По-моему, не есть хорошо! А если форма в трей спрячется? Да и вообще конструкция кривая(без обид).
...
Рейтинг: 0 / 0
22.09.2004, 12:06:12
    #32706023
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
2MegaDimon

Какие обиды :-)?

Ваши предложения?

Кстати, а почему кривая-то :-)?
...
Рейтинг: 0 / 0
22.09.2004, 12:29:25
    #32706088
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
Кривая потому, что цикл вертиться зря(хоть и со слипом) и условие выхода не для любой ситуации подойдет. Мож лучше так:
1. Нафиг Sub Main()
2. В главной форме делаем деструктор. В нем аккуратно мочим все что еще живо.
3. При закрытии главной формы деструтор делает свое дело и в конце вызывает End/

Как вам такое?
...
Рейтинг: 0 / 0
22.09.2004, 12:58:37
    #32706212
Дурак
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
авторКривая потому, что цикл вертиться зря(хоть и со слипом) и условие выхода не для любой ситуации подойдет.

Ну условие-то, можно, положим любое придумать :-)...

А End мне принципиально не нравится...

Думаю, тут мы останемся при своем мнении и с миром разойдемся, пока наши гуру не предложат что-нибудь более красивое...
...
Рейтинг: 0 / 0
22.09.2004, 13:01:53
    #32706228
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
А как тебе такой пример из эмэздыэна:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Form_Load()
   Dim Password, Pword As String
   PassWord = "Swordfish"
   Pword = InputBox("Type in your password")
   If Pword <> PassWord Then
      MsgBox ("Sorry, incorrect password")
      End
   End If
End Sub
See Also

Форма убивает себя по End. Думаю они знают что делают, иначе бы не писали это в эмэздыэне.
...
Рейтинг: 0 / 0
22.09.2004, 13:43:28
    #32706378
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
Общее правило такое: закончил работать с объектом - выгрузи его. Т.е. отпала надобность в форме - освободи на нее ссылку.
Если в конце приложения остались невыгруженые формы, то надо искать место, где они должны выгружаться и выгрузить их там.

Потому что наличие "хвостов" - это сигнал о том, что в программе возможен Memory Leak.

Мне кажется, что наличие всяческих циклов в конце приложения for each form, for each Recordset, for each file и т.п. - это признак плохого дизайна. Все эти формы, рекордсеты и файлы _уже_ должны быть закрыты на момент окончания приложения.
...
Рейтинг: 0 / 0
23.09.2004, 15:39:41
    #32708786
HiMik2004
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
Alexey KudinovОбщее правило такое: закончил работать с объектом - выгрузи его. Т.е. отпала надобность в форме - освободи на нее ссылку.
Если в конце приложения остались невыгруженые формы, то надо искать место, где они должны выгружаться и выгрузить их там.

Потому что наличие "хвостов" - это сигнал о том, что в программе возможен Memory Leak.

Мне кажется, что наличие всяческих циклов в конце приложения for each form, for each Recordset, for each file и т.п. - это признак плохого дизайна. Все эти формы, рекордсеты и файлы _уже_ должны быть закрыты на момент окончания приложения.

Золотые слова.
Однако юзер нажмет кнопку выхода в основной форме, даже если неосновные формы открыты (а там открытые рекордсеты есть ...).
Так что, иногда надо принудительно самому закрывать формы.
...
Рейтинг: 0 / 0
23.09.2004, 15:58:44
    #32708864
Alexey Kudinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по загрузке и выгрузке форм
HiMik2004
Золотые слова.
Однако юзер нажмет кнопку выхода в основной форме, даже если неосновные формы открыты (а там открытые рекордсеты есть ...).
Так что, иногда надо принудительно самому закрывать формы. Тут смотря что считать "основной формой", а что "неосновными" формами.
1 Если у вас "основная" форма - это MDI форма, а "неосновные" - это MDIChild формы, то ничего предумывать не надо, VB сам за вас корректно выгрузит открытые MDIChild формы, и все события Unload, QueryUnload и т.п. в них вызовутся.
2 Если "основная" форма - это некая форма, а "неосновные" из нее модально вызываются, то пользователь на "основной" форме при открытой "неосновной" ничего не нажмет
3 Если же в приложении просто есть N форм, никак не связанных, не модальных и одну из них вы назвали "основной", то да, при ее выгрузке надо выгрузить все остальные принудительно. Но и в этом случае закрытие открытых рекордсетов и файлов нужно делать там, где они используются: в Unload или QueryUnload "неосновных" форм.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопросы по загрузке и выгрузке форм / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]