powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Почему умирает объект?
7 сообщений из 7, страница 1 из 1
Почему умирает объект?
    #36453726
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть private поле:
Код: plaintext
Private m_customers As Collection

и процедура:

Код: 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.
25.
26.
Private Sub add_combo(target_cell As Range, lst_customers As Collection)

    If (target_cell.value = "filled") Then Exit Sub
    target_cell.value = "filled"

    Dim i As Integer
    Dim ole As OLEObject
    Dim combo As MSForms.ComboBox

    Set ole = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=target_cell.Left, Top:=target_cell.Top, Width:=target_cell.Width, Height:=target_cell.Height)

    Set combo = ole.Object
    
    With combo
        .SpecialEffect = fmSpecialEffectSunken
        .Font.Size =  8 
        .TextAlign = fmTextAlignCenter
    End With


    For i =  1  To lst_customers.Count
        combo.AddItem (lst_customers(i))
    Next
    
End Sub

передаю в эту процедру вторым параметром m_customers(инициализированный, все нормально), первый раз все хорошо отрабатывает.

после этого m_customers становится nothing.

не пойму, почему?
...
Рейтинг: 0 / 0
Почему умирает объект?
    #36453824
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо привидения шалят, либо в вызове этой процедуры что-то неправильно. В самой процедура криминала вроде нету.
Можешь для четкости еще объявить параметры byref, но в данном случае это погоды не сделает.
...
Рейтинг: 0 / 0
Почему умирает объект?
    #36453847
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЛибо привидения шалят, либо в вызове этой процедуры что-то неправильно.

Спасибо за ответ.
Проблема действительно выше.
Так и не понял, почему это происходит.
Был бы дебагер нормальный - все было бы проще :)
Вот код(упростил до безобразия):

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Private m_customers As Collection



Private Sub Workbook_Open()
    Set m_customers = Customers
End Sub




Property Get Customers() As Collection


    Dim m_customers As Collection
    Set m_customers = New Collection
    
    m_customers.Add ("a")
    
    Set Customers = m_customers

End Property





Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    Dim target_cell As Range
    Dim tmp As Variant

    For Each tmp In Target 
        Set target_cell = tmp
        Call add_combo(target_cell, m_customers)
    Next tmp

    'вот первый раз этот цикл нормально отрабатывает, 
    'а по выходу из цикла коллекция умирает
    
End Sub




Private Sub add_combo(target_cell As Range, m_customers As Collection)

    Dim i As Integer
    Dim ole As OLEObject
    Dim combo As MSForms.ComboBox

    Set ole = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
        DisplayAsIcon:=False, Left:=target_cell.Left, Top:=target_cell.Top, Width:=target_cell.Width, Height:=target_cell.Height)

    Set combo = ole.Object

    For i =  1  To m_customers.Count
        combo.AddItem (m_customers(i))
    Next
    
End Sub
...
Рейтинг: 0 / 0
Почему умирает объект?
    #36454668
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_Lamer,

попробуй поиграться с WithEvents.
Создай объектную переменную с WithEvents, сделай мэппинг с нее на лист, и в коде класса уже обрабатывай Workbook_SheetSelectionChange.
...
Рейтинг: 0 / 0
Почему умирает объект?
    #36456043
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привидения. Однозначно привидения...
Если убрать работу с комбобоксом, то все в порядке. А с ним, коллекция действительно исчезает.
Какие забавные глюки...

Впрочем, мне сильно кажется, что ты не в ту сторону начал интерфейс рисовать. Создавать OLE-объекты на листе не самая хорошая идея. Один-два работают нормально. Но уже на десятке - Эксель начнет заметно тормозить.
Если нужны выпадающие списки на ячейках, лучше работать с validation и привязывать их к списку.
...
Рейтинг: 0 / 0
Почему умирает объект?
    #36458089
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При добавлении или удалении на листы Excel ActiveX-контролов, в частности, контролов с панели Visual Basic, инициализируются и теряют свои значения все глобальные переменные.
Обсуждалось здесь: http://www.planetaexcel.ru/forum.php?thread_id=10655] Недостатки динамического добавления/удаления контролов
...
Рейтинг: 0 / 0
Почему умирает объект?
    #36460988
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, в результате я заменил combo box на drop down list.
Что весьма печально, так как у них меньше опций.
Ну да делать нечего. Эксел у этих товарищей открыт постоянно, и утечки памяти мало радуют.

Спасибо big-duke, White Owl, ZVI :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Sub add_dropDown(target_cell As Range)

    Dim i As Integer, idx As Integer
    Dim ddl As DropDown
    
    idx = IIf((target_cell.Value <> ""), get_index(target_cell.Value, ThisWorkbook.Customers),  0 )

    Set ddl = ActiveSheet.DropDowns.Add( _
        target_cell.Left, target_cell.Top, target_cell.Width, target_cell.Height)
        
    For i =  1  To ThisWorkbook.Customers.Count
        Call ddl.AddItem(ThisWorkbook.Customers(i))
    Next
      
    With ddl
      .LinkedCell = target_cell.Address
      .PrintObject = False
      .OnAction = "set_data"
      .ListIndex = idx
    End With
    
End Sub
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Почему умирает объект?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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