Форум: "Основная";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизМожно ли поменять тип записи во время исполнения программы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c