Автор вопроса: Dark Engine | Web-сайт:www.wentas.2bb.ru | ICQ: 343191665
Честно, мне очень стыдно, вопрос по матчасти, но раньше не сталкивался, а очень нужно. VB6
Необходимо обойти все поля структуры, количество которых заранее не известно, и получить строки с именами этих полей. Чтобы максимально конкретизировать вопрос, приведу НЕРАБОЧИЙ кусок кода, который очень прошу прокомментировать на момент возможности исправления и запуска:
Private Type UserType
Field1 As Integer
Field2 As Integer
...
Fieldn As Integer
End Type
Sub Process()
Dim A As UserType
B = Convert(A)
Debug.Print B
End Sub
Function Convert(Struct)
Result = ""
For Each Element In Struct
Result = Result + VarName(Element)
NEXT
Convert = Result
End Function
Итак, вопрос один в том, как можно обойти структуру (конструкция For Each не отрабатывает)? Вопрос второй, как получить имя поля при обходе (функции VarName, разумеется, не существует)?
Все очень просто. Структуры являются строками таблиц. Под структуру необходимо создать таблицу в БД, сделать отбор по определенным критериям при выборке из этой таблицы, но при этом, какая именно структура передается для конструирования запроса - заранее неизвестно. Как-то так. Хотя признаю, что саму идею обхода структур, равно как и получения имен полей, я попытался использовать исходя из схожести синтаксиса VB6 и 1С (в последнем такой номер прокатывает, причем там каждое поле имеет "ключ" (строка с именем поля) и "значение".
Mikle пишет:
Можно вместо структур использовать классы
Ммм, можно конечно. Идея неплоха, но возникает вопрос, а не будет ли программа тормозить или неистово жрать ресурсы при использовании нескольких тысяч классовых объектов? Столько же структур вроде не перегружают проц и оперативу, но класс (насколько я знаю) ест ресурсов ощутимо больше структуры.
ключ-значение - это Collection в VB. Кроме того, существует объект Dictionary в библиотеке Microsoft Scripting Runtime. Это то же, что и коллекция, но шустрее, и умеет выдавать список всех ключей. Вот так:
Dim dic AsNew Dictionary
dic.Add "Field1", "deadbeef"
dic.Add "Field8", "foodpr0n"
Dim key AsVariant
ForEach key In dic.Keys
Debug.Print key
Next key
p.s. я в аудиоплеере описывал каждый трек в виде объекта, на нескольких тысячах программа совершенно не напрягалась конечно обращение к мемберам класса происходит медленее, чем к простым структурам.
не будет ли программа тормозить или неистово жрать ресурсы при использовании нескольких тысяч классовых объектов
По сравнению со структурами - будет. Если это критично - можно в каждую структуру добавить одно лишнее поле ID, и заранее подготовить массив с атрибутами структур, где индекс соответствует ID.
Winand пишет:
ключ-значение - это Collection в VB. Кроме того, существует объект Dictionary в библиотеке Microsoft Scripting Runtime. Это то же, что и коллекция, но шустрее, и умеет выдавать список всех ключей.
Коллекция, значит... это надо учесть. Спасибо большое! Буду разбираться. С коллекцией будет обращаться даже проще, чем со структурой и массивом, как предложил Mikle
Mikle пишет:
По сравнению со структурами - будет. Если это критично - можно в каждую структуру добавить одно лишнее поле ID, и заранее подготовить массив с атрибутами структур, где индекс соответствует ID.
А сами значения массива соответствуют именам полей? Мысль интересная, но, боюсь, с тем же успехом запросы составлять можно было бы и просто вручную по номерам полей (массив-то забивается вручную, иного хода не вижу в этом случае... а для автоматического забивания опять же нужно что-то вроде предложенных Winand'ом коллекций) и при программировании просто ставить жесткое соответствие. Наверное, не то решение, которое мне подходит, ведь я пытаюсь оптимизировать систему без потери скорости работы. Сейчас код загроможден запросами. Конструирование много времени не будет занимать, а если перевести систему на возможность динамического конструирования запросов - функционал программы может быть легко расширен без добавления новых запросов. Вот это и является моей задачей.
Mikle пишет:
Коллекции работают значительно медленнее структур.
Словари работают быстрее коллекций по словам Winand'а. Попробую их подтянуть. Но вот вопрос, если выбирать между коллекцией и классом, что быстрее работает?
Ну да. При шлифовке залью старую базу, там это будет заметно.
Winand пишет:
проще всего сделать Словарём.
Попробую и так и так. По итогам обработки больших объемов уже решу.
Winand пишет:
Вот ещё такой вариант
Думал уже об этом. Но есть сильный недочет к таком методе. Дело в том, что в рекорде поля идут разных типов. И фиг с ними, с числовыми, они худо-бедно с Variant совместимы. А что делать с датами и строками?
Winand, видимо, из QB... с этим типом не экспериментировал, а может он явно больше. По поводу совместимости уже проверил, действительно даты и строки ест спокойно. Пардон, некоторые привычки еще c прошлого века утянул :D