![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли поменять тип записи во время исполнения программы [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)]
> Как это победить?
Победить ЧТО?