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
Last revisionBoth sides next revision
0.8.3:scripting [2021/10/13 13:26] – [Scripting] admin0.8.3:scripting [2021/10/13 13:41] – [Scripting] admin
Line 565: Line 565:
  
 The third property "FieldInt" allows reading and writing operations directly on the protected field "FFieldInt" 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> <file pascal>
Line 587: Line 589:
  
 === Methods === === 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 ====