Т.е. первый элемент массива у нас химический элемент поэтому заполнем его по типу HimElem из объединения, второй элемент животное - по типу Animal из объединения. Возможна ли такая структура в VBA?
[vba]
Код
type HimElemType sumbol as string himnumber as integer mass as integer end type
type AnimalType group as string class as string end type
type MyType name as string number as integer
'объединение HimElem as HimElemType Animal as AnimalType 'end объединение
end type
public MyArray(1 to 5) as MyType
[/vba]
В коде имеем пользовательский тип MyType содержащий "объединение" и массив MyArray из 5 элементов. Нужно заполнить массив таки образом:
Т.е. первый элемент массива у нас химический элемент поэтому заполнем его по типу HimElem из объединения, второй элемент животное - по типу Animal из объединения. Возможна ли такая структура в VBA?Афокл
Похоже, но вопрос в другом, есть ли такое механизм в VBA. Т.е. при занесении даных типа MyType сначала определяется что за данные заносим хим.элемент или животное, и в зависимости от этого заполняем или MyArray(i).HimElem. или MyArray(i).Animal. Можно включить в тип MyType оба типа (и HimElem и Animal) и просто заполнять один из них, но если массив большой это может занять продолжительное время и память, что не есть хорошо.
Похоже, но вопрос в другом, есть ли такое механизм в VBA. Т.е. при занесении даных типа MyType сначала определяется что за данные заносим хим.элемент или животное, и в зависимости от этого заполняем или MyArray(i).HimElem. или MyArray(i).Animal. Можно включить в тип MyType оба типа (и HimElem и Animal) и просто заполнять один из них, но если массив большой это может занять продолжительное время и память, что не есть хорошо.Афокл
А зачем это? Может достаточно двух словарей - один для металлов, другой для коров? А в словарь уже можно в item положить пользовательский массивчик. Или просто массив, или строку с разделителями.
По ключу ищем в словарях свои данные. Кажется в итоге вся схема будет проще.
А зачем это? Может достаточно двух словарей - один для металлов, другой для коров? А в словарь уже можно в item положить пользовательский массивчик. Или просто массив, или строку с разделителями.
По ключу ищем в словарях свои данные. Кажется в итоге вся схема будет проще.Hugo
Можно использовать не словарь, а просто коллекцию. Или массив (с именами-номерами и указанием на тип элемента в коллекции) + коллекцию (с элементами нужных типов). Естественно, пользовательские типы придётся оформить в виде классов. В принципе, можно и просто коллекцией обойтись - только придется воткнуть "обшие" поля в каждый класс-тип.
Можно использовать не словарь, а просто коллекцию. Или массив (с именами-номерами и указанием на тип элемента в коллекции) + коллекцию (с элементами нужных типов). Естественно, пользовательские типы придётся оформить в виде классов. В принципе, можно и просто коллекцией обойтись - только придется воткнуть "обшие" поля в каждый класс-тип.AndreTM
Если я правильно понял вложенный пример, на выходе мы имеем массив состоящий из Имени, Номера, и Номера Коллекции. Номер Коллекции несет в себе связь между массивом и коллекцией. Т.е. если мне нужно достать из массива 3 элемент, я проверяю его Номер Коллекции и, в зависимости от него, получаю либо Группу\Класс, либо Символ\Химномер\Массу. При этом "вес" коллекции будет складываться MyCol(1).Symbol + MyCol(1).Himnumber + MyCol(1).Mass = 16 byte (к примеру), MyCol(2).Group + MyCol(2).Class = 8 byte (к примеру) и т.д., в итоге сумма "веса" всех 5 элементов коллекции получится = 16+8+16+8+16=64 byte. Верно?
Спасибо за наглядный пример и хороший ответ!
Если я правильно понял вложенный пример, на выходе мы имеем массив состоящий из Имени, Номера, и Номера Коллекции. Номер Коллекции несет в себе связь между массивом и коллекцией. Т.е. если мне нужно достать из массива 3 элемент, я проверяю его Номер Коллекции и, в зависимости от него, получаю либо Группу\Класс, либо Символ\Химномер\Массу. При этом "вес" коллекции будет складываться MyCol(1).Symbol + MyCol(1).Himnumber + MyCol(1).Mass = 16 byte (к примеру), MyCol(2).Group + MyCol(2).Class = 8 byte (к примеру) и т.д., в итоге сумма "веса" всех 5 элементов коллекции получится = 16+8+16+8+16=64 byte. Верно?
На самом деле, в примере немного не так - там "ключ" в коллекции соответствует "индексу" в массиве, а "Item" - это некий код, определяющий тип элемента коллекции (химэлемент, животное). Но то, что описываете вы - ещё более правильный подход (т.е. в массиве мы должны сохранить указатель на элемент коллекции). Но при этом не забыть где-то (либо в массиве, либо в типе-классе) сохранить свойство, указывающее на тип - откуда иначе мы узнаем, какие именно поля-свойства обрабатывать у элемента коллекции? Например, можно завести константу (с одинаковым именем) в каждом из классов...
А, да, и ещё там была небольшая, но принципиальная ошибка в коде - вот новый исправленный пример, со всем вышеописанным:
На самом деле, в примере немного не так - там "ключ" в коллекции соответствует "индексу" в массиве, а "Item" - это некий код, определяющий тип элемента коллекции (химэлемент, животное). Но то, что описываете вы - ещё более правильный подход (т.е. в массиве мы должны сохранить указатель на элемент коллекции). Но при этом не забыть где-то (либо в массиве, либо в типе-классе) сохранить свойство, указывающее на тип - откуда иначе мы узнаем, какие именно поля-свойства обрабатывать у элемента коллекции? Например, можно завести константу (с одинаковым именем) в каждом из классов...
А, да, и ещё там была небольшая, но принципиальная ошибка в коде - вот новый исправленный пример, со всем вышеописанным:AndreTM
SM, ага, я примерно так и хотел сначала сделать... Только я вот в VBA уже и подзабыл , как с указателями правильно работать... ибо "большинством" это так мало востребовано...
SM, ага, я примерно так и хотел сначала сделать... Только я вот в VBA уже и подзабыл , как с указателями правильно работать... ибо "большинством" это так мало востребовано...AndreTM
Насчёт именно гречневой - я могу и поговорить. Ибо предпочитаю запарить, с кориандром и тмином :) Что же касается указателей - ну не люблю я рыться в MSDN и всём прочем при каждом чихе (всё же Help VBA - это не BOL MSSQL...) ... насколько проще был Forth
Насчёт именно гречневой - я могу и поговорить. Ибо предпочитаю запарить, с кориандром и тмином :) Что же касается указателей - ну не люблю я рыться в MSDN и всём прочем при каждом чихе (всё же Help VBA - это не BOL MSSQL...) ... насколько проще был Forth AndreTM