Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли поменять тип записи во время исполнения программы [D6, WinXP]


AlexanderVas ©   (2005-02-24 19:34:00) 

У меня несколько типов записей у которых есть одинаковые поля.
Я хочу в начале программы это описать, а далее по одной схеме.
Как это победить?


alexandervas   (2005-02-25 17:47:00) [1]

Спасибо reonid за конкретный ответ! ЩА опробую.


reonid   (2005-02-25 15:44:00) [2]

Можно придумать что-то вроде адаптеров,

type
 // интерфейсы используются только для управления
 // временем жизни объекта.
 // возможны другие решения - в зависимости от того,
 // как ты собираешься использовать адаптеры  
 // Напр., если в каждый момент времени существует только один
 // адаптер, то можно было бы обойтись синглтоном и тд

 IRecAdapter = interface
 ['{0EFC0D05-75A0-40DB-B1D5-1C0DF45C1AE2}']
   function Count: Integer;
   // общий интерфейс для твоих рекордов
 end;

 TRec1_Adapter = class(TInterfacedObject, IRecAdapter)
 private
   FRec: PRec1;
 public
   constructor Create(P: PRec1);
   function Count: Integer;
 end;

function RecAdapter(P: PRec1): IRecAdapter; overload;
begin
 Result := TRec1_Adapter.Create(P);
end;

function RecAdapter(P: PRec2): IRecAdapter; overload;
begin
 Result := TRec2_Adapter.Create(P);
end;

//------------------------------


Digitman   (2005-02-25 13:44:00) [3]


> alexandervas ©   (25.02.05 12:12) [10]
> В том-то и дело, что они имеют разные смещения от начал
> записей


тогда мне остается только посочувствовать тебе


Набережных С.   (2005-02-25 13:40:00) [4]


> alexandervas ©   (25.02.05 12:12) [10]

Ну а чем тебя не устраивает Юрий Зотов ©   (24.02.05 20:31)[4]с полем - идентификатором типа записи?


alexandervas   (2005-02-25 12:12:00) [5]

В том-то и дело, что они имеют разные смещения от начал записей.


Digitman   (2005-02-25 11:58:00) [6]


> alexandervas ©   (25.02.05 10:58) [8]


если записи разных типов имеют один и тот же packed-признак, и если интересующие тебя "одинаковые" поля в этих записях разных типов имеют одни и те же смещения отн-но начал этих записей, то весь этот выпендреж попросту лишний - достаточно объявить свою запись с тем же packed-признаком, где те самые поля разместить по тем же смещениям, тогда все что потребуется - это рассматривать адрес некоей произвольной записи как адрес твоей записи

например,

TRec1 = record
size: sometype1;
count: sometype2;
... //прочие поля
end;

TRec2 = record
size: sometype1;
count: sometype2;
... //прочие поля
end;

PRecWrapper = ^TRecWrapper;
TRecWrapper = record
size: sometype1;
count: sometype2;
otherfields: record end;
end;

var
pRW: PRecWrapper;
..

pRW := @TRec 1;
pRW.size := ...;
... := pRW.count;

pRW := @TRec 2;
pRW.size := ...;
... := pRW.count;


alexandervas   (2005-02-25 10:58:00) [7]

Я понимаю, что изменить тип нельзя.
У меня вот какая ситуация -
есть чужие типы записей, которые я поменять не могу
TRec1 = record
...
end;
TRec2 = record
...
end;

В своей программе я хочу сделать некую ссылку на один из типов.
Что-то вроде
if ... then
 Ref := TRec1
else
 Ref := TRec2;

(вот этот кусочек мне и интересен)
а дальше уже использовать не типизированные указатели
 Ref(P)^.size := ...;
 ... := Ref(P)^.count;


GLFox   (2005-02-24 21:55:00) [8]

Sorry... вместо PRec1(@P1)^.iVar1:=0должно быть PRec1(P1)^.iVar1:=0;


GLFox   (2005-02-24 21:51:00) [9]

Обращайся через указатели

type
 TRec1=record
   iVar1: Integer;
 end;
 PRec1=^TRec1;
 TRec2=record
   iVar1, iVar2: Integer;
 end;

{...}

var
 R2: TRec2;
 P1: Pointer;

{... А где-то в коде ...}
 P1:=@R2;
 PRec1(@P1)^.iVar1:=0;


Anatoly Podgoretsky   (2005-02-24 21:44:00) [10]

Тип поменять нельзя, это информация для компилятора, а не рантайм.


Юрий Зотов   (2005-02-24 20:31:00) [11]

Может быть, лучше использовать записи с вариантными полями?


Просто Джо   (2005-02-24 20:26:00) [12]

Реализуй базовый класс и его наследников.
Или я чего-то не понял?


Lord Zmiy   (2005-02-24 19:36:00) [13]

была как то у меня похожая идея только так и не реализовал .. я лично таблицу  другим методом построил :)


begin...end   (2005-02-24 19:36:00) [14]

> AlexanderVas ©   (24.02.05 19:34)]

> Как это победить?

Победить ЧТО?


Наверх

Титульная страница Поиск, карта сайта Написать письмо