передать в процедуру массив

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
devel
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 19.02.2003 (Ср) 13:38
Откуда: Russia

передать в процедуру массив

Сообщение devel » 09.04.2003 (Ср) 15:32

Помогите, плз, как решать задачу.
Есть пользовательский тип

Public Type MyType
var1 as string
var2 as string
End Type

Есть массив
dim arr() as MyType

Есть процедура
Public Sub MySub(arg1, arg2, arr, arg3)

Так вот такая фишка с массивом переменных пользовательского типа не работает.
Компиллятор говорит:
Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions.

Подскажите, плз, какие есть варианты, чтобы процедурой обработать массив переменных пользовательского типа.

Заранее спасибо.
Devel

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 09.04.2003 (Ср) 19:57

Будь проще. Переобъяви массив как вариант и будет тебе счастье.

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 09.04.2003 (Ср) 22:25

а если так функцию объявить то вроде ok
Public Sub MySub(arg1, arg2, arr() As MyType, arg3)

End Sub

devel
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 19.02.2003 (Ср) 13:38
Откуда: Russia

Сообщение devel » 10.04.2003 (Чт) 10:04

Спасибо, ребята.
Однако до конца это ситуацию не исправило.

То, что предложил corgi без проблем работает, и это уже вариант. Недостаток только в том, что в процедуру передается массив жестко заданного типа MyType, т. е. массив другого типа уже передать нельзя. Это нужно для того, что есть разные структуры типов, у которых есть одинаковые свойства, так вот, для процедуры MySub нужны только эти одинаковые свойства массивов переменных разных типов. Немного неудобно.

Теперь о предложении superski. Если объявить dim arr() as Variant, то компиллятор скажет, что требуется объект, когда я буду заполнять arr()

Напр. arr(1).var1 = "dima" скажет object required.

Может я конечно что-то не понял. :roll:
Devel

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

Сообщение GSerg » 10.04.2003 (Чт) 10:13

Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions.


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

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 10.04.2003 (Чт) 13:36

devel писал(а):Теперь о предложении superski.

Классная интерпретация моей фамилии. Мне нравится! Может ник сменить?

devel писал(а):Напр. arr(1).var1 = "dima" скажет object required.

В VB эти 3.14зданутые пользовательские типы всё время чего-нибудь требуют. Создай вместо типа свой класс с двумя свойствами и забудь про весь этот геморрой.

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 10.04.2003 (Чт) 15:38

сделай так:

1. в модуль:
Код: Выделить всё
Public Type MyType
var1 as string
var2 as string
End Type

dim arr() as MyType

2. в форму:
Код: Выделить всё
Public Sub MySub(arg1, arg2, arr, arg3)
End Sub
Private Sub Form_Load()
MySub arg1, arg2, arr, arg3
End Sub

ps но смотри потом сам запутаешься с вариантными типами, типы лучше определять без всяких гуляний

devel
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 19.02.2003 (Ср) 13:38
Откуда: Russia

Сообщение devel » 10.04.2003 (Чт) 17:19

Еще раз спасибо за помощь
Skiperski, спасибо, что не обиделся. Это я нечаяно. :(
GSerg говорит правильно, но в моем случае это не сработает.

Допустим есть тип

'описание объекта SQL
Public Type sqlObject
Name As String 'имя объекта БД
Level As Long 'номер уровня в дереве зависимотей
XType As String 'тип объекта
End Type

'ОБЪЕКТ
Public Type mdObject
Name As String 'имя объекта
Level As Long 'номер уровня в дереве зависимотей
End Type

Есть процедура

Public Sub DrawDepsTree(mdObjects() As mdObject, ...)

которая юзает массив переменных типа mdObject. Так вот, вся подлянка в том, что в нее хрен передашь массив переменных типа
sqlObject, хотя этот тип просто расширение типа mdObject и чисто логически я тут не вижу никаких проблем. :lol:
Devel

Emzari
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 06.09.2002 (Пт) 9:08
Откуда: Georgia

Сообщение Emzari » 11.04.2003 (Пт) 10:30

Насколкд я помню массив в процедуру надо передавать последным

devel
Новичок
Новичок
 
Сообщения: 46
Зарегистрирован: 19.02.2003 (Ср) 13:38
Откуда: Russia

Сообщение devel » 11.04.2003 (Пт) 17:02

Ни хрена! Любым по порядку аргументом. :lol:

Ты наверное путаешь с Param Array, когда у процедуры произвольное число аргументов.

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)
Dim intI As Integer

Debug.Print strName; " Scores"
' Use UBound function to determine upper limit of array.
For intI = 0 To UBound(intScores())
Debug.Print " "; intScores(intI)
Next intI
End Sub

The following examples show how you can call this procedure.

AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16

AnyNumberArgs "Kelly", "High", "Low", "Average", "High"
Devel


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 79

    TopList