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

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

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

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

Сообщение bloodlines » 22.09.2009 09:08:38

Собственно проблема. Из спец. файла производится последовательное чтение с помощью структуры типа PACKED RECORD, которую приходиться чётко описывать в разделе TYPE. Но можно ли создать такую структуру динамически, т.е. в зависимости от определённых условий добавить необходимые поля. Единственное, что пока приходит на ум это TCollection. Вообще использую PACKED RECORD для чтения данных из *.BTR файла. Но для каждого нового файла приходиться заново заводить своё описание PACKED RECORD, а хотелось бы получить нечто в стиле TDBF. Покопавшись в исходниках последнего понял, что используется TCollection. Собственно, можно ли както модифицировать структуры PACKED RECORD или использовать TCollection для чтения данных из файла?
Аватара пользователя
bloodlines
постоялец
 
Сообщения: 100
Зарегистрирован: 05.11.2008 11:26:19

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

Сообщение Mr.Smart » 22.09.2009 09:33:22

record и TCollection cовершенно разные вещи. Это всёравно, что сравнивать лопату с ведром и спрашивать "как можно сделать так чтобы в лопате носить воду" :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение bloodlines » 22.09.2009 09:45:59

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

Полностью согласен. Но суть вопроса не в совмещении этих двух типов. TCollection упомянул в связи с TDBF.
Аватара пользователя
bloodlines
постоялец
 
Сообщения: 100
Зарегистрирован: 05.11.2008 11:26:19

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

Сообщение GrayEddy » 22.09.2009 18:53:02

TMemDataSet?
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

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

Сообщение Logo » 22.09.2009 20:19:08

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

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

Добавлено спустя 7 минут 53 секунды:
Record, это в реале последовательный, неразрывный участок памяти, в котором располагаются описанные переменные. Динамически это можно сделать, если единый пул загрузить в память, а потом через определенные промежутки (смещения), участки памяти приводить к нужным типам. Структуру такого пула, нужно также хранить и прочитывать вместе с пулом, чтобы знать что за чем следует и какие данные. Другого метода я не знаю. Сама Record, это лишь указание компилятору, по какому адресу находятся данные и что с ними можно делать.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

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

Сообщение bloodlines » 23.09.2009 09:06:48

TMemDataSet

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

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

Сообщение v-t-l » 23.09.2009 09:18:08

Файлы с гибкой структурой? - XML, например.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Mr.Smart » 23.09.2009 09:39:08

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

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

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

Вам в любом случае придётся парсить файл базы данных (*.BTR), а TMemDataSet это просто компонент представляющий базу в памяти в своей структуре (удобен для создания временных таблиц, которые сохранять негде не нужно!). Хотя можно подсмотреть как он хранит и предоставляет данные в память :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Vadim » 23.09.2009 09:45:03

TDBF тоже умеет свои таблицы в памяти хранить. Только нет механизма запросов... :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение bloodlines » 23.09.2009 09:49:57

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

Парсить их уже умею. Хватает стандартных функций из Pervasive SDK. Вообщем могу уже выполнять почти все операции с BTR файлами (кроме разве что продвинутых SQL запросов, которые знают как выполнять только сами разрабы :D ). Вся загвоздка в том, что для чтения записи и т.д. необходимо использовать структуру PACKED RECORD. Получается, что для каждой таблицы и индекса нужно заводить свою структуру. Хотелось бы создавать определение полей динамически причём в рамках самого класса (всё это дело оборачиваю в компонент для работы с BTR файлами).
Аватара пользователя
bloodlines
постоялец
 
Сообщения: 100
Зарегистрирован: 05.11.2008 11:26:19

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

Сообщение GrayEddy » 23.09.2009 09:50:17

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

> Vadim
Речь не о данных, а о структуре файла.
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

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

Сообщение bloodlines » 23.09.2009 09:51:35

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

Я конечно извиняюсь, но можно пожалуйста пример кода?
Аватара пользователя
bloodlines
постоялец
 
Сообщения: 100
Зарегистрирован: 05.11.2008 11:26:19

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

Сообщение GrayEddy » 23.09.2009 09:56:52

Можно визуально увидеть - кинете на форму TMemDataset.
И посмотрите свойство FielDefs. Создаете Field и выбираете нужный DataType.
Код: Выделить всё
MemDataset1.FieldDefs.Add(...);
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

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

Сообщение Vadim » 23.09.2009 09:59:25

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

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

Абсолютно тоже самое можно сказать и о TDBF.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

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

Сообщение bloodlines » 23.09.2009 10:06:55

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

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

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

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru