Правильное использование объектных переменных?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Правильное использование объектных переменных?

Сообщение Leon_ » 27.05.2004 (Чт) 23:33

Читаю книгу Скотта ( :wink: ) Баркера «… …Access2002», пытаюсь разобраться в ADO.
Но одна мелочь меня совсем запутала.

А именно: как же все-таки правильно использовать объектные переменные?
все эти комбинации Set qwerty = New QWERTY?
Обязательно ли потом "отвязывать" присваиванием
Set qwerty = Nothing ??

Пример из Скотта:
Sub AnyProcedure()
Dim cnnLocal As New ADODB.Connection
Dim rstCurr As New ADODB.Recordset

Set cnnLocal = CurrentProject.Connection
cnnLocal.Open "SELECT ........."

rstCurr.Close
cnnLocal.Close
End Sub

Зачем, спрашивается, при запросе текущего, уже существующего, подключения переменную объявлять именно через New?
И что произойдет, если не освобождать через Nothing эту переменную?

Подскажите, а то я совсем запутался в этих объектах-библиотеках-коллекциях?
:cry:

aaf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 190
Зарегистрирован: 08.02.2002 (Пт) 13:48
Откуда: Russia

Сообщение aaf » 28.05.2004 (Пт) 7:29

И что произойдет, если не освобождать через Nothing эту переменную?


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

Насколько я понимаю этот механизм, через NOTHING ты освобождаешь память, занимаемую этим объектом.
Вечный LAmer

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.05.2004 (Пт) 9:17

New здесь правда не нужно.
=Nothing после использования лучше применять.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 28.05.2004 (Пт) 13:04

А если переменную объявляли не через New а просто.
Ну например Dim Fil As File.
После этого работаем с файлом, открываем, читаем, закрываем.
Нужно ли при закрытии программы присваивать Fil значение Nothing?
Если нет, то почему?
Если да, то у меня при присвоении Fil=Nothing VB ругается.
А если просто Fil="" тогда не ругается.
Простите за ламерский вопрос. :oops:

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 28.05.2004 (Пт) 13:52

New создает экземпляр объекта. А если ты пишешь
Код: Выделить всё
Dim qwerty as QWERTY
Set qwerty = Nothing


То гарантированно получишь ошибку времени выполнения... А почему? Да потому, что обнулить несуществующий (не созданный и проинициализированный) объект НЕЛЬЗЯ!

Получается как в стишке:
<0 программистов ругал сердитый шеф. Потом уволил одного и стало их FF>
Моду создают модоки, а распространяют модозвоны.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.05.2004 (Сб) 0:35

Во-первых, спасибо всем тем, кто помогает мне разобраться :)

Но, во-вторых, буду спорить..

aaf: если некоторая переменная объявлена локально внутри процедуры/функции, то ее память автоматически освободится при покидании тела функции. Э? Видимо, присваиванием Nothing мы лишь явно указываем "уменьшить количество ссылок на объект", который мы уже прекращаем использовать, но он еще может продолжать использоваться другими... (Я уже тут кое-что проштудировал, оказывается это все как COM)
Но не происходит ли НЕЯВНОГО присвоения объетной переменной этого Nothing при выходе из области видимости? Ведь это же VB, думаю тут все Ok? Вот в чем новый вопрос.


hCORe: Согласен, что New создает экземпляр объекта. Но вот с твоим примером поработал, не поленился. Не так это :roll:
Код: Выделить всё
Private Sub cmdAny_Click()
    Dim exelApp   As Excel.Application
    Set exelApp = Nothing
   
    Dim dbs As DAO.Database
    Set dbs = Nothing
End Sub

Не получаю ошибок. Может ты имел в виду возникновение ошибки при объявлении и обNULLении переменной данных (что, конечно же, не работает), а не переменной объектов?
При объявлении об.переменной через Dim без использования New (Dim exelApp As Excel.Application), переменная уже имеет специальное значение Nothing. Так что "обнулить несуществующий (не созданный и проинициализированный) объект" можно.
Я неправ?


PS: спорю не из любви оспаривать авторитеты, лишь из желания разобраться до сути. :wink:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.05.2004 (Сб) 7:28

Обнулить ноль, безусловно, можно. Не нужно, правда, но можно.
Явное =Nothing обязательно нужно тогда, когда А ссылается на Б, а Б ссылается на А. Кроме того, бывают случаи, когда объект имеет метод самоуничтожения - в этом случае после вызова этого метода нужно =Nothing
Код: Выделить всё
Option Explicit

Private Sub Form_Load()
  Dim x As Object
 
  Set x = CreateObject("excel.application")
 
  Debug.Print "Valid Excel object: " & CStr(ObjPtr(x))
 
  x.Visible = True
  x.quit
 
  Debug.Print "Invalid Excel object: " & CStr(ObjPtr(x))
 
  Set x = Nothing
 
  Debug.Print "Empty object: " & CStr(ObjPtr(x))
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.05.2004 (Сб) 23:40

Ок, теперь я знаю об этом достаточно.
Всем спасибо!


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 2

    TopList  
cron