자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi Tvalue의 데이터 관련 문의 건
2019.12.23 16:02
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
수고 많으십니다.
TValue 에 할당된 06 00 00 00 00 이며
이 Tvalue의 데이터를 다른 곳에서 복원하려 하는 경우 TValue.TypeInfo.Kind = tkRecord로 되어 있고
TValue에서 지원되는 TValue.AsVariant/VarRec/String/Integer/UInt64 등의 type으로 으로 복원하려 해도 복원이 안됩니다.
TValue as Type < Long > 등의 32bit Integer 형으로 변환하려 해도 오류가 뜨는데 Type Kind가 tkRecord 인 Tvalue를 어느 타입으로 해야 복원이 가능한지 문의 드립니다.
감사합니다.
한 태수 드림.
댓글 3
-
험프리
2019.12.23 16:50
-
한태수
2019.12.23 17:59
바로 테스트해 볼게요.
감사합니다.
-
한태수
2019.12.23 20:15
험프리님의 답변에 감사드립니다.
제가 사용하는 코드는 Gurux.DLMS.delphi 소스파일로서 미터기에 사용되는 Open 소스입니다.
험프리님께서 조언해 주신 대로 R2 : TRect 로 선언하고 R2:= TValue.AsType<TRect>로 하였을 때에도 "Invalid Class Typecast"란
오류가 발생됩니다.
소스를 좀더 조사하여 해결시 다시 말씀드리겠습니다.
감사합니다.
한 태수 드림.
Delphi Tvalue의 데이터 관련 문의 건
2019.12.23 16:02
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
수고 많으십니다.
TValue 에 할당된 06 00 00 00 00 이며
이 Tvalue의 데이터를 다른 곳에서 복원하려 하는 경우 TValue.TypeInfo.Kind = tkRecord로 되어 있고
TValue에서 지원되는 TValue.AsVariant/VarRec/String/Integer/UInt64 등의 type으로 으로 복원하려 해도 복원이 안됩니다.
TValue as Type < Long > 등의 32bit Integer 형으로 변환하려 해도 오류가 뜨는데 Type Kind가 tkRecord 인 Tvalue를 어느 타입으로 해야 복원이 가능한지 문의 드립니다.
감사합니다.
한 태수 드림.
댓글 3
-
험프리
2019.12.23 16:50
-
한태수
2019.12.23 17:59
바로 테스트해 볼게요.
감사합니다.
-
한태수
2019.12.23 20:15
험프리님의 답변에 감사드립니다.
제가 사용하는 코드는 Gurux.DLMS.delphi 소스파일로서 미터기에 사용되는 Open 소스입니다.
험프리님께서 조언해 주신 대로 R2 : TRect 로 선언하고 R2:= TValue.AsType<TRect>로 하였을 때에도 "Invalid Class Typecast"란
오류가 발생됩니다.
소스를 좀더 조사하여 해결시 다시 말씀드리겠습니다.
감사합니다.
한 태수 드림.
TValue에 5바이트의 데이터가 채워져 있다는 가정이 있는 것으로 보입니다.
통상적으로 데이터를 주고 받는 경우 사전에 데이터의 구조를 정의하고 보내는 곳과 받는 곳에서 공유해야 합니다.
일번적으로 레코드를 사용하면 레코드 내에 여러가지 데이터 구조를 정의할 수 있어 레코드(구조체)를 사용합니다.
위와 같이 데이터 구조를 정의하는 것을 프로토콜이라고 합니다.
즉, 어떤 데이터를 받는지 모르지만, 데이터를 보내는 곳에서 TValue에 5바이트를 담아서 보낸다면, 받는 쪽에서도 5바이트가 들어있다고 가정하고 꺼내야 합니다. 아래와 같이 레코드 정의 후 사용하면 될 것 같습니다.
type
TRec = record
Data: array[0..4] of Byte;
end;
var
V: TValue;
D: TArray<Byte>;
R, R2: TRec;
begin
D := [1, 2, 3, 4, 5];
Move(D[0], R.Data[0], 5);
V := TValue.From<TRec>(R);
R2 := V.AsType<TRec>;