Martijn Laan 10 mesi fa
parent
commit
4ace04e540
1 ha cambiato i file con 61 aggiunte e 31 eliminazioni
  1. 61 31
      Projects/Src/Setup.ScriptFunc.pas

+ 61 - 31
Projects/Src/Setup.ScriptFunc.pas

@@ -126,6 +126,62 @@ end;
 
 
 {---}
 {---}
 
 
+type
+  TPSStackHelper = class helper for TPSStack
+  private
+    function GetArray(const ItemNo: LongInt; out N: Integer): TPSVariantIFC;
+    function SetArray(const ItemNo: LongInt; const N: Integer): TPSVariantIFC; overload;
+  public
+    type
+      TArrayOfInteger = array of Integer;
+      TArrayOfString = array of String;
+    function GetIntArray(const ItemNo: Longint): TArrayOfInteger;
+    function GetStringArray(const ItemNo: Longint): TArrayOfString;
+    procedure SetArray(const ItemNo: LongInt; const Data: TArray<String>); overload;
+  end;
+
+function TPSStackHelper.GetArray(const ItemNo: LongInt;
+  out N: Integer): TPSVariantIFC;
+begin
+  Result := NewTPSVariantIFC(Items[ItemNo], True);
+  N := PSDynArrayGetLength(Pointer(Result.Dta^), Result.aType);
+end;
+
+function TPSStackHelper.SetArray(const ItemNo: LongInt;
+  const N: Integer): TPSVariantIFC;
+begin
+  Result := NewTPSVariantIFC(Items[ItemNo], True);
+  PSDynArraySetLength(Pointer(Result.Dta^), Result.aType, N);
+end;
+
+function TPSStackHelper.GetIntArray(const ItemNo: Longint): TArrayOfInteger;
+begin
+  var N: Integer;
+  var Arr := GetArray(ItemNo, N);
+  SetLength(Result, N);
+  for var I := 0 to N-1 do
+    Result[I] := VNGetInt(PSGetArrayField(Arr, I));
+end;
+
+function TPSStackHelper.GetStringArray(const ItemNo: Longint): TArrayOfString;
+begin
+  var N: Integer;
+  var Arr := GetArray(ItemNo, N);
+  SetLength(Result, N);
+  for var I := 0 to N-1 do
+    Result[I] := VNGetString(PSGetArrayField(Arr, I));
+end;
+
+procedure TPSStackHelper.SetArray(const ItemNo: LongInt; const Data: TArray<String>);
+begin
+  var N := System.Length(Data);
+  var Arr := SetArray(ItemNo, N);
+  for var I := 0 to N-1 do
+    VNSetString(PSGetArrayField(Arr, I), Data[I]);
+end;
+
+{---}
+
 function ScriptDlgProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
 function ScriptDlgProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
 var
 var
   PStart: Cardinal;
   PStart: Cardinal;
@@ -1149,9 +1205,6 @@ var
   S: String;
   S: String;
   Components, Suppressible: Boolean;
   Components, Suppressible: Boolean;
   Default: Integer;
   Default: Integer;
-  Arr: TPSVariantIFC;
-  N, I: Integer;
-  ButtonLabels: array of String;
 begin
 begin
   PStart := Stack.Count-1;
   PStart := Stack.Count-1;
   Result := True;
   Result := True;
@@ -1195,11 +1248,7 @@ begin
       Suppressible := True;
       Suppressible := True;
       Default := Stack.GetInt(PStart-7);
       Default := Stack.GetInt(PStart-7);
     end;
     end;
-    Arr := NewTPSVariantIFC(Stack[PStart-5], True);
-    N := PSDynArrayGetLength(Pointer(Arr.Dta^), Arr.aType);
-    SetLength(ButtonLabels, N);
-    for I := 0 to N-1 do
-      ButtonLabels[I] := VNGetString(PSGetArrayField(Arr, I));
+    var ButtonLabels := Stack.GetStringArray(PStart-5);
     Stack.SetInt(PStart, LoggedTaskDialogMsgBox('', Stack.GetString(PStart-1), Stack.GetString(PStart-2), GetMsgBoxCaption, TMsgBoxType(Stack.GetInt(PStart-3)), Stack.GetInt(PStart-4), ButtonLabels, Stack.GetInt(PStart-6), Suppressible, Default));
     Stack.SetInt(PStart, LoggedTaskDialogMsgBox('', Stack.GetString(PStart-1), Stack.GetString(PStart-2), GetMsgBoxCaption, TMsgBoxType(Stack.GetInt(PStart-3)), Stack.GetInt(PStart-4), ButtonLabels, Stack.GetInt(PStart-6), Suppressible, Default));
   end else if Proc.Name = 'ISWIN64' then begin
   end else if Proc.Name = 'ISWIN64' then begin
     Stack.SetBool(PStart, IsWin64);
     Stack.SetBool(PStart, IsWin64);
@@ -1883,9 +1932,6 @@ var
   AnsiS: AnsiString;
   AnsiS: AnsiString;
   Arr: TPSVariantIFC;
   Arr: TPSVariantIFC;
   ErrorCode: Cardinal;
   ErrorCode: Cardinal;
-  N, I: Integer;
-  AscendingTrySizes: array of Integer;
-  Values, Separators: array of String;
 begin
 begin
   PStart := Stack.Count-1;
   PStart := Stack.Count-1;
   Result := True;
   Result := True;
@@ -2035,11 +2081,7 @@ begin
     if ErrorCode <> 0 then
     if ErrorCode <> 0 then
       raise Exception.Create(Win32ErrorString(ErrorCode));
       raise Exception.Create(Win32ErrorString(ErrorCode));
   end else if Proc.Name = 'INITIALIZEBITMAPIMAGEFROMICON' then begin
   end else if Proc.Name = 'INITIALIZEBITMAPIMAGEFROMICON' then begin
-    Arr := NewTPSVariantIFC(Stack[PStart-4], True);
-    N := PSDynArrayGetLength(Pointer(Arr.Dta^), Arr.aType);
-    SetLength(AscendingTrySizes, N);
-    for I := 0 to N-1 do
-      AscendingTrySizes[I] := VNGetInt(PSGetArrayField(Arr, I));
+    var AscendingTrySizes := Stack.GetIntArray(PStart-4);
     Stack.SetBool(PStart, TBitmapImage(Stack.GetClass(PStart-1)).InitializeFromIcon(0, PChar(Stack.GetString(PStart-2)), Stack.GetInt(PStart-3), AscendingTrySizes));
     Stack.SetBool(PStart, TBitmapImage(Stack.GetClass(PStart-1)).InitializeFromIcon(0, PChar(Stack.GetString(PStart-2)), Stack.GetInt(PStart-3), AscendingTrySizes));
   end else if Proc.Name = 'EXTRACT7ZIPARCHIVE' then begin
   end else if Proc.Name = 'EXTRACT7ZIPARCHIVE' then begin
     var P: PPSVariantProcPtr := Stack.Items[PStart-3];
     var P: PPSVariantProcPtr := Stack.Items[PStart-3];
@@ -2053,29 +2095,17 @@ begin
   end else if Proc.Name = 'DEBUGGING' then begin
   end else if Proc.Name = 'DEBUGGING' then begin
     Stack.SetBool(PStart, Debugging);
     Stack.SetBool(PStart, Debugging);
   end else if Proc.Name = 'STRINGJOIN' then begin
   end else if Proc.Name = 'STRINGJOIN' then begin
-    Arr := NewTPSVariantIFC(Stack[PStart-2], True);
-    N := PSDynArrayGetLength(Pointer(Arr.Dta^), Arr.aType);
-    SetLength(Values, N);
-    for I := 0 to N-1 do
-      Values[I] := VNGetString(PSGetArrayField(Arr, I));
+    var Values := Stack.GetStringArray(PStart-2);
     Stack.SetString(PStart, String.Join(Stack.GetString(PStart-1), Values));
     Stack.SetString(PStart, String.Join(Stack.GetString(PStart-1), Values));
   end else if (Proc.Name = 'STRINGSPLIT') or (Proc.Name = 'STRINGSPLITEX') then begin
   end else if (Proc.Name = 'STRINGSPLIT') or (Proc.Name = 'STRINGSPLITEX') then begin
-    Arr := NewTPSVariantIFC(Stack[PStart-2], True);
-    N := PSDynArrayGetLength(Pointer(Arr.Dta^), Arr.aType);
-    SetLength(Separators, N);
-    for I := 0 to N-1 do
-      Separators[I] := VNGetString(PSGetArrayField(Arr, I));
+    var Separators := Stack.GetStringArray(PStart-2);
     var Parts: TArray<String>;
     var Parts: TArray<String>;
     if Proc.Name = 'STRINGSPLITEX' then begin
     if Proc.Name = 'STRINGSPLITEX' then begin
       var Quote := Stack.GetString(PStart-3)[1];
       var Quote := Stack.GetString(PStart-3)[1];
       Parts := Stack.GetString(PStart-1).Split(Separators, Quote, Quote, TStringSplitOptions(Stack.GetInt(PStart-4)))
       Parts := Stack.GetString(PStart-1).Split(Separators, Quote, Quote, TStringSplitOptions(Stack.GetInt(PStart-4)))
     end else
     end else
       Parts := Stack.GetString(PStart-1).Split(Separators, TStringSplitOptions(Stack.GetInt(PStart-3)));
       Parts := Stack.GetString(PStart-1).Split(Separators, TStringSplitOptions(Stack.GetInt(PStart-3)));
-    Arr := NewTPSVariantIFC(Stack[PStart], True);
-    N := Length(Parts);
-    PSDynArraySetLength(Pointer(Arr.Dta^), Arr.aType, N);
-    for I := 0 to N-1 do
-      VNSetString(PSGetArrayField(Arr, I), Parts[I]);
+    Stack.SetArray(PStart, Parts);
   end else
   end else
     Result := False;
     Result := False;
 end;
 end;