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

Доступ к объекту, который является свойством другого объекта

12.01.2010, 21:21. Показов 1913. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня следующая проблема.
Есть класс Test_class.
Одним из свойств этого класса является динамический массив объектов класса Question_class - Questions().
Visual Basic
1
2
3
Private Questions() As Question_class   
Private Quantity As Integer 
Private Name As String
Необходимо в подпрограмме, которая использует объект Test_class обеспечить доступ к элементам массива Questions().
Пробовал объявить массив Questions() как Private, а не как Public, но при компиляции выбивает ошибку: Compile Error: Constants, Fixed Length strings, arrays, user-defined types not allowed as Public Members of object modules.
Также пытался использовать функцию ObjPtr, чтобы вернуть указатель на объект. Однако при запуске программе пишет Run-time Error '438'. Object doesn't support this property or method.
Visual Basic
1
2
3
4
5
Public Function AddNextQuestion() As Long 
ReDim Preserve Questions(Quantity + 1) 
AddNextQuestion = ObjPtr(Questions(Quantity)) 
Quantity = Quantity + 1 
End Function
Код в функции, в которой создан объект.
Visual Basic
1
2
3
Dim x As New Test_class
Dim d As New Question_class
d = x.AddNextQuestion()
Может ли кто-то посоветовать, как получить доступ к объекту, который является свойством другого объекта. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.01.2010, 21:21
Ответы с готовыми решениями:

Доступ к элементам массива, который является свойством обьекта
var ob = { id_type: , condition: , value: } //для функции обратного вызова var mas_option=; for(var i in...

[WPF] Вызывающий поток не может получить доступ к данному объекту, т.к. владельцем этого объекта является другой поток
Здравствуйте пытаюсь реализовать кросспоточное пополнение listbox в WPF С#, но и в итоге получаю следующую ошибку: void...

Ошибка: вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.
Ошибка в "progressBar1.Value += 50;", вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта...

7
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
13.01.2010, 01:21
Я может не совсем понимаю, но по-моему проблема в том, что сам объект не создаётся в классе, т.е. что делает функция AddNextQuestion? Она увеличивает массив, но новому элементу массива ничего не присваивает! Т.е. элемент массива, указатель на который пытаемся вернуть, равен Nothing, соответственно видимо поэтому и не можем получить указатель. Ибо указывать ни на что vb видимо не умеет (и подозреваю, что не только vb). Это раз. А два - это метод AddNextQuestion возвращает тип Long, а присвоить это значение ты пытаешься переменной d. Посмотри внимательно, какого типа ты её объявляешь. Вообще мало понятно, что именно требуется от кода. Но если нужен указатель на вновь созданный экземпляр класса Question_class, то примерно как-то так:
Visual Basic
1
2
3
4
5
6
Public Function AddNextQuestion() As Long
ReDim Preserve Questions(Quantity)
Set Questions(Quantity) = New Question_class
AddNextQuestion = ObjPtr(Questions(Quantity))
Quantity = Quantity + 1
End Function
а позырить указатель на объект можно так
Visual Basic
1
2
3
4
Dim x As New Test_class
Dim d As Long
d = x.AddNextQuestion()
MsgBox d
А вообще фиг знает, у меня с классами практики мало. А то что динамический массив низя объявить, как Public - это да.
1
6 / 6 / 0
Регистрация: 12.01.2010
Сообщений: 11
13.01.2010, 11:08  [ТС]
Спасибо, Abu.
А как получить доступ к свойствам и методам класса через этот указатель?
P.S. Программирую на vb6.
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
13.01.2010, 18:55
Цитата Сообщение от kornet Посмотреть сообщение
А как получить доступ к свойствам и методам класса через этот указатель?
Зачем через указатель-то? Если нужно просто обращаться к методам одного класса через другой, то всё тоже самое. Вот пример небольшой:
Visual Basic
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'модуль класса Question_Class
Private objName As String
'допустим у каждого экземляра будет своё имя
Private Hey_You As Long
'и каждый экземпляр будет считать количество обращений к себе
 
Private Sub Class_Initialize()
Dim i As Integer
Randomize
For i = 0 To 4
    objName = objName & Chr(CLng(Rnd * 25 + 97))
Next i
End Sub
'придумаем случайное имя экземляру класса при его создании
 
Public Sub ObjClick()
Hey_You = Hey_You + 1
End Sub
'процедура запоминаня количества обращений к объекту
 
Public Function GetName() As String
GetName = objName
End Function
'соответственно научим класс сообщать своё имя
 
Public Function GetHey() As Long
GetHey = Hey_You
End Function
'и сообщать сколько раз его кликали
'**************************************************
'модуль класса Test_Class
Private Questions() As Question_Class
Private Quantity As Integer 'размер массива
Private Position As Integer 'текущий элемент
 
Private Sub Class_Initialize()
Quantity = -1
Position = -1
End Sub
 
Public Property Get CurIndex() As Integer
CurIndex = Position
End Property
 
Public Property Let CurIndex(ByVal vNewValue As Integer)
Position = vNewValue
End Property
 
Public Sub AddNextQuestion()
Quantity = Quantity + 1
ReDim Preserve Questions(Quantity)
Set Questions(Quantity) = New Question_Class
Position = Quantity
End Sub
 
Public Function CurQuestion() As Question_Class
If Position > -1 Then
    Set CurQuestion = Questions(Position)
Else
    MsgBox "Массив не заполнен!", , ""
End If
End Function
'**************************************************
'модуль формы, на форме три кнопки и листбокс для удобства
Dim t As New Test_Class
 
Private Sub Form_Load()
Command1.Caption = "Add element"
Command2.Caption = "Get Name"
Command3.Caption = "Get Hey"
End Sub
 
Private Sub Command1_Click()
t.AddNextQuestion
List1.AddItem "one instance"
End Sub
 
Private Sub Command2_Click() 'проверяем, если элемент не пустой, то показываем имя
If Not t.CurQuestion Is Nothing Then MsgBox t.CurQuestion.GetName
End Sub
 
Private Sub Command3_Click() 'проверяем, если элемент не пустой, то показываем количество кликов
If Not t.CurQuestion Is Nothing Then MsgBox t.CurQuestion.GetHey
End Sub
 
Private Sub List1_Click()
t.CurIndex = List1.ListIndex
t.CurQuestion.ObjClick
End Sub
2
6 / 6 / 0
Регистрация: 12.01.2010
Сообщений: 11
13.01.2010, 21:03  [ТС]
Abu.
ДА! Оно работает! Спасибо большое! +1

Добавлено через 21 минуту
Но все жё остается вопрос. Если возвращать указатель на объект, то как получить доступ к методам и свойствам этого объекта через указатель? Спасибо.
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
14.01.2010, 02:58
Цитата Сообщение от kornet Посмотреть сообщение
Если возвращать указатель на объект, то как получить доступ к методам и свойствам этого объекта через указатель?
Фиг знает. А тебе это зачем? Скажи какую цель преследуешь, я поищу.
0
6 / 6 / 0
Регистрация: 12.01.2010
Сообщений: 11
14.01.2010, 14:40  [ТС]
Цитата Сообщение от Abu Посмотреть сообщение
Фиг знает. А тебе это зачем? Скажи какую цель преследуешь, я поищу.
Для удобства и сокращения кода.
Я разрабатываю программу, которая будет обрабатывать тесты управлять ими.
Класс Test_class включает в себя динамический массив Question_class, который содержит в себе все вопросы теста. Свойство Quantity класса Test_class отвечает за кол-во вопросов в тесте.
Метод AddNextQuestion() класса Test_class должен выделять память под очередной вопрос, увеличивать значение Quantity и возвращать указатель на очередной выделенный вопрос. Этот указатель хотелось бы присвоить переменной и при помощи этой переменной оперировать конкретным вопросом. Обращаться к методам этого конкретного вопроса придется не один раз.
Можно, в принципе, как ты посоветовал, отдельный метод класса Test_class создать, который будет просто возвращать последний созданный Question_class, но это усложнит код.
Спасибо за помощь.
0
 Аватар для Abu
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
16.01.2010, 15:14
Цитата Сообщение от kornet Посмотреть сообщение
Для удобства и сокращения кода.
Удобство, конечно, для каждого имеет своё понятие, но код ты этим врятли сократишь. Я вообще не понимаю, зачем тебе работать с классом через класс? Почему нельзя создать массив типа Question_class в модуле формы и оттуда с ним напрямую работать? Но раз нельзя - значит нельзя, пусть будет через промежуточный класс (может я и вправду не в курсе какой-то простой истины). В прилепленных есть статья, там как раз про указатели. Кстати, указатели в vb, насколько мне известно, существуют для работы с API функциями. А так они нафиг не нужны, зачем работать через указатель, когда ты можешь объявить переменную этого типа и к ней обращаться. В общем, если я всё правильно поняла, то указатели - это не твой случай. Если ошибаюсь - объясни в чём.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2010, 15:14
Помогаю со студенческими работами здесь

Не работает свяка моего DependencyProperty со свойством другого объекта
Создаю UserControl c DependencyProperty "CurrentNumber" <UserControl x:Class="DPApplication.ShowNumberControl" ...

Доступ к объекту из другого класса
Перебрав кучу топиков и ссылок, так и не нашел решения для себя... Может кто подскажет, как обратиться к текстбоксу в MainWindow() из...

Доступ к объекту ui из другого класса
Всем привет! Из другого класса необходимо обратиться к объекту ui (textEdit) и что-нибудь вывести (append). MainWindow.h #ifndef...

Доступ к объекту из другого потока
Привет, подскажите, как исправить ошибку private void button1_Click(object sender, RoutedEventArgs e) { Thread parse_1 = new...

Доступ к объекту другого потока
Доброго времени суток. Помогите, пожалуйста, с задачей. У меня есть форма. Я создаю поток и в нем создаю PictureBox. Как сделать его...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru