Quantcast
Channel: Ru.Board
Viewing all articles
Browse latest Browse all 1003802

Вопросы по Embarcadero RAD Studio XE3 (679) / Обсуждаем новые возможности и баги

$
0
0
A_V:
AlekXL

Цитата:
Если у меня в переменной A ссылка на аноним, а мне нужна независимая копия с тем же (по значению) контекстом в переменной b .. это возможно сделать?

если я правильно понял, то что-то типа такого (для delphi>=2010):

Код:


type
TRefProcAdapter<T> = class
type
_TIntfObj = class(TInterfacedObject)
end;
class function MakeCopy(ARefProc: T): T;
end;
...

uses System.Rtti, System.TypInfo;
...

class function TRefProcAdapter<T>.MakeCopy(ARefProc: T): T;
type
PInterface = ^IInterface;
P = ^T;
var
Ctx: TRttiContext;
ProcType: TRttiInstanceType;
RefObj: _TIntfObj;
RefIntf: IInterface;
ResultObj: _TIntfObj;
ResultIntf: IInterface;
ResultPtr: Pointer;
f: TRttiField;
begin
Ctx := TRttiContext.Create;
RefIntf := PInterface(@ARefProc)^;

RefObj := _TIntfObj(RefIntf as TObject);
ResultObj := _TIntfObj(RefObj.ClassType.Create);
ProcType := Ctx.GetType(RefObj.ClassInfo) as TRttiInstanceType;
Assert(Assigned(ProcType));
for f in ProcType.GetDeclaredFields do
f.SetValue(ResultObj, f.GetValue(RefObj));
ResultObj.QueryInterface(GetTypeData(PTypeInfo(TypeInfo(T))).Guid, ResultIntf);
Result := P(@ResultIntf)^;
end;



пример:

Код:

TRefProc = reference to procedure(AParam: Integer);
..

procedure TForm3.FormCreate(Sender: TObject);
var
RefProc1, RefProc2: TRefProc;
Cntr: Integer;
begin
Cntr := 0;
RefProc1 := procedure(AParam: Integer)
var
LSelf: TObject;
begin
if Cntr = 0 then
ShowMessage('Pass');
Inc(Cntr);
asm
mov eax, [ebp-8];
mov LSelf, eax
end;
ShowMessage(LSelf.ClassName);
end;
RefProc2 := TRefProcAdapter<TRefProc>.MakeCopy(RefProc1);
RefProc1(20);
RefProc2(30);
RefProc2 := nil;
end;

Viewing all articles
Browse latest Browse all 1003802

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>