Как присваивать динамически пользовательские типы массиву ?

Вопросы программирования и использования среды Lazarus.

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

Как присваивать динамически пользовательские типы массиву ?

Сообщение nic1982 » 12.10.2012 02:11:31

Есть несколько пользовательских типов, например:
Код: Выделить всё
type
  TMy1 = record
     p1 : integer;
     p2 : string;
  end;

  TMy2 = record
     p1 : dword;
     p2, p3 : string;
  end;


также есть динамический массив
Код: Выделить всё
var arr : array of T <--- вот сюда во время выполнения программы необходимо подставлять выше приведённые типы


как это сделать ?
nic1982
новенький
 
Сообщения: 48
Зарегистрирован: 17.05.2011 16:34:05

Re: Как присваивать динамически пользовательские типы массив

Сообщение SSerge » 12.10.2012 05:18:01

Код: Выделить всё
Type T=Class(TObject)
public
   constructor Create;
   begin
     inherited Create;
   end;
end;

Type TMy1=Class(T)
     p1 : integer;
     p2 : string;
end;

Type TMy2=Class(T)
     p1 : dword;
     p2, p3 : string;
end;

Var tt:array of T[0..1];

begin
   tt[0]:=TMy1.Create;
   tt[1]:=TMy2.Create;
end.


ЗЫ: я подозреваю, что вы задумали :) Поэтому особо обращаю ваше внимание на тип String в ваших TMy. Не забываем, что это указатель на смещенную структуру. Кстати, если буквально следовать вашему вопросу, то может быть и такого типа "решение":

Код: Выделить всё
type
  TMy1 = record
     p1 : integer;
     p2 : string;
  end;

  TMy2 = record
     p1 : dword;
     p2, p3 : string;
  end;

Type T=pointer;


Var tt=array[0..1] of T;
begin
   tt[0]:=new Tmy1;
   tt[1]:=new Tmy2;
end.


массив то вы получите, только это бессмысленно :)

p/s: я знаю, что синтаксис некорректный, да :) Но надеюсь, что идею донёс.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Как присваивать динамически пользовательские типы массив

Сообщение nic1982 » 12.10.2012 09:40:04

SSerge
я подозреваю, что вы задумали

Я даже могу расказать что я задумал:
мне нужно работать со справочниками, их у меня несколько уже есть, а в будущем будет еще больше
эти справочники хранятся в файлах и в программе отабражаются в StringGrid-ах
для хранения справочников я попробывал несколько способов: DBF, INI, XML но
INI предназначен для хранения настроек для чего он идиально подходит
с XML опыта работы раньше не имел такчто для меня он слишком заумный
DBF самый путний вариант из всех выше перечисленых
но тут у меня возникла идия а почему не использовать record-ы и типизированные файлы
дальше разгулялась фантазия и захотелось сделать класс который бы отвечал за чтение и запись с файла и обновление StringGrid-а
чтото типа такого:
Код: Выделить всё
TSpr=class
private
  massiv : array of T??? <--- вот для чего мне нужено динамическое присвоение типа массиву
public
  f:string; //типизированый файл
  sg:TStringGrid; //имя StringGrid-а
  function SetTypeArray/GetTypeArray; //указать/запросить тип массива
  function SetArray/GetArra; y//размер массива указать/запросить
  function add/del/edit; //добавить/удалить/отредактировать запись
  function save/load/update; //сохранить/загрузить/обновить StringGrid
end;
nic1982
новенький
 
Сообщения: 48
Зарегистрирован: 17.05.2011 16:34:05

Re: Как присваивать динамически пользовательские типы массив

Сообщение SSerge » 12.10.2012 10:37:00

nic1982 писал(а):почему не использовать record-ы и типизированные файлы


Ыыы... :D Я ж намекал, вы не поняли. :D
Потому что String=AnsiString=Pointer(StrPtrStructure)

Вам не удастся эти строки сохранить в типизированный файл без ухищрений.
Тогда уж ставьте в TMy строки как ShortString или String[32] например, хотя в отношении последних еще тоже не ясно куда занесет фантазия реализаторов кхм... в первую очередь Embarcadero Delphi, а за ним и FreePascal

Ну и у вас нет никаких способов определить в отношении record, что за ... в указателе. Если где-то не будете хранить добавочную информацию.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Как присваивать динамически пользовательские типы массив

Сообщение SAK » 12.10.2012 16:01:03

Или сразу переходить на классы(объекты) и вместо массива использовать коллекцию где уже есть встроенные механизмы добавления/удаления и т.д.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Как присваивать динамически пользовательские типы массив

Сообщение Ichthyander » 12.10.2012 17:32:43

но тут у меня возникла идия а почему не использовать record-ы и типизированные файлы
дальше разгулялась фантазия и захотелось сделать класс который бы отвечал за чтение и запись с файла и обновление StringGrid-а

В конце концов Вы поймете, что было проще почитать о какой-нить локальной СУБД, чем писать свою. А то что Вы пишите именно СУБД поймете, когда Ваш код вырастет до непомерных размеров, так как Вам захочется еще функционала и еще, захотите использовать его в других своих проектах и т.д.
В свое время прошел через это ))
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 699
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Как присваивать динамически пользовательские типы массив

Сообщение Kemet » 12.10.2012 18:32:21

ТопикСтартер и сам понимает, что его вполне бы устроил какой-нибудь TDBF или VolgaDB, но ему хочется разобраться самому, что намного интересней...
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Как присваивать динамически пользовательские типы массив

Сообщение alexey38 » 14.10.2012 14:22:03

nic1982 писал(а): почему не использовать record-ы и типизированные файлы

Собственно типизированные файлы будут считывать структуру того типа, какой указан при указании типа файла.
Если у Вас рекорды одинакового размера, то можно иметь одит тип с case внутри record. Если размеры рекордов разные, то бинарное хранение через типизированные файлы уже не будет правильно работать.
И конечно никаких String, только ShortString.

С точки зрения бинарного хранения - то вами предлагаемое решение это прошлый век, скорее технология середины 80-х и начала 90-х. Если сегодня нужны бинарные файлы - то делайте их типизированными, т.е. чтобы не только значения, но и названия и типы полей сохранялись.
Но намного проще будет использовать ini, xml, СУБД, выбор технологии в заивисмости от размера, наличия иерархии и прочего. ini - самое простое, если нужны линейные справочники без вложений (TMemIniFile). Просто, быстро и понятно.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Как присваивать динамически пользовательские типы массив

Сообщение Vapaamies » 14.10.2012 17:07:45

alexey38 писал(а):ini - самое простое, если нужны линейные справочники без вложений (TMemIniFile). Просто, быстро и понятно.

Да даже если и с вложениями. Что мешает, например, создавать секции с именами вида [Section/Subsection/Subsection]?
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Как присваивать динамически пользовательские типы массив

Сообщение alexey38 » 15.10.2012 11:06:21

Vapaamies писал(а):
alexey38 писал(а):ini - самое простое, если нужны линейные справочники без вложений (TMemIniFile). Просто, быстро и понятно.

Да даже если и с вложениями. Что мешает, например, создавать секции с именами вида [Section/Subsection/Subsection]?


Конечно можно, небольшой парсинг после вызова ReadSections - и иерархия готова. Важно использовать именно TMemIniFile (inifiles.pp), который и быстрый (с хеш-поиском) и кросс-платформенный, в отличие от IniFile из WinAPI.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru