|
50 Кб. |
|
| кто пояснит разницу
есть такой кодик
l_l = Split(Mid(Node.Tag, 2), ";")
Tree_Add l_l(0), Node.Key, l_l(1)
но функция получает вот такую вещь (см. рисунок)
задав
Tree_Add Val(l_l(0)), Node.Key, Val(l_l(1))
получаю всё как надо
- почему при передачи строки получаем ХЗЧ??? | |
|
| |
|
|
|
|
| Split преобразует строчку в массив строк - как видно в окне "Watches" и передаем (должны) элемент массива - т.е. строку (судя по всему). | |
|
| |
|
|
|
| Val Function Example
This example uses the Val function to return the numbers contained in a string.
Dim MyValue
MyValue = Val("2457") ' Returns 2457.
MyValue = Val(" 2 45 7") ' Returns 2457.
MyValue = Val("24 and 57") ' Returns 24.
т.е Val - То число | |
|
| |
|
|
|
| Tree_Add, это процедура? Покажите ее код.
Где объявлен и где заполняется массив Ar ? | |
|
| |
|
66 Кб. |
|
| Вот так оно выглядит:
Private Function Tree_Add(ParamArray Ar())
Dim po As DAO.Recordset
Dim op As DAO.Recordset
Dim det As DAO.Recordset
Dim dd_1 As DAO.Recordset
Dim dbs As Database
Set dbs = CurrentDb
' еще одна глубина дерева
Set det = dbs.OpenRecordset("select naimen.tip,naimen.naimen, detalirovka.* " & _
" from detalirovka INNER JOIN Naimen ON detalirovka.naimen=naimen.kod_n " & _
" where naimen_uzel=" & Ar(0)) 'po!Naimen_Uzel)
......
|
и на рисунке виден отладчик | |
|
| |
|
|
|
| Строка-число это же видно.
AR(0),AR(2) - long
AR(1)-string
вместо val можно Clng(), например. | |
|
| |
|
56 Кб. |
|
| так передаем же Sring - а получаем Long
массив zl() - передаем
zl = Split(Node.Tag, ";")
Ar() - получаем, | |
|
| |
|
|
|
| Дык. zl-string-и
см. колонку Type.
ф в ar передаешь c помощью val.
Нет?
В чем проблема-то?
Какого типа д.б. параметры для дерева: число, строка, число?
Как передашь, так и получишь. | |
|
| |
|
|
|
|
- почему при передачи строки получаем ХЗЧ???
|
не ХЗЧ, а строки. | |
|
| |
|
57 Кб. |
|
| в том и дело что не понятно
1. массив сплитом получаем Sring
2. передаем Sring
3. получаем Long
дописал Dim zl as String - нифига передает лонгом.
дописал вот такое извращение
Tree_Add str(Val(zl(1))), Node.Key, zl(2)
заработало но надо дописывать Trim()
см. рис.
короче хрень какая-то | |
|
| |
|
|
|
| так надо, чтобы все были строки?
ParamArray - м.б. только вариант, а он берет по первому присвоению.
Может не заморачиваться с парам? а передать три строки? | |
|
| |
|
|
|
| ИМХО, здесь какой-то конфликт между ParamArray (динамический массив типа Variant) и передаваемыми аргументу элементами динамического массива типа Variant (String), расположенного в переменной типа Variant (Во, завернул! ).
Если процедуре передать непосредственно строковые значения или вместо Val() использовать CStr(), будет работать? | |
|
| |
|
69 Кб. |
|
| вот сделал передачу несколькими способами одного и тагожэ. | |
|
| |
|
|
|
| В вашем последнем примере ни один из аргументов не передается в процедуру непосредственно как элемент массива. Т.к. в ParamArray значения переменных передаются по ссылке, похоже что ваш Private массив внутри процедуры недоступен/не виден, отсюда и "Out of context". | |
|
| |
|
|
|
| описал массив как
Public zl() as String
все заработало.
получается что:
если писать
имя_функции Zl(1) - значение не передается
а если
переменная=Zl(1)
имя_функции переменная - значение нормально передается
получается значение переменной видно по ссылки а значение элемента массива нет?
п.с. хотя в данном случае функции находятся в теле одной формы. | |
|
| |
|
|
|
| Вот проверил, всё работает. Проверьте у себя. У вас какой Акс?
Sub aaa()
Dim arr
arr = Split("111;222", ";")
Call bbb(arr(0), arr(1))
Call ccc(arr)
End Sub
Sub bbb(ParamArray arg())
MsgBox arg(0)
End Sub
Sub ccc(arg)
MsgBox arg(1)
End Sub
| Может засада в Node.Key? Может его значение нужно присвоить строковой переменной, а затем ее передавать процедуре? | |
|
| |
|
102 Кб. |
|
| я думаю что засада в Private функциях формы между которыми кидались переменные.
вот что получается если просто создать массив и его передать и передать его элементы.
видно что элементы массива получают значение (ссылка куда-то?) со смещением 6, для каждого последующего элемента. | |
|
| |
|
|
|
| Node.Key - строка и передавать надо строки и не заморачиваться. | |
|
| |
|
|
|
| как вариант
но вопрос - почему так происходит, чем провинились элементы массива перед MS ??? | |
|
| |
|
|
|
| Это уже вопрос теоретический. Ответ уходит глубинами во времена мамонтов и ледникового периода. | |
|
| |
|
|
|
| Но у меня и такой вариант показывает нормальные значения в окне Locals
Sub aaa()
Dim test_
test_ = Array("1", 2, 23, "test")
Call bbb(test_, test_(0), test_(1), test_(2), test_(3))
End Sub
Sub bbb(ParamArray arg())
MsgBox arg(1)
End Sub
| Где у вас объявляется test_? Если нигде, то это значит, что у вас отключено обязательное объявление переменных (это плохо!) и test_ создается на лету при первом присвоении. Может в этом засада?
видно что элементы массива получают значение (ссылка куда-то?) со смещением 6
|
Кстати, не 6, а 16 - это размер переменной Variant, т.е. элемента массива, которые в памяти идут подряд, отсюда и смещение.
Т.е. у вас в окне Locals почему-то отображаются не значения элементов, а их адреса. Так, если бы применялась функция VarPtr.
Еще раз, какой у вас Акс? | |
|
| |
|
|
|
|
| У меня и с функцией каринка та же (А2003).
У вас оъявление test_ закомментировано. С ним и без него одинаково?
Ну да бог с ним... | |
|
| |
|
|
|
| Я тоже проверил. Что Sub, что Function - передает string
Option Compare Database
Option Explicit
Public Sub SubParamarray(ParamArray a())
Dim i@
For i = 0 To UBound(a)
Debug.Print "" & a(i)
Next
End Sub
Public Function FunParamArray(ParamArray a())
Dim i@
For i = 0 To UBound(a)
Debug.Print "" & a(i)
Next
End Function
Public Sub tstsparamarray()
Dim s$
Dim vmas
s = "1;Проверка;3"
vmas = Split(s, ";")
SubParamarray vmas(0), vmas(1), vmas(2)
FunParamArray vmas(0), vmas(1), vmas(2)
End Sub
|
| |
|
| |
|
|
|
| а теперь воткни эти функции в тело формы и повесь на нажатие кнопки
SubParamarray vmas(0), vmas(1), vmas(2)
FunParamArray vmas(0), vmas(1), vmas(2) | |
|
| |
|
15 Кб. |
|
| УГУ
Проверил.
Private Sub Кнопка0_Click()
Dim s$
Dim vmas
s = "1;" & Me.Name & ";" & "3"
vmas = Split(s, ";")
SubParamarray vmas(0), vmas(1), vmas(2)
FunParamArray vmas(0), vmas(1), vmas(2)
End Sub
Все стринг.
Но, если напишем, SubParamarray vmas(0), vmas(1), CLng(vmas(2))
получим стринг, стринг, лонг
Т.е. что передаем, то и имеем. | |
|
| |
|
|
|
|
|
| О конца света не отошло еще | |
|
| |
|
|