Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Можно ли поменять тип записи во время исполнения программы   Найти похожие ветки 

 
AlexanderVas ©   (2005-02-24 19:34) [0]

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


 
Lord Zmiy ©   (2005-02-24 19:36) [1]

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


 
begin...end ©   (2005-02-24 19:36) [2]

> AlexanderVas ©   (24.02.05 19:34)]

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

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2005-02-24 21:44) [5]

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


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

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

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;


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

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


 
alexandervas ©   (2005-02-25 10:58) [8]

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

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

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


 
Digitman ©   (2005-02-25 11:58) [9]


> 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 := @TRec1;
pRW.size := ...;
... := pRW.count;

pRW := @TRec2;
pRW.size := ...;
... := pRW.count;


 
alexandervas ©   (2005-02-25 12:12) [10]

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


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


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

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


 
Digitman ©   (2005-02-25 13:44) [12]


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


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


 
reonid ©   (2005-02-25 15:44) [13]

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

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;

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


 
alexandervas ©   (2005-02-25 17:47) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.041 c
3-1108286719
m-a-x
2005-02-13 12:25
2005.03.13
фильтрация


1-1109242022
andycat
2005-02-24 13:47
2005.03.13
Глюк Delphi или другое?


1-1109241872
zdn
2005-02-24 13:44
2005.03.13
Дополнительные параметры


1-1109673626
АМБ
2005-03-01 13:40
2005.03.13
Округление чисел в Delphi


1-1109237398
Vizitor
2005-02-24 12:29
2005.03.13
Переключение раскладки клавиатуры