Динамическое создание структуры RECORD

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Динамическое создание структуры RECORD

Сообщение bloodlines »

Собственно проблема. Из спец. файла производится последовательное чтение с помощью структуры типа PACKED RECORD, которую приходиться чётко описывать в разделе TYPE. Но можно ли создать такую структуру динамически, т.е. в зависимости от определённых условий добавить необходимые поля. Единственное, что пока приходит на ум это TCollection. Вообще использую PACKED RECORD для чтения данных из *.BTR файла. Но для каждого нового файла приходиться заново заводить своё описание PACKED RECORD, а хотелось бы получить нечто в стиле TDBF. Покопавшись в исходниках последнего понял, что используется TCollection. Собственно, можно ли както модифицировать структуры PACKED RECORD или использовать TCollection для чтения данных из файла?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

record и TCollection cовершенно разные вещи. Это всёравно, что сравнивать лопату с ведром и спрашивать "как можно сделать так чтобы в лопате носить воду" :wink:
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

record и TCollection cовершенно разные вещи

Полностью согласен. Но суть вопроса не в совмещении этих двух типов. TCollection упомянул в связи с TDBF.
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

TMemDataSet?
Logo
постоялец
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Сообщение Logo »

Mr.Smart писал(а):record и TCollection cовершенно разные вещи. Это всёравно, что сравнивать лопату с ведром и спрашивать "как можно сделать так чтобы в лопате носить воду" :wink:

Ну, при неизбежности, можно кувалдой сделать в лопате углубление :D
Понравилось сравнение, спасибо!

Добавлено спустя 7 минут 53 секунды:
Record, это в реале последовательный, неразрывный участок памяти, в котором располагаются описанные переменные. Динамически это можно сделать, если единый пул загрузить в память, а потом через определенные промежутки (смещения), участки памяти приводить к нужным типам. Структуру такого пула, нужно также хранить и прочитывать вместе с пулом, чтобы знать что за чем следует и какие данные. Другого метода я не знаю. Сама Record, это лишь указание компилятору, по какому адресу находятся данные и что с ними можно делать.
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

TMemDataSet

А можно немного по подробнее?
v-t-l
энтузиаст
Сообщения: 745
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Файлы с гибкой структурой? - XML, например.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

v-t-l писал(а):Файлы с гибкой структурой? - XML, например.

Нет в данном случае имеется ввиду файл базы данных *.BTR
bloodlines писал(а):
TMemDataSet

А можно немного по подробнее?

Вам в любом случае придётся парсить файл базы данных (*.BTR), а TMemDataSet это просто компонент представляющий базу в памяти в своей структуре (удобен для создания временных таблиц, которые сохранять негде не нужно!). Хотя можно подсмотреть как он хранит и предоставляет данные в память :wink:
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

TDBF тоже умеет свои таблицы в памяти хранить. Только нет механизма запросов... :)
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

Вам в любом случае придётся парсить файл базы данных (*.BTR)

Парсить их уже умею. Хватает стандартных функций из Pervasive SDK. Вообщем могу уже выполнять почти все операции с BTR файлами (кроме разве что продвинутых SQL запросов, которые знают как выполнять только сами разрабы :D ). Вся загвоздка в том, что для чтения записи и т.д. необходимо использовать структуру PACKED RECORD. Получается, что для каждой таблицы и индекса нужно заводить свою структуру. Хотелось бы создавать определение полей динамически причём в рамках самого класса (всё это дело оборачиваю в компонент для работы с BTR файлами).
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

TMemDataset позволяет динамически создать структуру с нужными типами на лету - это то, что надо.
Хотя я бы обошелся TList или связанным списком - в свое время написал самописку для чтения *.dbf файлов.

> Vadim
Речь не о данных, а о структуре файла.
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

TMemDataset позволяет динамически создать структуру с нужными типами на лету - это то, что надо.

Я конечно извиняюсь, но можно пожалуйста пример кода?
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

Можно визуально увидеть - кинете на форму TMemDataset.
И посмотрите свойство FielDefs. Создаете Field и выбираете нужный DataType.

Код: Выделить всё

MemDataset1.FieldDefs.Add(...);
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

GrayEddy писал(а):Речь не о данных, а о структуре файла.

Может быть Вы удивитесь, но я это понимаю. :)
GrayEddy писал(а):TMemDataset позволяет динамически создать структуру с нужными типами на лету - это то, что надо.

Абсолютно тоже самое можно сказать и о TDBF.
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

Абсолютно тоже самое можно сказать и о TDBF.

Согласен. Я об этом уже писал.

Спасибо! Тогда я скорее всего смогу сделать свою компоненту TSimpleBtrTable наследником TMemDataset и велосипед изобретать не надо будет (извиняюсь за оффтоп это по моему уже к Лазарю относится)... Осталось только попробовать из BTR прочитать с помощью этой структуры... :?
Ответить