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:20] – [Scripting] admin0.8.3:scripting [2021/10/13 13:42] (current) – [Global Functions] admin
Line 491: 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 552: Line 558:
  FFieldDbl : Double;  FFieldDbl : Double;
  FFieldObj : TTest;  FFieldObj : TTest;
 + end;
 +</file>
 +
 +=== 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;  end;
 </file> </file>
Line 557: Line 596:
 === Methods === === Methods ===
  
-=== Properties ===+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 ====