A_V:
AlekXL
Цитата:
если я правильно понял, то что-то типа такого (для delphi>=2010):
Код:
пример:
Код:
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; |