Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
0.8.3:scripting [2021/10/13 13:12] – [Global Functions and Procedures] admin0.8.3:scripting [2021/10/13 13:42] (current) – [Global Functions] admin
Line 145: Line 145:
  
 <file pascal> <file pascal>
-function Calculate(A : Integer; B : Double) : Double; +program demo; 
-begin + 
-   Result := A * B; +uses 
-end;+ System.SysUtils; 
 + 
 + function Calculate(A : Integer; B : Double) : Double; 
 + begin 
 +   Result := A * B; 
 + end;
    
-procedure Output(); + procedure Output(AStr : String; _A : Integer; _B : Double); 
-var LStr : String;+ var LStr : String; 
 + begin 
 +   LStr := Calculate(_A, _B).ToString(); 
 +   System.WriteLn(AStr + LStr); 
 + end; 
 + 
 + procedure Main(); 
 + begin 
 +   Output('Result = ', 10, 123.45); 
 + end; 
 begin begin
-  LStr := Calculate(10, 123.45).ToString(); +  Main(); 
-  System.WriteLn(LStr); +end.
-end;+
 </file> </file>
 ==== Special Features ==== ==== Special Features ====
Line 477: Line 491:
 </file> </file>
  
 +===== Global Constants =====
 +
 +<file pascal>
 +const 
 + DEFAULT_STR : String = 'Test' + '-Output-' + 'Test:';
 +</file>
 ===== Local Variables ===== ===== Local Variables =====
 Local variables are declared like Delphi syntax by the "var" identifier. Local variables are declared like Delphi syntax by the "var" identifier.
Line 528: Line 548:
 === Fields === === Fields ===
  
-=== Methods ===+<file pascal> 
 + TTest class 
 + protected 
 + FFieldBool : Boolean; 
 + FFieldStr : String; 
 + FFieldInt : Int32; 
 +  
 + public 
 + FFieldDbl : Double; 
 + FFieldObj : TTest; 
 + end; 
 +</file>
  
 === Properties === === Properties ===
 +
 +Properties are a very useful tool to access fields directly or by a getter or setter method.
 +In the following example we extend our TTest class by a GetFieldBool() and SetFieldBool() protected method.
 +In the public property "FieldBool" we can access the protected field "FFieldBool" by those methods
 +indirectly. We than have the option to influence behaviour.
 +
 +The second property "FieldStr" is set to read-only on our protected field "FFieldStr", which forbids writing to. Of course this can also be done by getter or setter methods.
 +
 +The third property "FieldInt" allows reading and writing operations directly on the protected field "FFieldInt"
 +
 +Note: You can mix getter/setter methods and direct field access on read/write.
 +
 +<file pascal>
 + TTest = class
 + protected
 + FFieldBool : Boolean;
 + FFieldStr : String;
 + FFieldInt : Int32;
 +
 + function GetFieldBool() : Boolean;
 + procedure SetFieldBool(AValue : Boolean);
 +
 + public
 + FFieldDbl : Double;
 + FFieldObj : TTest;
 +
 + property FieldBool : Boolean read GetFieldBool write SetFieldBool;
 + property FieldStr : String read FFieldStr;
 + property FieldInt : Int32 read FFieldInt write FFieldInt;
 + end;
 +</file>
 +
 +=== Methods ===
 +
 +Functions and procedures declared in a class, interface or record are called methods.
 +Those can be defined in all available viewspaces (private, protected, public, published) like fields.
 +
 +But besides a simple object method declaration, Delphi offers constructors, destructors
 +and class functions / class procedures. They are declared by a different reserved word, because their
 +behaviour is a bit different than the simple methods.
 +
 +Constructors are getting automatically called on instance creation and destructors when an instance is about to be destroyed.
 +
 +Class functions / procedures OR static methods are like simple functions and procedures, but they are called in different context.
 +Regular functions/procedures are called by an instance (object) of the class, while static methods are called by the class itself.
 +So they have no instance context and therefore no access to fields or object methods.
 +
 +This is getting important, when using "Self" in those methods. For static methods it is the class type itself, but for object methods it's the object.
 +
 +<file pascal>
 + TTest = class
 + protected
 + [...]
 + function Calculate(AFactor : Double) : Double; virtual;
 +
 + public
 + [...]
 + constructor Create(); virtual;
 + destructor Destroy(); override;
 +
 + class function GetDefaultStr() : String;
 +
 + procedure Output(AIdx : Integer);
 + end;
 +</file>
 +
 +After our method head declaration is done, we need to implement the function.
 +
 +<file pascal>
 +/// <summary>
 +/// Test Scripting Unit
 +/// </summary>
 +unit app.test;
 +
 +interface
 +
 +const 
 + DEFAULT_STR : String = 'Test' + '-Output-' + 'Test:';
 +type
 + TTest = class
 + [...]
 + end;
 +
 +implementation
 +
 +{ TTest }
 +
 +constructor TTest.Create();
 +begin
 + inherited Create();
 +
 + // use property test
 + Self.FieldBool := true;
 +
 + Self.FFieldStr := 'Hello World';
 + Self.FFieldInt := 124;
 + Self.FFieldDbl := 1.25;
 + Self.FFieldObj := Self;
 +end;
 +
 +destructor TTest.Destroy();
 +begin
 + inherited Destroy();
 +end;
 +
 +function TTest.GetFieldBool() : Boolean;
 +begin
 + Result := Self.FFieldBool;
 + System.WriteLn('TTest.GetFieldBool() called');
 +end;
 +
 +procedure TTest.SetFieldBool(AValue : Boolean);
 +begin
 + Self.FFieldBool := AValue;
 + System.WriteLn('TTest.SetFieldBool() called');
 +end;
 +
 +class function TTest.GetDefaultStr() : String;
 +begin
 + Result := DEFAULT_STR;
 +end;
 +
 +procedure TTest.Output(AIdx : Integer);
 +var LTmpStr : String;
 +    LSeed : Single;
 +begin
 +    LSeed := System.RandomFloat();
 + LTmpStr := TTest.GetDefaultStr() +
 + 'Object{' +
 + '"fieldStr":"' + Self.FFieldStr +
 + '", "fieldInt":"' + Self.FFieldInt.ToString() +
 + '", "fieldDbl":"' + Self.FFieldDbl.ToString() +
 + '", "fieldBool":"' + Self.FieldBool.ToString() +
 + '", "fieldObj":"' + Self.FFieldObj.ToJSON() +
 + '"}';
 + LTmpStr := AIdx.ToString() + #9' [' + LSeed.ToString() + ']'#9#9 + LTmpStr + 
 + ' => ' + Self.Calculate(AIdx * 0.5).ToString();
 + System.WriteLn(LTmpStr);
 +end;
 +
 +function TTest.Calculate(AFactor : Double) : Double;
 +begin
 + Result := Self.FFieldInt.ToDouble() + Self.FFieldDbl * AFactor;
 +end;
 +
 +end.
 +</file>
 ==== Native ==== ==== Native ====