imp_basic.pas

来自「Delphi脚本控件」· PAS 代码 · 共 1,628 行 · 第 1/3 页

PAS
1,628
字号
////////////////////////////////////////////////////////////////////////////
// PAXScript Importing
// Author: Alexander Baranovsky (ab@cable.netlux.org)
// ========================================================================
// Copyright (c) Alexander Baranovsky, 2003-2005. All rights reserved.
// Code Version: 3.0
// ========================================================================
// Unit: IMP_Basic.pas
// ========================================================================
////////////////////////////////////////////////////////////////////////////


{$I PaxScript.def}

unit IMP_Basic;
interface
uses
{$IFDEF LINUX}
  QForms,
{$ENDIF}
{$IFDEF WIN32}
  Windows,
  {$IFNDEF FP}
  ComObj,
  {$ENDIF}
{$ENDIF}

{$ifdef VARIANTS}
  Variants,
{$endif}

  SysUtils,
  Classes,
  Math,
  BASE_SYS,
  BASE_CLASS,
  BASE_PARSER,
  BASE_EXTERN,
  BASE_SCRIPTER,
  PAX_BASIC,
  PaxScripter;

implementation

uses IMP_ActiveX;

const
  vbEmpty = 0;
  vbNull = 1;
  vbInteger = 2;
  vbLong = 3;
  vbSingle = 4;
  vbDouble = 5;
  vbCurrency = 6;
  vbDate = 7;
  vbString = 8;
  vbObject = 9;
  vbError = 10;
  vbBoolean = 11;
  vbVariant = 12;
  vbDataObject = 13;
  vbByte = 17;
  vbArray = 8192;

  vbGeneralDate = 0;
  vbLongDate = 1;
  vbShortDate = 2;
  vbLongTime = 3;
  vbShortTime = 4;

const
  MonthNames: array [1..12] of string =
  (
  'January',
  'February',
  'March',
  'April',
  'May',
  'June',
  'July',
  'August',
  'September',
  'October',
  'November',
  'December'
  );

  WeekDayNames: array [1..7] of string =
  (
  'Sunday',
  'Monday',
  'Tuesday',
  'Wednesday',
  'Thursday',
  'Friday',
  'Saturday'
  );

procedure _Abs(MethodBody: TPAXMethodBody);
var
  V: Variant;
begin
  with MethodBody do
  begin
    V := Params[0].AsVariant;
    if V > 0 then
      result.AsVariant := V
    else
      result.AsVariant := -V;
  end;
end;

procedure _Sin(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Sin(Params[0].AsVariant);
end;

procedure _Tan(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Tan(Params[0].AsVariant);
end;

procedure _Sqr(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Sqr(Params[0].AsDouble);
end;


procedure _Atn(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Arctan(Params[0].AsVariant);
end;

procedure _CBool(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToBoolean(Params[0].AsVariant);
end;

procedure _CByte(MethodBody: TPAXMethodBody);
var
  I: Integer;
begin
  with MethodBody do
  begin
    I := ToInt32(Params[0].AsVariant);
    result.AsVariant := I mod 256;
  end;
end;

procedure _CCurr(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToNumber(Params[0].AsVariant);
end;

procedure _CDate(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToNumber(Params[0].AsVariant);
end;

procedure _CDbl(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToNumber(Params[0].AsVariant);
end;

procedure _Chr(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsString := Chr(Params[0].AsInteger);
end;

procedure _Cos(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Cos(Params[0].AsVariant);
end;

procedure _CreateObject(MethodBody: TPAXMethodBody);
begin
{$ifndef fp}
  with MethodBody do
  begin
    Self := ActiveXObject.Create(Scripter);
    ActiveXObject(Self).D := CreateOleObject(Params[0].AsString);
  end;
  {$endif}
end;

procedure _GetObject(MethodBody: TPAXMethodBody);
var
  ClassRec: TPaxClassRec;
  SO: TPaxScriptObject;
begin
{$ifndef fp}
  with MethodBody do
  begin
    ClassRec := TPAXBaseScripter(Scripter).ClassList.FindClassByName('ActiveXObject');
    if ClassRec <> nil then
    begin
      SO := TPAXScriptObject.Create(ClassRec);
      SO.Instance := ActiveXObject.Create(Scripter);
{$IFDEF WIN32}
      ActiveXObject(SO.Instance).D := GetActiveOleObject(Params[0].AsString);
{$ENDIF}
      result.AsVariant := ScriptObjectToVariant(SO);
    end;
  end;
{$endif}
end;

procedure _GetRef(MethodBody: TPAXMethodBody);
var
  S: String;
  I: Integer;
begin
  with MethodBody do
  begin
    S := ToString(Params[0].AsVariant);
    with TPaxBaseScripter(Scripter).SymbolTable do
      for I:=1 to Card do
        if Kind[I] = KindSUB then
        if StrEql(Name[I], S) then
        begin
          result.AsInteger := I;
          Exit;
        end;
  end;
end;

procedure _CSng(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToNumber(Params[0].AsVariant);
end;

procedure _Asc(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsInteger := Ord(Params[0].AsString[1]);
end;

procedure _CInt(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToInt32(Params[0].AsVariant);
end;

procedure _CLng(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := ToInt32(Params[0].AsVariant);
end;

procedure _Date(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Date;
end;

procedure _DateAdd(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Date;
end;

procedure _DateDiff(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Date;
end;

procedure _DatePart(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Date;
end;

procedure _DateSerial(MethodBody: TPAXMethodBody);
var
  Y, M, D: Word;
begin
  with MethodBody do
  begin
    Y := ToInt32(Params[0].AsVariant);
    M := ToInt32(Params[1].AsVariant);
    D := ToInt32(Params[2].AsVariant);
    result.AsVariant := EncodeDate(Y,M,D);
  end;
end;

procedure _DateValue(MethodBody: TPAXMethodBody);
var
  S: String;
begin
  with MethodBody do
  begin
    S := ToString(Params[0].AsVariant);
    result.AsVariant := StrToDate(S);
  end;
end;

procedure _Day(MethodBody: TPAXMethodBody);
var
  V: Variant;
  D: TDateTime;
  Y, M, Day: Word;
begin
  with MethodBody do
  begin
    V := Params[0].AsVariant;
    if VarType(V) = varString then
      D := StrToDate(V)
    else
      D := ToNumber(V);
    DecodeDate(D, Y, M, Day);
    result.AsVariant := Day;
  end;
end;

procedure _Hour(MethodBody: TPAXMethodBody);
var
  V: Variant;
  D: TDateTime;
  Hour, Min, Sec, MSec: Word;
begin
  with MethodBody do
  begin
    V := Params[0].AsVariant;
    if VarType(V) = varString then
      D := StrToTime(V)
    else
      D := ToNumber(V);
    DecodeTime(D, Hour, Min, Sec, MSec);
    result.AsVariant := Hour;
  end;
end;

procedure _TimeSerial(MethodBody: TPAXMethodBody);
var
  Hour, Min, Sec: Word;
begin
  with MethodBody do
  begin
    Hour := Params[0].AsInteger;
    Min := Params[0].AsInteger;
    Sec := Params[0].AsInteger;
    result.AsVariant := EncodeTime(Hour, Min, Sec, 0);
  end;
end;

procedure _TimeValue(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
  begin
    result.AsVariant := TimeToStr(Params[0].AsVariant);
  end;
end;

procedure _Minute(MethodBody: TPAXMethodBody);
var
  V: Variant;
  D: TDateTime;
  Hour, Min, Sec, MSec: Word;
begin
  with MethodBody do
  begin
    V := Params[0].AsVariant;
    if VarType(V) = varString then
      D := StrToTime(V)
    else
      D := ToNumber(V);
    DecodeTime(D, Hour, Min, Sec, MSec);
    result.AsVariant := Min;
  end;
end;

procedure _Second(MethodBody: TPAXMethodBody);
var
  V: Variant;
  D: TDateTime;
  Hour, Min, Sec, MSec: Word;
begin
  with MethodBody do
  begin
    V := Params[0].AsVariant;
    if VarType(V) = varString then
      D := StrToTime(V)
    else
      D := ToNumber(V);
    DecodeTime(D, Hour, Min, Sec, MSec);
    result.AsVariant := Sec;
  end;
end;

procedure _Month(MethodBody: TPAXMethodBody);
var
  V: Variant;
  D: TDateTime;
  Y, M, Day: Word;
begin
  with MethodBody do
  begin
    V := Params[0].AsVariant;
    if VarType(V) = varString then
      D := StrToDate(V)
    else
      D := ToNumber(V);
    DecodeDate(D, Y, M, Day);
    result.AsVariant := M;
  end;
end;

procedure _MonthName(MethodBody: TPAXMethodBody);
var
  I: Integer;
  S: String;
  Short: Boolean;
begin
  with MethodBody do
  begin
    I := Params[0].AsInteger;
    S := MonthNames[I];
    Short := false;
    if ParamCount = 2 then
      Short := Params[1].AsBoolean;
    if Short then
      S := Copy(S, 1, 3);

    result.AsVariant := S;
  end;
end;

procedure _WeekDayName(MethodBody: TPAXMethodBody);
var
  I: Integer;
  S: String;
  Short: Boolean;
begin
  with MethodBody do
  begin
    I := Params[0].AsInteger;
    S := WeekDayNames[I];
    Short := false;
    if ParamCount = 2 then
      Short := Params[1].AsBoolean;
    if Short then
      S := Copy(S, 1, 3);

    result.AsVariant := S;
  end;
end;

procedure _Now(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Now;
end;

procedure _Time(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := Time;
end;

procedure _Timer(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := GetTickCount;
end;

procedure _Weekday(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsVariant := DayOfWeek(Params[0].AsVariant);
end;

procedure _Substr(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsString := Copy(Params[0].AsString,
                            Params[1].AsInteger,
                            Params[2].AsInteger);
end;

procedure _StrComp(MethodBody: TPAXMethodBody);
begin
  with MethodBody do
    result.AsInteger := CompareText(Params[0].AsString, Params[1].AsString);
end;

procedure _String(MethodBody: TPAXMethodBody);
var
  ch: Char;
  I: Integer;
  S: String;
begin
  with MethodBody do
  begin
    S := '';
    ch := Params[0].AsString[1];
    for I:=1 to Params[0].AsInteger do
      S := S + ch;
    result.AsString := S;
  end;
end;

procedure _StrReverse(MethodBody: TPAXMethodBody);
var
  S1, S2: String;
  I: Integer;
begin
  with MethodBody do
  begin
    S1 := Params[0].AsString;
    S2 := '';
    for I := 1 to Length(S1) do
      S2 := S1[I] + S2;
    result.AsString := S2;
  end;
end;

procedure _Year(MethodBody: TPAXMethodBody);
var
  V: Variant;
  D: TDateTime;
  Y, M, Day: Word;
begin
  with MethodBody do
  begin
    V := Params[0].AsVariant;
    if VarType(V) = varString then
      D := StrToDate(V)
    else
      D := ToNumber(V);
    DecodeDate(D, Y, M, Day);
    result.AsVariant := Y;

⌨️ 快捷键说明

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