|
|
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
Код: 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. Проблама в том, что заполняется только контролы из a1(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 12:37 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
Неужели это должно работать и проблема не в коде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 15:40 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
странный ты.. ф=1 ы=2 ы=ы+1 А пАЧяму ф осталось равно адын? Людииииииииииии! ПаМаГитЕЕЕЕЕЕ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 15:50 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
К сожалению, не понял, что есть в моем случае "ф"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 16:00 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
Не рекомендуется для массива использовать цикл For Each Next . Работает медленнее, и (по Гетсу) - только для чтения. Попробуйте: For i = LBound(V) To UBound(V) V2=V(i) For j =LBound(V2) To UBound(V2) ... Next J Next i Да и вместо: Dim b() As Variant b = Array(a1, a2) Я бы сделал: Dim b(0 To 1) As Variant b(0) = a1 b(1) = a2 Но это - дело вкуса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 16:10 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
>что есть в моем случае "ф"? Да все. Где у тебя ctlArray() обрабатывется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 16:37 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
А разве этого не достаточно ? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 16:39 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
Не поленился проверить :)) Dim a1() As Variant, a2() As Variant, b() As Variant Dim v As Variant, v2 As Variant a1 = Array(Me.Text0,Me.Text1) a2 = Array(Me.Text2,Me.Text3) b = Array(a1, a2) For Each v In b For Each v2 In v v2.Value = "Получилось!" '- РАБОТАЕТ ' v2 = "Получилось!" '- НЕ РАБОТАЕТ MsgBox v2 Next v2 Next v V2 содержит объект. В вашем случае объект(Control) заменяется значением из поля, а в самом Control-е ничего не изменяется. Мало того - его уже нет в массиве. P.S. Но получается, что моя предыдущая посылка насчет ReadOnly не верна! Или Гетс не прав, или я не прав. ?! Прийду дамой - перечитаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 16:53 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
V2 содержит объект. В вашем случае объект(Control) заменяется значением из поля, а в самом Control-е ничего не изменяется. Мало того - его уже нет в массиве Ничего не понял... :( Что значит в самом контроле ничего не изменяется? Все изменяется вроде. Проблема в том, что не изменяются значения контролов, содержащихся в массиве "a2", а с массивом "а1" все в порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 16:59 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
2Анатолий (Киев ) У Vsevolod V массив двойной размерности. И нигде вторая размерность не учитывается. Если в цикле добавить переход по размерностям, то м.б. что-то и получиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 17:43 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
2 Всеволод. Объясни мне пожалуйста смысл переменной n . Нужна ли эта переменная в данном участке кода, и если нужна почему нет ее объявления? Нарисуй трассировочную таблицу и с ее помощью попробуй найти ошибку. Да шучу я, хотя ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. PS Для откладки предназначены Debug.Print и Debug.Assert. Если уже совсем сложно то можно и запустить в пошаговом режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 17:49 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
2 Анатолий Анатолий (Киев )>Не рекомендуется для массива использовать цикл For Each Next. Работает медленнее, и (по Гетсу) - только для чтения. Как раз этот способ предоставляет универсальный механизм итерации цикла. И еще не ясно, будет бытрее получение элемента по индексу, а если еще в теле цикла происходит несколько обращений к элементу, то тут и спорить нечего. Насчет только для чтения, то тут вы ошибаетесь, Гетц такого сказать не мог. 2 Senin Viktor Senin Viktor>У Vsevolod V массив двойной размерности. И нигде вторая размерность не учитывается. Senin Viktor>Если в цикле добавить переход по размерностям, то м.б. что-то и получиться. Код: plaintext 1. 2. 3. 4. 5. Тут никакой ошибки нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 18:07 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
Объясни мне пожалуйста смысл переменной n. А что тут может быть не понятного? Переменная n есть индекс поля, т.е. значение поля подставляется в контрол. где n = 1? Код: plaintext 1. 2. 3. 4. n равно 1 при первом входе в цикл, а далее уже увеличивается. Нужна ли эта переменная в данном участке кода А где же еще??? почему нет ее объявления? толку нет ее объявлять. Нарисуй трассировочную таблицу Что это такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 18:09 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
Очень странно, что не работает, так как эта часть кода отрабатывает нормально (так как контролы из массива "а1" заполняются верно): Код: plaintext 1. 2. 3. 4. 5. Значит проблема возникает здесь: Код: plaintext 1. Но что тут может быть не так??? Соответствующие записи в рекордсете есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 18:23 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
2 Всевололд. Всеволод>Переменная n есть индекс поля, т.е. значение поля подставляется в контрол. ОК, теперь понятно. SA>почему нет ее объявления? Всеволод>толку нет ее объявлять. Толк в объявлении есть, он позволяет избежать "скрытых" ошибок и обыкновенных опечаток c опцией Option Explicit. SA>где n = 1? Хорошо объясняю на пальцах Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. После первой итерации внешнего цикла, чему у тебя равна переменная n? Поставь Breakpoint в строке (1) и посмотри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 18:24 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
ААА!!! Точно! Сообразил :) "Она" равна 15, а полей в рекордсете 14. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 18:27 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
Несколько замечаний... Shkurenko Alexander мне отвечал: Анатолий (Киев )>Не рекомендуется для массива использовать цикл For Each Next. Работает медленнее, и (по Гетсу) - только для чтения. Как раз этот способ предоставляет универсальный механизм итерации цикла. И еще не ясно, будет бытрее получение элемента по индексу, а если еще в теле цикла происходит несколько обращений к элементу, то тут и спорить нечего. Насчет только для чтения, то тут вы ошибаетесь, Гетц такого сказать не мог. Цитирую: Гетс, Джилберт "Программирование в Microsoft Office", 1999, BHV, Киев, стр.198 "Примечание: Для просмотра элементов массива можно также воспользоваться конструкцией For Each...Next, однако делать это не рекомендуется. В данном случае процесс будет протекать медленнее, чем при использовании конструкции For...Next, и, кроме того, конструкцию For Each...Next нельзя применять для записи значений в массив - она может использоваться только для выборки данных." Насчет "только для выборки", то здесь всё ясно. Чтобы изменить значение в массиве, надо знать его индекс, а он-то и не известен. В обсуждаемом примере значение присваивается переменной, в которую извлечен элемент массива, верней объекту в этой переменной. Но тут я тоже не понимаю, почему у автора это работает. Вот простенький тест с изменением несвязанного TrxtBox-a в форме: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Обратите внимание, что во всех случаях VarType(v)= 8 - это vbString. Теперь о скорострельности For Each...Next для массива. Вот тест: Код: 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. На 100 млн. итераций, разница - более 8 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2003, 13:55 |
|
||
|
Массив в массиве
|
|||
|---|---|---|---|
|
#18+
А>Несколько замечаний... А>Shkurenko Alexander мне отвечал: [пропущено] SA>>Насчет только для чтения, то тут вы ошибаетесь, Гетц такого сказать не мог. Цитирую: А>Гетс, Джилберт "Программирование в Microsoft Office", 1999, BHV, Киев, стр.198 "Примечание: Для просмотра элементов массива можно также воспользоваться конструкцией For Each...Next, однако делать это не рекомендуется. В данном случае процесс будет протекать медленнее, чем при использовании конструкции For...Next, и, кроме того, конструкцию For Each...Next нельзя применять для записи значений в массив - она может использоваться только для выборки данных." Приношу свои извинения, я оказался неправ. Действительно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. На выходе получим: 1 1 1 А>Насчет "только для выборки", то здесь всё ясно. Чтобы изменить значение в массиве, надо знать его индекс, а он-то и не известен. А>В обсуждаемом примере значение присваивается переменной, в которую извлечен элемент массива, верней объекту в этой переменной. Но тут я тоже не понимаю, почему у автора это работает. Дело в том, что при использовании цикла For Each elem In ... в elem помещается копия элемента массива, но за несколькими исключениями. Одним из них и является объект, который нельзя полностью упаковать в Variant, поэтому они передаются по ссылке, в результате чего у автора это работает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Довольно трудноуловимая ошибка, связанная так называемыми "свойствами по умолчанию" строку (1), VBA трактует так: переменной v присвоить строковой литерал "!!" а не как хотелось тебе: свойству по умолчанию объекта, содержащегося в переменной v присвоить строковой литерал "!!". Как говориться, почувствуйте разницу. Вообще эти свойства по умолчанию от лукавого. Ни к чему хорошему они привести не могут. То же самое, можно сказать и про все сокращенные записи вроде этой recordset("name_field"). На эту тему вообще нужно отдельно говорить. Кстати, посмотри здесь , многое прояснится. А>Теперь о скорострельности For Each...Next для массива. Вот тест: [пропущено] Не совсем корректный тест. Вот этот будет правильнее. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Который подтверждает сказанное мною: а если еще в теле цикла происходит несколько обращений к элементу, то тут и спорить нечего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2003, 16:41 |
|
||
|
|

start [/forum/topic.php?fid=45&fpage=1709&tid=1677778]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 393ms |

| 0 / 0 |
