TFMTBCDField
의 데이터 형식은 FMTBcd 단위의 TBcd
레코드입니다. 필드의 Value
또는 AsBCD
속성을 읽어 원시 값을 얻을 수 있습니다.
값이 필요한 항목에 따라 TBcd
이면 충분할 수 있습니다. 즉, Int64
으로 변환하지 않아도됩니다. FMTBcd 단위는 TBcd
값을 더하거나 빼거나 곱하거나 나눌 수있는 함수를 제공합니다.
단위는 Int64
으로 변환되지 않습니다. Variant
, string
, Currency
, Double
및 Integer
으로 변환됩니다. 우리가 Int64
변환을 쓰려고 한 경우, Integer
변환을 시작하기에 좋은 장소는 아마도, 그래서 그것이 구현 어떻게 살펴 보자 :
function BcdToInteger(const Bcd: TBcd; Truncate: Boolean = False): Integer;
var
ABcd: TBcd;
begin
if Truncate and (BcdScale(Bcd) > 0) then
NormalizeBcd(Bcd, ABcd, Bcd.Precision, 0)
else
ABcd := Bcd;
Result := StrToInt(BcdToStr(ABcd));
end;
그래서, VCL 자체가 더 이상 직접 제공하지 않습니다 방법은 TBcd
을 을 통과하는 것보다 Integer
으로 변환하는 것입니다. 따라서 필드의 문자열 버전에 StrToInt64
을 호출하는 것이 좋습니다.
자동으로 추가 된 것과 다른 유형의 데이터 집합에 다른 필드를 간단하게 추가하는 것이 합리적입니까? 내 말은, 드라이버가 새로운 필드 유형과 호환되는 데이터를 보내거나 드라이버가 BCD 데이터를 계속 전송하고 필드 객체가 해당 블록을 Int64로 대신 해석한다는 것입니까? 어쨌든, ** 가능하다면 ** TLargeintField 로의 타입 캐스트는 필요하지 않습니다; AsLargeInt 프라퍼티 getter는 가상이므로 올바른 코드는 TField 값에서 직접 호출 될 때에도 사용됩니다. –
나는 이것이 정결한지 알지 못한다. 아마도 이것은 특정 TDataSet 구현에 크게 의존합니다. 그리고 그런데 - typecasting은 delphi6 이전에는 qryMyQuery.FieldByName ('blahblah') 이후 유일한 옵션이었습니다. AsLargeint는 허용되지 않았습니다 (TField에는 AsLargeint 속성이 없었습니다). – smok1