Используйте RTTIField.SetValue, чтобы установить указатель на поле

У меня есть тип:

TControlPointer = ^TControl;

И частное поле в классе:

TMyClass = class(TObject)
  private
  FPointer : TControlPointer;
end;

Когда я пытаюсь установить значение для FPointer с помощью RTTI:

procedure SetControlPointer(pControl : TControlPointer);
[...]
RTTIField.SetValue(Self,pControl);

Компилятор сообщает [ошибка dcc32] myunit.pas (xxx): E2010 Несовместимые типы: 'TValue' и 'TControlPointer'

Любые идеи?

Спасибо


person Rafael Amantéa Mogone    schedule 27.11.2014    source источник
comment
Я могу передать TControl в SetControlPointer (pControl: TControl) и SetValue (Self, @ pControl). Но я не знаю, хорошая ли идея передать TControl целиком.   -  person Rafael Amantéa Mogone    schedule 27.11.2014
comment
TControl (и каждый объект) - это указатель. Вам действительно нужно использовать указатель на указатель?   -  person MBo    schedule 27.11.2014
comment
@MBo Вы могли бы, если хотите изменить поле в объекте   -  person David Heffernan    schedule 27.11.2014


Ответы (1)


Ошибка просто сообщает вам, что RTTIField.SetValue ожидает передачи TValue. Думаю, вам просто нужно поместить указатель в TValue

TValue.From<TControlPointer>(Self.pControl)

Это то, что вы переходите к RTTIField.SetValue.

Вы, вероятно, можете позволить компилятору определить тип и просто написать

TValue.From(Self.pControl)
person David Heffernan    schedule 27.11.2014
comment
Оно работает! Как вернуть мой TControlPointer из RTTIField.GetValue (Self)? - person Rafael Amantéa Mogone; 27.11.2014
comment
Используйте AsType<TControlPointer>(...), передав TValue. TValue является фундаментальным для RTTI. Вы должны этому научиться. - person David Heffernan; 27.11.2014
comment
TControlPointer.From ‹TValue› (RTTIField.GetValue (Self)) не работает. - person Rafael Amantéa Mogone; 27.11.2014
comment
Ну нет. Это создает новую телевизионную ценность. - person David Heffernan; 27.11.2014
comment
Отлично! Большое тебе спасибо! - person Rafael Amantéa Mogone; 27.11.2014
comment
Я поищу еще немного о TValue. Большое вам спасибо за это. - person Rafael Amantéa Mogone; 27.11.2014
comment
Да! Это мой первый вопрос по stackoverflow. Что я должен делать? - person Rafael Amantéa Mogone; 27.11.2014