# Builtin Runtime Objects 文档类型:语法主线 是否可直接用于生成代码:仅部分 是否含已验证可执行示例:是 是否含已验证反例:否 遇到不确定时跳转到:[23_object_runtime_and_introspection.md](23_object_runtime_and_introspection.md)、[30_runtime_services_and_global_cache.md](30_runtime_services_and_global_cache.md)、[12_pitfalls.md](12_pitfalls.md) 手册位置:第 24 篇,共 32 篇。上一篇:[23_object_runtime_and_introspection.md](23_object_runtime_and_introspection.md)。下一篇:[25_set_operations.md](25_set_operations.md)。 这一篇只收当前解释器下已经实际跑通的运行时内置对象最小模型。这里讲的是语言运行时对象,不是金融业务 API。 ## 这一篇解决什么问题 回答“写普通 TSL/TSF 脚本时,哪些内置对象可以直接创建,最小可用接口是什么,哪些对象其实依赖特定运行上下文”。 ## 必须记住的规则 - 当前 CLI 里,`TStringList` 已验证可以直接 `CreateObject("TStringList")` 创建。 - `TStringList` 当前已验证支持数字下标、字符串键下标、`Count` 和 `Add(...)`。 - 流对象应先按 `TStream` 家族理解;当前 CLI 里最小可靠入口是 `TMemoryStream` 这种具体类型。 - 当前 CLI 里,直接 `CreateObject("TStream")` 会失败,错误信息包含 `function:tstream compile error or not found`。 - `TMemoryStream` 当前已验证支持 `Write(...)`、`Read(...)`、`Position`、`Size`。 - `TCipher` 当前不是“无参即可创建”的对象;`CreateObject("TCipher")` 会失败。 - `TCipher` 当前已验证可用的最小写法是 `CreateObject("TCipher", 2)`,然后设置 `Password` 再做 `Encrypt(...)` / `Decrypt(...)`。 - `TWebRequest` 和 `TWebResponse` 在当前 CLI 环境里没有通过直接 `CreateObject(...)` 的最小样例。 - 因此,WEB 请求 / 响应对象不要直接写进普通命令行脚本模板;它们应视为特定运行上下文对象。 ## 已验证语法 ### `TStringList` 代码块身份:已验证可执行示例 ```tsl program test; begin obj := CreateObject("TStringList"); obj.CommaText := "A=aaa,B=bbb,C=222"; WriteLn(obj[1]); WriteLn(obj["B"]); WriteLn(obj.Count); obj.Add("D=444"); WriteLn(obj.Count); end. ``` 已验证运行结果: - 依次输出 `B=bbb`、`bbb`、`3`、`4` - 说明当前既可以按数字下标取整行,也可以按键名取 `Name=Value` 里的值 ### `TStream` 家族的最小可靠入口:`TMemoryStream` 代码块身份:已验证可执行示例 ```tsl program test; begin mem := CreateObject("TMemoryStream"); buffer := "ABC"; mem.Write(buffer, 3); mem.Position := 0; outbuf := "xxx"; mem.Read(outbuf, 3); WriteLn(outbuf); WriteLn(mem.Size); try base := CreateObject("TStream"); WriteLn(ifObj(base)); except WriteLn("TStreamError"); WriteLn(ExceptObject.ErrInfo); end; end. ``` 已验证运行结果: - 前两行输出 `ABC`、`3` - 后两行输出 `TStreamError`,以及包含 `function:tstream compile error or not found` 的错误信息 - 说明当前 CLI 里应优先使用 `TMemoryStream` 这类具体流对象,不要把裸 `TStream` 当成可直接创建对象 ### `TCipher` 代码块身份:已验证可执行示例 ```tsl program test; begin try bad := CreateObject("TCipher"); WriteLn("NoArg"); WriteLn(ifObj(bad)); except WriteLn("NoArgError"); WriteLn(ExceptObject.ErrInfo); end; cipher := CreateObject("TCipher", 2); cipher.Password := "Tinysoft"; enc := cipher.Encrypt("abc"); WriteLn(enc <> "abc"); WriteLn(cipher.Decrypt(enc)); end. ``` 已验证运行结果: - 前两行输出 `NoArgError`,以及包含 `New Class tcipher Error.` 的错误信息 - 后两行输出 `1`、`abc` - 说明 `TCipher` 当前必须按“带模式参数创建”来写,随后可稳定走 `Password -> Encrypt -> Decrypt` ### `TWebRequest` / `TWebResponse` 的 CLI 边界 代码块身份:已验证可执行示例 ```tsl program test; begin try req := CreateObject("TWebRequest"); WriteLn("ReqOk"); WriteLn(ifObj(req)); except WriteLn("ReqError"); WriteLn(ExceptObject.ErrInfo); end; try resp := CreateObject("TWebResponse"); WriteLn("RespOk"); WriteLn(ifObj(resp)); except WriteLn("RespError"); WriteLn(ExceptObject.ErrInfo); end; end. ``` 已验证运行结果: - 先输出 `ReqError`,随后错误信息包含 `function:twebrequest compile error or not found` - 再输出 `RespError`,随后错误信息包含 `function:twebresponse compile error or not found` - 说明当前 CLI 环境下,WEB 请求 / 响应对象不能直接按普通 `CreateObject(...)` 脚本对象来写 ## 暂不在本页展开的对象 - `TFileStream` - `TIniFile` - `TMemIniFile` - `THashedStringList` - `TRSA` - `FTP` / `SMTP` / `POP3` - `MailMsg` / `MessagePart` - `TCookie` / `TCookieCollection` - `TSessionMan` / `TSession` 这些对象旧资料里都出现过,但当前这一篇先只保留“新 session 最容易直接用到”的最小主干。需要把其中某个对象升级进主线正文时,应先补最小脚本再写结论。 ## 跳转指引 - 回看对象主线:见 [09_objects_and_classes.md](09_objects_and_classes.md) - 看对象运行时反射:见 [23_object_runtime_and_introspection.md](23_object_runtime_and_introspection.md) - 看运行时服务与缓存:见 [30_runtime_services_and_global_cache.md](30_runtime_services_and_global_cache.md) - 看对象重载与遍历:见 [32_object_overloads_and_iteration.md](32_object_overloads_and_iteration.md)