2016-05-28 3 views
0

У меня естьTValue литья к другому типу

uses 
    System.Rtti; 

procedure TForm1.BitBtn1Click(Sender: TObject); 
var 
    _UserString: string; 
    _CastedValue: TValue; 
    _IntExampleValue: TValue; 
    _DateTimeExampleValue: TValue; 
begin 
    _UserString := '55'; 
    _IntExampleValue := TValue.From<integer>(-199); 

    if not TValue.From(_UserString).TryCast(_IntExampleValue.TypeInfo, _CastedValue) 
    then 
    ShowMessage('Failed to cast') 
    else 
    ShowMessage('Casted successfully'); 

    _UserString := DateTimeToStr(Now); 
    _DateTimeExampleValue := TValue.From<TDateTime>(Now); 

    if not TValue.From(_UserString).TryCast(_DateTimeExampleValue.TypeInfo, _CastedValue) 
    then 
    ShowMessage('Failed to cast') 
    else 
    ShowMessage('Casted successfully'); 
end; 

Оба раза я получаю сообщение о том, что он не смог бросить, но почему? Я не вижу ничего плохого.

ответ

0

TValue не предназначен для выполнения подобных операций. Вы не можете использовать между двумя несовместимыми типами, которые сам язык Pascal не может напрямую использовать между ними. Точно так же, как String не может быть непосредственно присвоен Integer или TDateTime, TValue<String> не может быть отправлен в TValue<Integer> или TValue<TDateTime>. Не существует замены для использования функций преобразования, таких как StrToInt() и StrToDateTime().