Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
realist

Как выгрузить программу без ошибок?

05.07.2009, 11:58. Показов 2105. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Раньше я просто закрывал программу 'крестиком'
Потом, когда к проекту добавились некоторые контролы стали возникать ошибки при выгрузке программы. И тогда я в событии unload поставил end. Помогло. А сейчас при добавлении ещё одного контрола, при выгрузки программы возникает похожая ошибка, что была до end. Я где-то видел универсальный код выгрузки программы, но сейчас не могу найти.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.07.2009, 11:58
Ответы с готовыми решениями:

Как выгрузить из памяти свою программу?
При выгрузке программы она остается в списке процессов,как убить её совсем?

как выгрузить кофигурацию в 7.7 без б.д.?
Помогите плз. как можно выгрузить конфигурацию без б.д. в 7.7.?

Cygwin скомпилировал программу без ошибок, но потом не запускает
Всем привет! Самостоятельно начал учить язык C. Еще только в начале пути, но уже столкнулся с проблемой, которая раньше не возникала....

13
Comanche
05.07.2009, 12:54
Вообще, не рекомендуется использовать End для завершения работы VB-программы. См. MSDN:
Note: The End statement stops code execution abruptly, without invoking the Unload, QueryUnload, or Terminate event, or any other Visual Basic code. Code you have placed in the Unload, QueryUnload, and Terminate events of forms and class modules is not executed.
Т.е. это 'грубый' метод.

'Универсальный' код закрытия - это что-то вроде этого:
Visual Basic
1
2
3
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Set Form1 = Nothing
End Sub
причём это надо сделать для каждой формы.
Хотя есть информация, что 'Set Form1 = Nothing' освобождает память от всех переменных, описанных в пределах формы Form1, я всё же пишу в Sub Form_QueryUnload очистку всех объектных переменных ДО вызова 'Set Form1 = Nothing'. Например, 'Set myRecordset = Nothing', 'Set myTextBox = Nothing' и так далее, - делая перед этим 'закрытие', если объект его поддерживает, конечно: например, 'myRecordset.Close', 'myExcelApplication.Quit' и т.п.

Если у тебя проект стартует с формы, и в проекте есть ещё модуль, объектные переменные которого (глобальные) используются в коде формы, то их сто процентов нужно освобождать внутри Sub Form_QueryUnload, поскольку они не объявлены в пределах формы и не 'умрут' вместе с формой при 'Set Form1 = Nothing'.

Кроме всего этого, при закрытии приложений Word и Excel есть тонкости, связанные с тем, что их нужно закрывать по-разному в ситуациях, когда они были открыты через CreateObject и через GetObject: для меня это загадка, но подбором найти верное решение удалось.
realist
06.07.2009, 19:03
Дело в том, что у меня из родительской формы открывается несколько немодальных форм. Когда стоял энд в событи закрытия родительской формы, остальные формы закрывались, это мне и было нужно. А сейчас даёт ошибку. Может есть какая-нить у кого наработка?
Comanche
06.07.2009, 19:16
А разве сложно заменить твой End на такой вот код?
Visual Basic
1
2
3
4
5
6
7
For i = 0 To Forms.Count - 1
    Select Case Forms(i).Name
        Case 'childForm1', 'childForm2', 'childForm3'
            Unload Forms(i)
        Case Else
    End Select
Next i
realist
06.07.2009, 20:11
Гениально!
Только иногда из-зи чего-то пишет - 'ошибка 9 - нижний индекс вне диапазона' Не подскажешь, как это победить?
Comanche
06.07.2009, 20:29
Я дал кривой код, sorry. После каждого Unload размер коллекции Forms уменьшается на единицу и верхняя граница цикла For 'плывёт' )

Проще сначала пройтись циклом по всей коллекции, читая имена форм в строковый массив. А потом - «For i = LBound(myArray) To UBound(myArray)», и уже в этом цикле делать Forms(myArray(i)).Unload неугодным формам.
realist
06.07.2009, 21:29
хе-хе
для инструкции Forms(myArray(i)) пишет - несоответсвие типов, т.к. имя в кавычках получается
realist
06.07.2009, 21:35
я вот такую бяку придумал:
unload form1
unload form2
и т.д.
Если даже форма с таким именем не открыта то ошибки не будет.
По-моему ещё круче)))
0 / 0 / 0
Регистрация: 04.03.2009
Сообщений: 79
07.07.2009, 06:53
можно проще:
Visual Basic
1
2
3
4
dim f as form
for each f in forms
 unload f
next
0
0 / 0 / 0
Регистрация: 04.03.2009
Сообщений: 79
07.07.2009, 06:57
пардон, ошибочка, надо в цикле вставить проверку: вдруг форма f - текущая форма. Т.е. что-то типа
Visual Basic
1
if f<>me then unload f
0
0 / 0 / 0
Регистрация: 15.04.2009
Сообщений: 26
07.07.2009, 09:46
Visual Basic
1
2
3
4
5
dim frm as Form
for each frm in Forms
    if not frm is me then unload frm  
next 
unload me
0
Vsh
07.07.2009, 11:15
выгружать надо форму с 0-м индексом

Visual Basic
1
2
3
For i = 0 To Forms.Count - 1
Unload Forms(0)
Next i
но проблема может быть если используются библиотеки и что либо не выгружается там
0 / 0 / 0
Регистрация: 09.05.2010
Сообщений: 233
05.09.2010, 10:38
А чем так плох End? Ну остануться какие-то объекты в памяти, неужели они будут такой проблемой?
0
0 / 0 / 0
Регистрация: 09.05.2010
Сообщений: 233
05.09.2010, 12:40
Вот что насоветовали заграничные коллеги:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Form_Unload(Cancel As Integer) 
  Dim frm As Form, ctl As Control, obj As Object 
  UnHookForm Me 
  Call Shell_NotifyIcon(NIM_DELETE, nfIconData) 
  On Error Resume Next 
  For Each frm In Forms 
    For Each ctl In frm.Controls 
      Set ctl = Nothing 
    Next ctl 
    For Each obj In frm.Objects 
      Set obj = Nothing 
    Next obj 
    Unload frm 
    Set frm = Nothing 
  Next frm 
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2010, 12:40
Помогаю со студенческими работами здесь

Программный код написан без ошибок но программу брикает
вот сам код #include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;string&gt; #include&lt;iomanip&gt; using namespace std; struct film ...

Написать программу без ошибок. Что она вообще делает
#include &lt;stdio.h&gt; int f(int n) { if(n==0) { return(o); } else (n==1)&amp;(n=2) { return 1; int...

Как выгрузить свою же программу при завершении Windows?
Я написал программу, которая сидит в трее. К сожалению, она не дает нормально выключится ПК (перезагрузка/выключение/смена юзера). ПК...

Как выгрузить программу из памяти при закрытии окна
Как выгрузить программу из памяти при закрытии окна? При нажатии на кнопку закрытия окна программа остается висеть в памяти.

как откомплиировать без ошибок(
Добавлено через 55 секунд Если у кого нибудь получиться, скиньте екзешник и скажите какие параметры вы выбирали. у меня visual 2010 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru