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

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

12.01.2010, 21:21. Показов 1934. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru