base_extern.pas
来自「Delphi脚本控件」· PAS 代码 · 共 2,437 行 · 第 1/5 页
PAS
2,437 行
procedure TPAXArray.InsertIndex(I: Integer);
begin
fIndexes.Insert(0, Pointer(I));
end;
function TPAXArray.Get(const Indexes: array of Integer): Variant;
var
I: Integer;
begin
fIndexes.Clear;
for I:=0 to System.Length(Indexes) - 1 do
fIndexes.Add(Indexes[I]);
result := _Get;
end;
function TPAXArray.GetPtr(const Indexes: array of Integer): PVariant;
var
I: Integer;
begin
fIndexes.Clear;
for I:=0 to System.Length(Indexes) - 1 do
fIndexes.Add(Indexes[I]);
result := AddressOfElement;
end;
procedure TPAXArray.Put(const Indexes: array of Integer; const Value: Variant);
var
I: Integer;
begin
fIndexes.Clear;
for I:=0 to System.Length(Indexes) - 1 do
fIndexes.Add(Indexes[I]);
_Put(Value);
end;
function TPAXArray._CheckIndexes: Boolean;
var
I, Idx: Integer;
begin
for I:=0 to fIndexes.Count - 1 do
begin
Idx := fIndexes[I] + 1;
if Idx > fBounds[I] then
begin
result := False;
Exit;
end;
end;
result := true;
end;
function TPAXArray.CheckIndexes(const Indexes: array of Integer): Boolean;
var
I, Idx: Integer;
begin
result := true;
for I:=0 to L - 1 do
begin
Idx := Indexes[I] + 1;
if Idx > fBounds[I] then
begin
result := False;
Exit;
end;
end;
end;
procedure TPAXArray.PutEx(const Indexes: array of Integer; const Value: Variant);
begin
if not CheckIndexes(Indexes) then
ReDim(Indexes);
Put(Indexes, Value);
end;
function TPAXArray.GetEx(const Indexes: array of Integer): Variant;
begin
if not CheckIndexes(Indexes) then
ReDim(Indexes);
result := Get(Indexes);
end;
function IsScripters: Boolean;
begin
if Assigned(ScripterList) then
result := ScripterList.Count > 0
else
result := false;
end;
procedure _Dump(MethodBody: TPAXMethodBody);
begin
with MethodBody do
TPAXBaseScripter(Scripter).Dump;
end;
procedure _IOResult(MethodBody: TPAXMethodBody);
begin
with MethodBody do
result.AsInteger := IOResult;
end;
procedure _ScriptObjectListCount(MethodBody: TPAXMethodBody);
begin
with MethodBody do
result.AsInteger := TPAXBaseScripter(Scripter).ScriptObjectList.Count;
end;
procedure _Destroy(MethodBody: TPAXMethodBody);
var
SO: TPaxScriptObject;
P: PVariant;
begin
with MethodBody do
begin
P := Params[0].PValue;
if IsObject(P^) then
begin
SO := VariantToScriptObject(P^);
TPAXBaseScripter(Scripter).ScriptObjectList.RemoveObject(SO);
end;
VarClear(P^);
end;
end;
procedure _PaxArray(MethodBody: TPAXMethodBody);
var
PaxArray: TPaxArray;
Bounds: array of Integer;
I: Integer;
SO: TPaxScriptObject;
begin
with MethodBody do
begin
SetLength(Bounds, ParamCount);
for I:=0 to ParamCount - 1 do
Bounds[I] := Params[I].AsInteger - 1;
PaxArray := TPaxArray.Create(Bounds);
PaxArray.Scripter := Scripter;
SO := DelphiInstanceToScriptObject(PaxArray, Scripter);
result.AsVariant := ScriptObjectToVariant(SO);
end;
end;
procedure _GetTickCount(MethodBody: TPAXMethodBody);
begin
{$IFDEF WIN32}
with MethodBody do
begin
result.AsInteger := GetTickCount;
end;
{$ENDIF}
end;
procedure _GetTotalAllocated(MethodBody: TPAXMethodBody);
var
D: Double;
begin
{$IFDEF WIN32}
with MethodBody do
begin
D := GetHeapStatus.TotalAllocated;
result.AsVariant := D;
end;
{$ELSE}
result.AsVariant := 0;
{$ENDIF}
end;
procedure _Sleep(MethodBody: TPAXMethodBody);
begin
{$IFDEF WIN32}
with MethodBody do
Sleep(Params[0].AsInteger);
{$ENDIF}
end;
procedure _CreateArray(MethodBody: TPAXMethodBody);
var
HBound: Integer;
begin
with MethodBody do
begin
HBound := Params[0].AsInteger;
result.AsVariant := varArrayCreate([0, HBound], varVariant);
end;
end;
procedure _DoNotDestroy(MethodBody: TPAXMethodBody);
var
V: Variant;
SO: TPAXScriptObject;
begin
with MethodBody do
begin
V := Params[0].AsVariant;
SO := VariantToScriptObject(V);
SO.RefCount := 0;
end;
end;
procedure _Assigned(MethodBody: TPAXMethodBody);
var
V: Variant;
SO: TPAXScriptObject;
begin
with MethodBody do
begin
V := Params[0].AsVariant;
if IsObject(V) then
begin
SO := VariantToScriptObject(V);
result.AsBoolean := TPAXBaseScripter(Scripter).ScriptObjectList.HasObject(SO);
end
else
result.AsBoolean := false;
end;
end;
constructor TPAXParameter.Create(AScripter: Pointer);
begin
Scripter := AScripter;
Clear;
end;
destructor TPAXParameter.Destroy;
begin
inherited;
end;
procedure TPAXParameter.Clear;
begin
PValue := nil;
VType := varUndefined;
end;
function TPAXParameter.GetAsString: String;
var
V: Variant;
begin
V := Variant(PValue^);
result := ToStr(Scripter, V);
end;
procedure TPAXParameter.SetAsString(const Value: String);
var
S: String;
begin
S := ToStr(Scripter, Value);
Variant(PValue^) := S;
VType := varString;
end;
function TPAXParameter.GetAsBoolean: Boolean;
var
V: Variant;
begin
V := Variant(PValue^);
result := ToBoolean(V);
end;
procedure TPAXParameter.SetAsBoolean(Value: Boolean);
begin
Variant(PValue^) := ToBoolean(Value);
VType := varBoolean;
end;
function TPAXParameter.GetAsInteger: Integer;
begin
result := ToInteger(PValue^);
end;
procedure TPAXParameter.SetAsInteger(Value: Integer);
begin
Variant(PValue^) := Value;
end;
function ToCardinal(const V: Variant): Cardinal;
var
D: Double;
begin
case VarType(V) of
varInteger: result := V;
varDouble:
begin
D := V;
result := Round(D);
end;
else
raise TPAXScriptFailure.Create(errIncompatibleTypes);
end;
end;
function TPAXParameter.GetAsCardinal: Cardinal;
begin
result := toCardinal(PValue^);
end;
procedure TPAXParameter.SetAsCardinal(Value: Cardinal);
var
Dbl: Double;
begin
if Value > Cardinal(MaxInt) then
begin
Dbl := Value;
Variant(PValue^) := Dbl;
end
else
Variant(PValue^) := Integer(Value);
end;
function TPAXParameter.GetAsPointer: Pointer;
var
SO: TPaxScriptObject;
begin
if IsObject(PValue^) then
begin
SO := VariantToScriptObject(PValue^);
if SO.ClassRec.fClassDef <> nil then
result := SO.Instance
else
result := SO;
end
else
result := Pointer(Integer(PValue^));
end;
procedure TPAXParameter.SetAsPointer(Value: Pointer);
var
Instance: TObject;
AClass: TClass;
begin
if IsDelphiObject(Value) then
begin
Instance := TObject(Value);
if Instance.ClassType = TPaxScriptObject then
begin
Variant(PValue^) := Integer(Instance);
TVarData(Variant(PValue^)).VType := varScriptObject;
end
else
Variant(PValue^) := ScriptObjectToVariant(DelphiInstanceToScriptObject(Instance, Scripter));
end
else if IsDelphiClass(Value) then
begin
AClass := TClass(Value);
Variant(PValue^) := ScriptObjectToVariant(DelphiClassToScriptObject(AClass, Scripter));
end
else
Variant(PValue^) := Integer(Value);
end;
function TPAXParameter.GetAsDouble: Double;
begin
result := PValue^;
end;
procedure TPAXParameter.SetAsDouble(Value: Double);
begin
Variant(PValue^) := Value;
end;
function TPAXParameter.GetAsTObject: TObject;
var
V: Variant;
begin
V := Variant(PValue^);
result := TObject(ToInteger(V));
VType := varScriptObject;
end;
procedure TPAXParameter.SetAsTObject(Value: TObject);
begin
Variant(PValue^) := Integer(Value);
VType := varScriptObject;
end;
function TPAXParameter.GetAsVariant: Variant;
begin
result := Variant(PValue^);
end;
procedure TPAXParameter.SetAsVariant(const Value: Variant);
begin
Variant(PValue^) := Value;
VType := VarType(Value);
end;
constructor TPAXParameterList.Create(AScripter: Pointer);
var
I: Integer;
begin
inherited Create;
Scripter := AScripter;
for I:=0 to MaxParams - 1 do
Add(TPAXParameter.Create(AScripter));
end;
procedure TPAXParameterList.Clear;
var
I: Integer;
begin
for I:=0 to Count - 1 do
TPAXParameter(Items[I]).Free;
inherited;
end;
constructor TPAXMethodBody.Create(Scripter: Pointer);
begin
Self.Scripter := Scripter;
fResult := TPAXParameter.Create(Scripter);
PSelf := nil;
fParameterList := TPAXParameterList.Create(Scripter);
fParamCount := 0;
end;
procedure TPAXMethodBody.AddParameters(K: Integer);
begin
while fParameterList.Count < K do
fParameterList.Add(TPAXParameter.Create(Scripter));
end;
function TPAXMethodBody.GetSelf: TObject;
begin
if PSelf = nil then
result := nil
else
result := TObject(PSelf^);
end;
procedure TPAXMethodBody.SetSelf(Value: TObject);
begin
if PSelf <> nil then
TObject(PSelf^) := Value;
end;
destructor TPAXMethodBody.Destroy;
begin
fResult.Free;
fParameterList.Free;
end;
function TPAXMethodBody.FindNestedClass(const NamespaceName, ClassName: String): Pointer;
var
OwnerList: TStringList;
begin
OwnerList := TStringList.Create;
if NamespaceName <> '' then
OwnerList.Add(NamespaceName);
result := TPAXBaseScripter(Scripter).ClassList.FindNestedClass(OwnerList, ClassName);
OwnerList.Free;
end;
function TPAXMethodBody.DefaultValue: Variant;
begin
result := Undefined;
if PSelf = nil then
Exit;
if GetSelf().InheritsFrom(TPAXScriptObject) then
result := TPAXScriptObject(GetSelf()).DefaultValue;
end;
procedure TPAXMethodBody.Clear;
begin
fResult.Clear;
PSelf := nil;
end;
function TPAXMethodBody.GetParameter(I: Integer): TPAXParameter;
begin
if I >= fParameterList.Count then
AddParameters(I + 10);
result := fParameterList[I];
end;
procedure TPAXMethodBody.SetParameter(I: Integer; Value: TPAXParameter);
begin
if I >= fParameterList.Count then
AddParameters(I + 10);
fParameterList[I] := Value;
end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?