⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxjs_conv.pas

📁 Well known and usefull component for delphi 7
💻 PAS
字号:
////////////////////////////////////////////////////////////////////////////
//    Component: DXJS_CONV
//       Author: Alexander Baranovsky (ab@virtlabor.donbass.com)
//               G.E. Ozz Nixon Jr. (staff@bpdx.com)
// ========================================================================
// Source Owner: DX, Inc. 2002, 2004
//    Copyright: All code is the property of DX, Inc. Licensed for
//               resell by Brain Patchwork DX (tm) and part of the
//               DX (r) product lines, which are (c) 1999-2002
//               DX, Inc. Source may not be distributed without
//               written permission from both Brain Patchwork DX,
//               and DX, Inc.
//      License: (Reminder), None of this code can be added to other
//               developer products without permission. This includes
//               but not limited to DCU's, DCP's, DLL's, OCX's, or
//               any other form of merging our technologies. All of
//               your products released to a public consumer be it
//               shareware, freeware, commercial, etc. must contain a
//               license notification somewhere visible in the
//               application.
// Code Version: (3rd Generation)
// ========================================================================
//  Description: Type Conversion Routines
// ========================================================================
////////////////////////////////////////////////////////////////////////////

unit DXJS_CONV;
interface
{$I DXJavaScript.def}

uses
{$IFDEF VARIANTS}
  Variants,
{$ENDIF}
  DXJS_SHARE,
  DXJS_OBJECT;

function ScriptObjectToVariant(Value: TScriptObject): TVariant;
function VariantToScriptObject(Value: TVariant): TScriptObject;
function ToDelphiObject(Value: TVariant): TObject;
function DelphiObjectToVariant(Instance: TObject): Variant;
function ToString(const Value: TVariant): String;
function ToStr(const Value: TVariant): String;
function ToObject(const Value: TVariant; AScript: Pointer): TVariant;
function ToPrimitive(const V: TVariant): TVariant;
function ToBoolean(const V: TVariant): TVariant;
function ToNumber(const V: TVariant): TVariant;
function ToInt32(const V: TVariant): TVariant;
function ToInteger(const V: TVariant): TVariant;
// new AUGUST 6 2003
function VariantArrayToJavaScriptArray(const V: TVariant; Scripter: Pointer): TVariant;

implementation

Uses
   DXString,
   SysUtils; // StrToFloat

function VariantArrayToJavaScriptArray(const V: TVariant; Scripter: Pointer): TVariant;
var
  SO: TScriptObject;
  I, L, H: Integer;
  VI: TVariant;
begin
  SO := TArrayObject.Create(Scripter);
  L := VarArrayLowBound(V, 1);
  H := VarArrayHighBound(V, 1);
  for I:=L to H do
  begin
    VI := V[I];
    if VarType(VI) > varArray then
      SO.PutProperty(IntegerToString(I), VariantArrayToJavaScriptArray(VI, Scripter))
    else
      SO.PutProperty(IntegerToString(I), VI);
  end;
  SO.PutProperty('length', H + 1);
  result := ScriptObjectToVariant(SO);
end;

function ScriptObjectToVariant(Value: TScriptObject): TVariant;
begin
  result := Integer(Value);
  TVarData(result).VType := varScriptObject;
end;

function DelphiObjectToVariant(Instance: TObject): Variant;
begin
  result := Integer(Instance);
  TVarData(result).VType := varDelphiObject;
end;

function VariantToScriptObject(Value: TVariant): TScriptObject;
begin
  if VarType(Value) <> varScriptObject then begin
    if VarType(Value) <> varUndefined then
       raise TScriptFailure.Create(reIncompatibleTypes)
    else
       raise TScriptFailure.Create(reFunctionNotFound);
  end;
  TVarData(Value).VType := varInteger;
  result := TScriptObject(Integer(Value));
end;

function ToDelphiObject(Value: TVariant): TObject;
begin
  Result:=TDelphiObject(VariantToScriptObject(Value)).Instance;
end;

function ToString(const Value: TVariant): String;
var
  N: Integer;
  D: Double;
  S,L,R: String;

begin
  if VarType(Value) = varScriptObject then begin
    Result:=VariantToScriptObject(Value).ToString;
  end
  else begin
    if VarType(Value) = varDouble then begin
      D := Value;
      if D = NaN then begin
        result := 'NaN';
        Exit;
      end
      else if D = Infinity then begin
        result := 'infinity';
        Exit;
      end
      else if D = - Infinity then begin
        result := '-infinity';
        Exit;
      end;
    end;
    result := VariantToString(Value);
    if VarType(Value) = varDouble then begin
      N := DXString.CharPos(',', result);
      if N > 0 then result[N] := '.';
    end;
   end;
   // march 2004 (was in DXJS_MAIN.ToString()):
   S:=Result;
  If CharPos('\',S)>0 then Begin // OZZ
     S := StringReplace(S, '\\', #255, [rfReplaceAll]); // mask out \\ for now
     S := StringReplace(S, '\b', #$08, [rfReplaceAll]);
     S := StringReplace(S, '\t', #$09, [rfReplaceAll]);
     S := StringReplace(S, '\n', #$0A, [rfReplaceAll]);
     S := StringReplace(S, '\v', #$0B, [rfReplaceAll]);
     S := StringReplace(S, '\f', #$0C, [rfReplaceAll]);
     S := StringReplace(S, '\r', #$0D, [rfReplaceAll]);
     S := StringReplace(S, '\"', #$22, [rfReplaceAll]);
     S := StringReplace(S, '\''',#$27, [rfReplaceAll]);
     //715
     N:=QuickPos('\u',S);
     While N>0 do Begin
        L:=Copy(S,1,N-1);
        R:=Copy(S,N+6,Length(S));
        S:=Copy(S,N+2,4);
        If (S[1]='0') and (S[1]=S[2]) then Begin
           Delete(S,1,2);
           S:=Char(StrToInt('$'+S));
        End
        Else S:=WideCharToString(PWidechar(S));
        S:=L+S+R;
        N:=QuickPos('\u',S);
     End;
     N:=QuickPos('\x',S);
     While N>0 do Begin
        L:=Copy(S,1,N-1);
        R:=Copy(S,N+6,Length(S));
        S:=Copy(S,N+2,2);
        S:=Char(StrToInt('$'+S));
        S:=L+S+R;
        N:=QuickPos('\x',S);
     End;
     S := StringReplace(S, #255, #$5C, [rfReplaceAll]); // unmask \\ now...
  End;
  result := S;
end;

function ToStr(const Value: TVariant): String;
Var
   Ws:String;

begin
   if VarType(Value) = varScriptObject then begin
      If VariantToScriptObject(Value).ClassProp='Date' then Begin // Sept 24
(*
{$IFDEF VER130}
         Ws:=FormatDateTime ('ddd mmm d h:nn:ss @ yyyy',SysUtils.StrToDateTime(VariantToScriptObject(Value).DefaultValue)) ;
{$ELSE}
         Ws:=FormatDateTime ('ddd mmm d h:nn:ss @ yyyy',SysUtils.StrToDateTimeDef(VariantToScriptObject(Value).DefaultValue,SysUtils.Now)) ;
{$ENDIF}
         Ws:=StringReplace (Ws,'@',DXString.ShortTimeZone, []) ;
         Result:=Ws;
*)
         Ws:=VariantToScriptObject(Value).DefaultValue; // 720
      End
      Else Result:=ToString(value); // March 2004
      //VariantToScriptObject(Value).DefaultValue;
   end
   else result := ToString(Value);
end;

function ToObject(const Value: TVariant; AScript: Pointer): TVariant;
var
  SO: TScriptObject;
begin
  case VarType(Value) of
    varScriptObject:
    begin
      result := Value;
      Exit;
    end;
    varBoolean:
      SO := TBooleanObject.Create(Value, AScript);
//    varInteger, varDouble, varDate:
   varDouble,varInteger, {original 2 types}
   {varSmallInt,}varSingle,varCurrency,{varShortInt}$0010,{varWord}$0012,{varLongWord}$0013,{varInt64}$0014,varDate:
      SO := TNumberObject.Create(Value, AScript);
    varString:
      SO := TStringObject.Create(Value, AScript);
    else
      raise TScriptFailure.Create(reIncompatibleTypes);
   end;
  result := ScriptObjectToVariant(SO);
end;

function ToPrimitive(const V: TVariant): TVariant;
begin
  if VarType(V) = varScriptObject then begin
     TVarData(Result).VType := varInteger;
//     result := TScriptObject(Integer(Result)).DefaultValue;
     result := TScriptObject(Integer(V)).DefaultValue;
  end
  Else Result:=V;
end;

function ToBoolean(const V: TVariant): TVariant;
begin
  result := true;
  case VarType(V) of
    varEmpty, varNull: result := false;
    varBoolean: result := V;
   varDouble,varInteger, {original 2 types}
   {varSmallInt,}varSingle,varCurrency,{varShortInt}$0010,{varWord}$0012,{varLongWord}$0013,{varInt64}$0014,varDate:
       Result:=V<>0;
    varString: result := V <> '';
    varScriptObject: result := ToBoolean(VariantToScriptObject(V).DefaultValue);
  end;
end;

function ToNumber(const V: TVariant): TVariant;
begin
  case VarType(V) of
    varEmpty: result := NaN;
    varNull: result := 0;
   varDouble,varInteger, {original 2 types}
   {varSmallInt,}varSingle,varCurrency,{varShortInt}$0010,{varWord}$0012,{varLongWord}$0013,{varInt64}$0014,varDate:
      Result:=V;
//    varInteger, varDouble, varDate: result := V;
    varBoolean:
      if V then result := 1
      else result := 0;
    varString:
       if (V<>'') and (DXString.isNumericString(V)) then begin
          result := SysUtils.StrToFloat(V);
       end
       Else result:=NaN;
    varScriptObject: result := ToNumber(VariantToScriptObject(V).DefaultValue);
  end;
end;

function ToInt32(const V: TVariant): TVariant;
var
  N: Variant;
  D: Double;
begin
  N := ToNumber(V);
  D := N;
  if (D = NaN) or
     (D = NEGATIVE_INFINITY) or
     (D = POSITIVE_INFINITY) then result := 0
  else result := V;
end;

function ToInteger(const V: TVariant): TVariant;
var
  N: Variant;
  D: Double;
begin
  N := ToNumber(V);
  D := N;
  if D = NaN then result := 0
  else result := N;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -