чем отличается Dim от Private?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

чем отличается Dim от Private?

Сообщение timsoft » 08.10.2004 (Пт) 10:33

Собственно сабж

И еще вопрос
Как сделать, чтобы переменные формы после ее выгрузки обнулялись?
Или только вручную?

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 08.10.2004 (Пт) 11:38

1) ничем. Это, вроде, осталось от старого синтаксиса. Private выглядит лучше, тк понятнее - не надо вспоминать, что там по умолчанию выставлено. Вот например, спецификатор у процедур и функций можно не писать. А они по умолчанию Public. Поди, догадайся.

2) Переменные сами обнуляются при выгрузке формы. Если не обнулились - значит, где-то циклические ссылки. Такое надо самому разруливать в Form_Unload
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 12:09

за первое спасибо
про второе:

делаем простой тест

Form1
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
  Form2.Show
End Sub


Form2
Код: Выделить всё
Option Explicit
Private strTest As String

Private Sub Form_Load()
  Debug.Print "strTest=", strTest
  strTest = "куку"
End Sub


в первый раз нажимаем кнопочку, загружается форма2, strTest=""
закроем эту форму.
во второй раз нажимаем кнопочку, загружается форма2, strTest="куку"

:roll:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.10.2004 (Пт) 12:11

Сделай
Код: Выделить всё
Private Sub Command1_Click()
  Unload Form2
  Set Form2 = Nothing
  Form2.Show
End Sub

и неожиданностей не будет
Lasciate ogni speranza, voi ch'entrate.

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 12:17

alibek, спасибо!

получается, что перед каждым form.show нужно ставить set form = nothing...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 08.10.2004 (Пт) 12:22

alibek, этот код абсолютно нелогичен - из него человек только поймет, что VB - это очень странный зверь, в котором перед показом формы надо ее выгружать. Зачем же так?

Код: Выделить всё
Private Sub Command1_Click()
Dim frm As Form2
    Set frm = New Form2
    frm.Show vbModal
End Sub


P.S. модальность к вопросу не относится, но формы чаще модальные, чем нет...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.10.2004 (Пт) 12:24

Дык :)
Такой нелогичный пример, потому что форма показывается как Modeless :)
Правильнее было бы

Form2.Show vbModal
Set Form2 = Nothing

ну или создавать новый экземпляр, как у тебя.

timsoft, не _перед_ вызовом формы. Просто _после_ закрытия форму надо не только выгрузить, но и очистить ссылки на нее.
Последний раз редактировалось alibek 08.10.2004 (Пт) 12:26, всего редактировалось 1 раз.
Lasciate ogni speranza, voi ch'entrate.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 08.10.2004 (Пт) 12:24

timsoft писал(а):получается, что перед каждым form.show нужно ставить set form = nothing...

Вот-вот! Именно об этом я и говорила! Нет, конечно. Просто VB позволяет обращаться прямо к Form2. При этом он создает внутри себя переменную и ей делает Show. Естественно, эта переменная глобальная и не разрушается.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 12:32

формы у меня не модальные
если форма уже загружена и я делаю show, то она просто активизируется
если перед этим сделать nothing то она выгрузится и снова загрузится...

как определить, загружена она или нет?
перелопачивать Forms() ?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.10.2004 (Пт) 12:39

Зачем?
Делай просто .Show. Если форма еще не была загружена, она загрузится. Но я советую загружать их вручную, это упростит понимание кода.
Nothing нужно делать в том случае, если ты форму хочешь именно выгрузить (если тебе форма больше не нужна). В твоем случае (раз у тебя формы не модальные, на них видимо какая-то вспомогательная информация?) ты их лучше не выгружай, а скрывай. А в _QueryUnload добавь строчку If UnloadMode = vbControlMenu Then Cancel = True: Hide.
Lasciate ogni speranza, voi ch'entrate.

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 12:42

alibek писал(а):Зачем?


тогда не получается обнулить ее переменные :-)
см. второй вопрос из моего первого поста

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 08.10.2004 (Пт) 12:42

Пойми простую вещь: форма - это класс
Пока существует переменная формы - живы мемберы этого класса
Если тебе при выгрузке немодальной формы (при нажатии на крестик, допустим) надо, чтобы мемберы очищались - лови Form_Unload в ней.

Опиши, в чем суть твоей проблемы.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 12:48

Rainbow писал(а):Опиши, в чем суть твоей проблемы.


описую :-)

есть прога с немодальными формами
юзверь открывает их по мере необходимости, переключается между ними и всякое такое. в какой-то момент юзверю захотелось закрыть форму (unload)

через некоторое время он снова открыл ее, но тут хрень -- все переменные которые при первой загрузке формы были равны нулю, уже имеют какое-то значение при повторной загрузке, что вводит юзверя в ступор. Например, в форме есть таблица и переменная strFilter = "WHERE name LIKE 'shit%'". Так вот, при повторной загрузке этой формы юзверь видит таблицу с отфильтрованными значениями, т.к. strFilter не обнулился. Я могу обнулять вручную при Form_Load, но переменных слишком дохрена...

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 12:57

ура!
решение нашел!

в Form_Unload пишем Set <formName>= Nothing
тогда при повторной загрузке все переменные снова обнулены
:D

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 08.10.2004 (Пт) 13:03

Ой! В своем Unload себе же Nothing? Как-то мне не по себе...

Правильнее было бы все-таки на From_Unload ручками обнулить переменные...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 13:06

Rainbow писал(а):Ой! В своем Unload себе же Nothing? Как-то мне не по себе...


дык работает!
и даже в таскменеджере видно, что освобождаетя больше памяти, чем без этого :D

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.10.2004 (Пт) 13:07

Вот-вот! С этого и надо было начинать. Нужно взять за правило:
Код: Выделить всё
Private Sub Form_Unload(Cancel As Integer)

Unload Form1
Set Form1 = Nothing

End Sub


Кстати, такой вопрос: у меня в форме объявлены глобальный recordset и connection (а также подгружаются картинки и объекты). Я там ими пользуюсь в программе, а потом форма выгружается. Достаточно ли просто написать set form1 = nothing, или нужно ручками каждый объект выгружать, чтобы память очистить?

И ещё, объясните мне - это прикол или глупость? Есть таймер. При выгрузке формы с ним надо что-нибудь делать? А то тут кто-то советовал сначала его дизэйбл сделать.. :?

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 08.10.2004 (Пт) 13:12

Set Me = Nothing на Form_unload прокатит, поскольку VB в момент Unload "забывает" про форму напрочь. То есть, формально, то, что находится в Form_Unload уже и не метод класса Form (хотя, на самом деле, конечно же метод). Особо углубляться в windbg или Soft-Ice не нужно, чтобы написать несколько примеров и посмотреть, как все работает.

Но, как и сказала Rainbow, логичнее (для программиста) обнулить все переменные. При переходе на .NET это поможет, т.к. там с Set Me = Nothing будут проблемы (хотя и их можно обойти, например, используя делегаты).
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.10.2004 (Пт) 13:19

gaidar, у меня это просто больная тема.. Есть проект, который работает круглосуточно. Там много чего есть - рекордсеты, видеоролики, подгружаемые картинки, размножающиеся объекты и прочее. В форм_анлоад везде стоит set form = nothing. Но через несколько суток всё виснет напрочь (при очередном запуске ролика)!
Я уже даже "опустился" до того, что каждые сутки автоматически перезагружаю exe'шник. Не помогает. Память не очищается до конца.

Вот что это может быть? Какая сволочь (объект) за собой не убирает?

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 08.10.2004 (Пт) 13:22

gaidar писал(а):Set Me = Nothing на Form_unload прокатит


катит не Me (оно как раз и не катит, дает ошибку), а именно имя формы, типа frmMain

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 08.10.2004 (Пт) 13:26

Здесь тебе поможет только серьезная отладка. Необходимо постоянно мониторить память приложения, во все классы добавить debug методы (элементарно писать в файл - вошел, ушел, занял памяти).
Если это такое вот real-time приложение, то здесь без этого не обойтись. Прежде всего пройдись по всем объектам и заставь принудительно освобождать неиспользуемые ресурсы. Особо обрати внимание на рекордсеты и динамически подгружаемые элементы UI (иногда они тьянут за собой дополнительные объекты, в зависимости от того, добросовесный ли разработчик контрола, то он за собой уберет или нет).

В общем - закрой все, что можно. А потом можешь избавиться от set ... = nothing
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 08.10.2004 (Пт) 13:45

Для начала, Scuder, проверь, что все классы уничтожаются корректно. Последний ивент, который приходит - это Terminate. Попробуй в режиме отладки сделать несколько типичных действий и посмотреть, все ли Terminate, какие ожидал, пришли.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 2

    TopList