Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2011, 14:21   #1
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию Создание типа record на основе массива

Есть переменная Config:array of TConfig:
Код:
type TConfig=record
    NameField:String[128];
    TypeField:String[20];
    SizeField:LongInt;
end;
Она загружается из файла. На основе имени поля(NameField), типа поля(TypeField) и размера поля(SizeField) надо создать новый тип. Например: Config[0].NameField:='FirstName';
Config[0].TypeField:='String';
Config[0].SizeField:=60;
Config[1].NameField:='LastName';
Config[1].TypeField:='String';
Config[1].SizeField:=60;
Надо создать новый тип автоматически:
Код:
type TNew=record
    FirstName:String[60];
    LastName:String[60];
end;
Возможно ли это? Или можно как-нибудь по другому решить данный вопрос?
qwertyk вне форума Ответить с цитированием
Старый 10.08.2011, 15:05   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) есть очень сильно подозрение на ситуацию, описанную в Сага о X, Y и Z

Сага о X, Y и Z...
...или о том, как же важно правильно формулировать, чего мы хотим.


2) если Вам действительно нужно создавать типизированные файлы "на лету" (т.е. в runtime). Тогда никаких type xxxx = record, никаких file of xxxx.
Любой типизированный файл - это просто напросто бинарный файл, состоящий из кусочков заданной структуры. Т.к. Вы эту структуру хотите формировать динамически, то TFileStream поможет Вам это сделать - записывайте информацию нужными порциями и всё.

НО!!! (если Вам это всё реально надо), я бы рекомендовал использовать СУБД, либо формат XML, либо, на крайний случай, широко распространнёный файловый формат DBF, либо, как минимум, на самый крайнейший случай, писать структуру файла в начале самого файла.
Впрочем, Вам виднее, как Вы потом собираетесь получить доступ к записанной информации...


p.s. разумеется, в случае использования TFileStream все преимущества работы с типизированными файлами (например, в виде мгновенного перехода на любую запись по seek - теряются...)

p.p.s. надеюсь, речь не идёт о генерации PAS исходника для работы с нужной структурой?! Так тоже можно.
Только этот исходник потом компилировать прийдётся...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.08.2011, 15:12   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

можно написать программу, которая, на основе массива из TConfig создаст исходник на паскале, в котором будет описана требуемая запись. Далее этот исходник можно будет подключить к другой программе и скомпилить готовый проект. Так сказать, статический подход.

Динамически это сделать, естественно, не получится, но можно создать класс, типа:

Код:
type
  TAnyRecord = class
  public
    property Value[name: string]: Variant read getValue write setValue; default;
  end;
Ну и далее он будет как-то там хранить свои поля в списке (фактически, TStringList можно так использовать), и обращаться с ним можно будет так:

Код:
var
  R: TAnyRecord;
begin
  R := TAnyRecord.Create();
  //
  R['FirstName'] := 'фыва';
  //
  if (R['LastName'] <> 'сепулька') then
    .....
end;
Если не нравится тип Variant, можно расширить ваш класс свойствами, типа:

Код:
  property AsString[name: string]: string read getAsString write setAsString;
  property AsInteger[name: string]: Integer read getAsInt write setAsInt;
А можно не заморачиваться, а взять класс TStringList, у него есть свойства Names[] и Values[], фактически, то, что вам надо, только в виде строк. Ну а в строке можно хранить что душе угодно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с динамическими массивами типа record Олвин Общие вопросы Delphi 8 14.07.2011 01:13
создание OnClick для массива типа Button VIK_aka_TOR Помощь студентам 13 19.05.2011 16:21
Аналог типа RECORD из Oracle в MSSQL GenniY SQL, базы данных 1 23.12.2010 11:17
Создание массива объектов типа Label levandowskiy Общие вопросы C/C++ 3 21.12.2010 15:20
передача данных типа Record... Рустам Работа с сетью в Delphi 4 24.01.2010 09:51