網頁

2025/03/14

程式碼轉換不再難:AI 助你精通 FastReport FastScript

 作者:吳祐賓

 

 


 

 

 

FastScript 是 FastReport VCL / FMX 超棒的產品之一,FastScript 功能非常豐富,七成需求都可以依賴它來完成,不一定要使用肥大的開發工具。

 

FastScript 限制

 

FastScript 也有其限制,例如它不支援以下兩種東西:

  • Class 建立。無法使用 record, class 等 object 來建立自己的物件
  • Set 集合。無法使用 [fsBold, ...]來設定集合

 

使用 AI,在 FastScript 上寫出一手好程式


還好現在有 AI 工具,把提示語給 AI 後,就可以快速寫出正確又有效率的工具出來,真是太棒了!

 

我使用提示語如下,提供給各位讀者參考:


使用 FastReport FastScript 的 JScript 語法建立一個腳本:[
  將 "Hello, World!" 顯示在 Memo1 元件中。(可以代換為你的需求)
]
Refer to the following FastScript JScript syntax rules:[
===
Classes
You cannot define a class inside the script, but you can use the external classes defined in add-in modules or your application.
===
Functions
There is a rich set of standard functions which can be used in a
script. To get an access to these functions, pass the fsGlobalUnit
reference to the TfsScript.Parent property.
===
About FastReport's FastScript:JScript syntax:
Program -> Statements
Statements -> Statement...
Block -> '{' Statements '}'
ImportStmt -> IMPORT (String/,)...
VarStmt -> VAR (VarDecl/',')...
VarDecl -> Ident [Array] [InitValue]Array -> '[' (ArrayDim/',')... ']'
ArrayDim -> Expression
InitValue -> '=' Expression
Expression -> SimpleExpression [RelOp SimpleExpression]...
SimpleExpression -> ['-'] Term [AddOp Term]...
Term -> Factor [MulOp Factor]...
Factor -> Designator
-> UnsignedNumber
-> String
-> '(' Expression ')'
-> '!' Factor
-> '[' SetConstructor ']'
-> NewOperator
-> '<' FRString '>'
SetConstructor -> SetNode/','...
SetNode -> Expression ['..' Expression]
NewOperator -> NEW Designator
RelOp -> '>'
-> '<'
-> '<='
-> '>='
-> '!='
-> '=='
-> IN
-> IS
AddOp -> '+'
-> '-'
-> '||'
-> '^'
MulOp -> '*'
-> '/'
-> '%'
-> '&&'
-> '<<'
-> '>>'
Designator -> ['&'] Ident ['.' Ident | '[' ExprList ']' | '(' [ExprList] ')']...
ExprList -> Expression/','...
Statement -> (AssignStmt | CallStmt | BreakStmt | ContinueStmt |
DeleteStmt | DoWhileStmt | ForStmt | FunctionStmt |
IfStmt | ImportStmt | ReturnStmt | SwitchStmt |
VarStmt | WhileStmt | WithStmt | Block) [';']
BreakStmt -> BREAK
ContinueStmt -> CONTINUE
DeleteStmt -> DELETE Designator
AssignStmt -> Designator ['+'|'-'|'*'|'/']'=' Expression
CallStmt -> Designator ['+''+'|'-''-']
ReturnStmt -> RETURN [Expression]
IfStmt -> IF '(' Expression ')' Statement [ELSE Statement]
SwitchStmt -> SWITCH '(' Expression ')' '{' (CaseSelector)... [DEFAULT ':' Statement] '}'
CaseSelector -> CASE SetConstructor ':' Statement
DoWhileStmt -> DO Statement [';'] WHILE '(' Expression ')' ';'
WhileStmt -> WHILE '(' Expression ')' Statement
ForStmt -> FOR '(' ForStmtItem ';' Expression ';' ForStmtItem ')' Statement
ForStmtItem -> AssignStmt-> CallStmt-> VarStmt-> Empty
TryStmt -> TRY CompoundStmt (FINALLY | EXCEPT) CompoundStmt
FunctionStmt -> FunctionHeading Block
FunctionHeading -> FUNCTION Ident FormalParameters
FormalParameters -> '(' [FormalParam/','...] ')'
FormalParam -> ['&'] Ident
WithStmt -> WITH '(' Designator ')' Statement
]
Specific usage of FastScript JScript: [
#language JScript // this is optional
import "unit1.js", "unit2.js"
Report.Memo1.Text = "HelloWorld"; // Sets the text of Memo1 through the Report object.
Memo1.Text = "HelloWorld";// Equivalent if Memo1 is in the main report scope (not within a sub-component like a Group or Band).
var mbSet = mbYes + mbNo;  // FastScript does not support sets directly; use addition for combining flags.
if (MessageDlg("Welcome to my JScript application. Exit now?", mtConfirmation, mbSet, 0) == mrYes)
{ ShowMessage("OK");}
// import section - must be before any other sections
var i, j = 0; // var section
function p1() // procedures and function
{//
}
// main procedure that will be executed.
p1();
// Dynamic array create. (var myarray = [] not support. Need use the FR TfrxArray Component)
var myarray = new TfrxArray();
myarray[0] = 1;
myarray[1] = 2;
for (i = 0; i < 1; i++) j = i + 1; myarray[i] = myarray[i] + j;
ShowMessage(IntToStr(myarray.Count)); // TfrxArray is not JScript array type.
// You can use the TStrings/TStringList. Same the Delphi TStrings/TStringList.
var myList = new TStringList();
myList.Add("message=HelloWorld");
ShowMessage(myList.Values("message"));
]
The following FastScript built-in functions are available:
## 數學函式 (Mathematical)
Abs(e: Extended): Extended;
ArcTan(X: Extended): Extended;
Cos(e: Extended): Extended;
Exp(X: Extended): Extended;
Frac(X: Extended): Extended;
InRange(AValue, AMin, AMax: Extended): boolean;
Int(e: Extended): Integer;
Ln(X: Extended): Extended;
MaxValue(A, B: Variant): Variant;
MinValue(A, B: Variant): Variant;
Pi: Extended;
Power(A, B: Extended): Integer;
Round(e: Extended): Integer;
Sin(e: Extended): Extended;
Sqrt(e: Extended): Extended;
Tan(X: Extended): Extended;
Trunc(e: Extended): Integer;

## 彙總函式 (Aggregate)
AVG(Band: TfrxComponent): Variant;
AVG(Expr; Band: Variant = 0; Flags: Integer = 0): Variant;
COUNT(Band: Variant = 0; Flags: Integer = 0): Variant;
MAX(Band: TfrxComponent): Variant;
MAX(Expr; Band: Variant = 0; Flags: Integer = 0): Variant;
MIN(Band: TfrxComponent): Variant;
MIN(Expr; Band: Variant = 0; Flags: Integer = 0): Variant;
SUM(Band: TfrxComponent): Variant;
SUM(Expr; Band: Variant = 0; Flags: Integer = 0): Variant;

## 型別轉換函式 (Conversions)
BoolToStr(B: Boolean): string;
DateTimeToStr(e: Extended): String;
DateToStr(e: Extended): String;
FloatToStr(e: Extended): String;
IntToStr(i: Integer): String;
StrToBool(const S: String): Boolean;
StrToDate(s: String): Extended;
StrToDateTime(s: String): Extended;
StrToFloat(s: String): Extended;
StrToInt(s: String): Integer;
StrToInt64(s: String): Int64;
StrToTime(s: String): Extended;
TimeToStr(e: Extended): String;
VarToStr(v: Variant): String;

## 進階字串函式 (String)
Chr(i: Integer): Char;
CompareText(s, s1: string): Integer;
Copy(s: string; from, count: Integer): String;
Delete(var s: String; from, count: Integer);
DeleteStr(var s: String; from, count: Integer);
Insert(s: string; var s2: String; pos: Integer);
Length(s: Variant): Integer;
Lowercase(s: String): String;
NameCase(s: String): String;
Ord(ch: Char): Integer;
Pos(substr, s: String): Integer;
SetLength(var s: Variant; L: Integer);
Trim(s: String): String;
Uppercase(s: String): String;

## 其他函式 (Other)
CreateOleObject(ClassName: String): Variant;
Dec(var i: Integer; decr: Integer = 1);
ExtractFilePath(const FileName: string): string;
IIF(Expr: Boolean; TrueValue, FalseValue: Variant): Variant;
Inc(var i: Integer; incr: Integer = 1);
InputBox(ACaption, APrompt, ADefault: string): string;
InputQuery(ACaption, APrompt: string; var Value: string): Boolean;
MessageDlg(Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
RaiseException(Param: String);
Random: Extended;
Randomize;
ShowMessage(Msg: Variant);
ValidDate(cDate: String): Boolean;
ValidFloat(cFlt: String): Boolean;
ValidInt(cInt: String): Boolean;
VarArrayCreate(Bounds: Array; Typ: Integer): Variant;
VarIsNotNull(V: Variant): Boolean;
VarType(V: Variant): Integer;

## 日期與時間函式 (Date and Time)
Date: TDateTime;
DayOf(Date: TDateTime): Integer;
DayOfWeek(aDate: TDateTime): Integer;
DaysInMonth(nYear, nMonth: Integer): Integer;
DecodeDate(TDate: TDateTime; var Year, Month, Day: Word);
DecodeTime(TTime: TDateTime; var Hour, Min, Sec, MSec: Word);
EncodeDate(Year, Month, Day: Word): TDateTime;
EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
IsLeapYear(Year: Word): Boolean;
MonthOf(Date: TDateTime): Integer;
Now: TDateTime;
Time: TDateTime;
YearOf(Date: TDateTime): Integer;

## 格式化函式 (Formatting)
Format(Fmt: String; Args: array): String;
FormatDateTime(Fmt: String; DateTime: TDateTime): String;
FormatFloat(Fmt: String; Value: Extended): String;
FormatMaskText(EditMask: string; Value: string): string;


前面的提示詞也可以使用:

 

將以下 C# 程式碼片段轉換為使用 JScript 語法的 FastReport FastScript。 該腳本應在 FastReport 環境中實現等效的功能。 請密切注意所提供的 FastScript JScript 語法規則和可用的內建函數。


總結

有了AI後,程式轉換上變得十分容易,從以前要求 Google 關鍵字力,現在要漸漸改為 AI 提示詞力。

 

如果有什麼想回饋的內容,歡迎在底下留言讓我知道。

沒有留言:

張貼留言