2012-02-03 6 views
3

개체 관리자와 비슷한 컨트롤을 만들고 있는데, 관련 개체에 대한 속성을 변경하고 싶습니다.델파이에서 값을 동적으로 할당합니다.

var 

v:TValue ; 
ctx : TRttiContext; 
begin 

    // k.IsOrdinal := true ; 
v := v.FromVariant(2) ; 


ctx.GetType(tButton).GetProperty('Style').SetValue(Button1, v.AsOrdinal); 

end; 

위의 코드는 내 코드이지만 유효하지 않은 캐스팅 오류가 나타납니다.

은 가능한 모든 변수와 열거 형을 처리하는 것입니다 SetValue 매크로에 대한 호출은 다음과 같이 읽을 필요가

답변

5

(객체와 기록의 필요는 매우 복잡하지 않기 때문에).에서

SetValue(Button1, TValue.From(TButton.TButtonStyle(2))) 

당신의 코드, AsOrdinal의 사용이 잘못되었습니다. 그것은 TRttiOrdinalType을 반환하는 함수입니다. 그러나 TRttiOrdinalTypedescribed thus입니다 :

TRttiOrdinalType is the class used to describe all the Delphi ordinal value types, such as Integer, Byte, Word, and so on.

하지만 당신은 위의 코드를 달성하는 것 인하는 TButtonStyle를 나타내는 TValue를 제공해야합니다. AS를


옆으로, 나는 처음에이 같은 일반 TValue.From<T>() 기능을 사용하려 :

SetValue(Button1, TValue.From<TButton.TButtonStyle>(TButton.TButtonStyle(2))); 

을하지만 그건 그냥 다음 내부 컴파일러 오류가 발생했습니다 :

[DCC Fatal Error] Unit58.pas(38): F2084 Internal Error: URW1147

QC#103129

제네릭을 사용할 때마다 나는 결국 이러한 내부적 오류로 인해 패배하게된다.

유형 추론을 사용하여 parameterised method을 호출하는 대체 양식을 지적한 Serg에게 감사드립니다. 내부 오류는 파울하지 않습니다.

+0

감사합니다. 그게 전부입니다. – VibeeshanRC

+0

제네릭을 오용 한 것 같습니다. 'SetValue (Button1, TValue.From (TButton.TButtonStyle (2)))); ' – kludg

+0

@Serg 당신은 형식 유추를 사용하는 여러분이 제공 한 형식이 내부 오류를 발생시키지 않는다고 잘못되었습니다. 하지만 제네릭을 오용하지 않습니다. 내가 사용한 구문은 완벽하게 유효합니다. http://docwiki.embarcadero.com/RADStudio/en/Declaring_Generics#Parameterized_Methods –

관련 문제