Delphi 11.1的全部更新内容,给准备升级的同学参考!

Delphi每次发新版本我都是到了迫不得已的时候才会去升级,IOS平台为了上架已经将项目升级到了11,到现在Android还在用10.4.2,我也想升级到11.1,不过还是遇到一些问题,至今一些项目还是编译不过,有些编译过了也会闪退,需要花时间去找原因,所以,今天看了一下Delphi 11.1有什么更新,希望对我的项目升级有所帮助。

找到官方的What’s New:

https://docwiki.embarcadero.com/RADStudio/Alexandria/en/What%27s_New#VCL_and_FireMonkey_Changes

Delphi 11.1更新了如下内容:

  1. 新的IDE改进

高DPI的IDE

Delphi、C++Builder和RAD Studio IDE现在已经启用了高DPI。在运行时启用高DPI现在已经是一个运行时的选项了。所有在IDE中的窗体现在都支持高DPI。这包括一些动作比如当窗体从一个显示器被拖动到另一个显示器时的显示比例更改。包括:

  • 主窗体
  • 所有的停靠式窗体,比如Object Inspector、工程视图、结构视图、消息视图等等。当然也包括所有的属性编辑器。
  • 所有的对话框,比如新建项、IDE选项和工程选项、关于等
  • 所有的内容窗体比如编辑器、窗体设计器、历史等

IDE的样式(浅色、深色和山雾)已经更新为支持高DPI。

VCL窗体设计器的高DPI

在RAD Studio 11.0中,VCL窗体设计器可以处理三种不同方式的缩放。你可以在Tools->Options->User Interface>Form Designer>High DPI中自定义。这些可用的选项是自动(屏幕PPI)、低DPI(96DPI)以及用户可编辑(你可以设置一个指定的PPI值)。

FMX窗体设计器的高DPI

FireMonkey设计器缩放一个窗体使用和它在运行时一样的方式。坐标保持相同(也就是,一个按钮在设计时放在(20,20),在运行时也会被放在(20,20),不管FMX设计器所在显示器的高DPI缩放设置。),它只是一个视觉缩放。

欢迎页面

一个新的基于VCL的欢迎页面已经添加到了IDE中。它被设计为:

  • 拥有多块区域,可以被添加、删除,或者它们的位置和尺寸可以按照你想要的进行排列。
  • 完美适配高DPI
  • 使用我们自己的技术

Open Tools API更新

所有传递图片的API,例如启动屏幕服务、关于窗体、IDE Insight,以及其他方面已经更新为支持高DPI图片。这允许你传递同个图片的多个比例,它们被添加到一个内部图片集合,以及使用一个虚拟的图片列表。尽管方法接受一个任何TGraphic图片类型的数组,但我们建议使用PNG图片。

设计器中的VCL样式

VCL控件可以在设计器中使用样式进行渲染。这个功能默认不启用,可以在Tools>Options窗体中,User Interface>Form designer中。选项的名称为“Enable VCL Style”。

StyleName属性编辑器展示工程中所有可用的样式,记住,如果你选择了“Windows”,它意味着平台样式,如果你保留这个属性为空,它将会使用父控件(或父窗体)的样式。

注意VCL窗体设计器现在有一个自定义Windows10样式的标题栏和框,而不是使用传统Windows的框。如果窗体样式没有设置,它使用Windows 10样式。如果窗体设置为使用一个VCL样式,框架会显示为窗体所选择的样式。

窗体设计和代码编辑

在10.4.2中,在另一个窗口中设计Form时,Design选项卡被禁用。现在,这个选项卡永远会可用,但是如果它在另一个窗口中设计会有一条消息显示;你可以点击一个按钮来将这个设计器带到当前窗口。

选项窗体性能

当前版本的选项窗体(包括IDE和工程选项)的加载时间会是之前版本的一部分。过去,当选项窗体打开的时候,所有的选项卡都会被加载,现在,页面只会在当它需要被显示的时候才加载。

第三方供应商应注意此更改对其设置框架的影响。

FireMonkey设计指南和边距

在Delphi 11.0中的FireMonkey设计器引入了VCL设计器中的指南和其他功能,并具有不同的实现。当你拖动或更改尺寸的时候组件会显示提示。此外,控件提供了对齐指南,并显示标准边距距离和一条线。

窗体和组件的尺寸调整控件现在和VCL的窗体设计器具有相同的外观了。

IMG_256

IMG_256

IMG_256

为Visiual Studio Code和其他编辑软件提供Delphi LSP

在RAD Studio 11.0中,Delphi LSP可以用在其他编辑器中。作为其中的一部分,我们使用Delphi LSP创建了一个Visual Studio Code的扩展。

Code Insight(DelphiLSP)提升

DelphiLSP

在RAD Studio 11.0中的LSP专注质量并确保它是传统Code Insight的强大替代品。关键的提升包括可以解析包含文件的单元;服务重启的改进;以及对服务器理解语法元素的改进。

传统的代码自动完成被去除

Delphi传统的代码自动完成已经从IDE中被去除。只有LSP选项用于Delphi Code Insight。

Build Events的警告

Build Events可以在你的系统上执行任意命令。从在线的第三方获取工程(包括Build Events)很常见,现在当一个工程在任意配置中包含build event时RAD Studio会发出警告(包含当前你没有编译的工程)。

其他IDE的改进

代码编辑器现在使用Consolas作为默认的字体。一些其他通用的代码字体,比如Fira Code,被安装在IDE中。注意编辑器不支持连字,但是它确实使用这些新字体清晰地渲染高DPI。“View Messages”已经恢复到编辑器上下文菜单中。

  1. Delphi工具链改进

新的macOS ARM 64位目标平台

RAD Studio 11.0支持一个新的Delphi目标平台,macOS ARM 64位,来原生的针对新的M1 Apple Silicon CPU以及macOS 11操作系统。你可以使用这个平台来生成原生的M1应用(当然这要求M1硬件来运行)。我们保持我们Intel 64位目标平台的支持,并且可以创建同时包含ARM和Intel二进制包的通用程序,将它们保留在一个包中。

通用二进制包

你可以创建一个同时包含Intel和ARM代码的通用的二进制包。为此,确保目标平台为macOS ARM 64位。在工程选项中(确保macOS 64位为当前的平台)导航到Building>Delphi Compiler>Compiling>Other,勾上“Generate macOS universal binary file(X86_64+arm64)”。确保你布署了应用,你可以在OSXARM64\Debug目录下找到通用二进制包。

MacOS的一些弃用

在RAD Studio 11.0中,Macapi.QTKit单元在macOS/X64下被弃用,并且它从macOS/Arm64库中被移除。我们也从同时在macOS/X64和Arm64库中移除了“Macapi.Quicktime”单元。

二进制序列和数字分隔符

除了十进制和十六进制之外,Delphi 语言还增加了对二进制序列的支持。 二进制序列使用 % 符号作为前缀(与其他 Pascal 编译器使用的语法相同):

该语言还引入了一个数字分隔符,可用于提高具有多位数字的文字值的可读性。 分隔符是下划线“_”,在解析和编译代码时基本会被忽略。 这与 C# 7.0 中引入的功能非常相似。

当然,您可以将数字分隔符用于二进制序列。

对 AVX 指令的内联汇编程序支持 (AVX-512)

我们为更新的指令集引入了对 asm 代码的支持,包括 AVX2 (ymm) 和 AVX512 (zmm)。

  1. VCL和FireMonkey的改进

在RAD Studio 11.0中我们完成了大量对于VCL库的小改进,专注于消除一些剩余的 XP 遗留问题和与 Windows 10 的不一致并改进核心库功能。

TRichEdit组件更新到了RichEdit4.1(MSFTEDIT.dll)

我们更新了 VCL TRichEdit 组件的实现,以支持更新版本的平台控件。 此外,TDBRichEdit.Lines 现在是公共属性。 RichEdit URL 检测具有 EnableURLs、ShowURLHint 和 SetSelTextToFriendlyURL 等新功能。

对 RichEdit 文本属性进行了一些更改,它现在具有其他属性,例如 BackColor、Disabled、Hidden、Link、Offset、RevAuthor 和 Subscript。

TParaAttributes 还具有新类型 cpaAlignment、cpaNumbering、cpaFirstIndent、cpaLeftIndent、cpaRightIndent 和 cpaTabStops。 它还有一个新属性,ConsistentAttributes。

最后,TCustomRichEdit 现在有了一个新的公共方法,RenderRange。

VCL 更新

新的默认字体

对于VCL应用程序,默认字体现在为Segoe UI 9。VCL样工的标题字体也适配为同样的默认字体。

Memo和RichEdit的Margins属性

TCustomMemo中的新的属性,发布在TMemo、TDBMemo、TRichEdit和TDBRichEdit中。

Radiogroup不带框

在TCustomGroupBox中我们有这个公共属性发布在TGroupBox中,它包含ShowFrame、HeaderFont以及DefaultHeaderFont。

TComboBox的DropDownWidth

在TCustomComboBox 和它的子类中(TCustomComboBox 类中为公共属性,在 TComboBox 类为发布属性)中有两个新属性,它们是 DropDownWidth 和 AutoDropDownWidth。

TTreeView 对复选框的支持

现在 TTreeView 定义了支持 CheckBoxes 的新属性。

TWICImage 多帧支持

TWICImage 多帧支持,TWICImage 类型中有 2 个新属性定义为 FrameCount 和 FrameIndex。 这两个属性一起允许您读取多帧图像文件中的所有有效帧。

新的 TLabelDBEdit 组件

现在有一个数据感知版本的 TLabeldEdit VCL 控件。

此外,RAD Studio 11.0 在 TFlowPanel 和 TGridPanel 容器中添加了对 TLabeledEdit 控件的支持。

错误消息改进

  • 如果从流创建窗体时出错,错误消息现在包括窗体文件名。
  • 异常对话框有一个额外的“复制”按钮,用于将错误消息复制到剪贴板

NumberBox

10.4.2 中引入的 TNumberBox 类具有一些附加功能:

  • CurrencyFormat 类型从 Byte 更改为 TNumberBoxCurrencyFormat。
  • 有一个新的 ValueCurrency 属性。
  • DisplayFormat 属性现已发布。

线程安全改进

通常,UI控件应该在主线程中被创建。如果你在后台线程中创建了一个VCL控件,这个行为是不允许的并且能导致相当奇怪的access violation异常。

为此,有一个新的类属性:TControl.RaiseOnNonMainThreadUsage

当此属性为 True 时,如果在不是主线程的线程中创建 TWinControl 窗口句柄,VCL 将引发异常。 这可以防止意外完成时出现问题。 在 COM 场景和其他情况下,在辅助线程中创建句柄可能是合法的,因此仍然允许。

VCL StyleUtils.inc 转换为常规单元

包含文件 StyleUtils.inc 已转换为常规单元,允许开发人员(和组件供应商)更好地将其代码与 VCL 样式支持集成。 之前的包含文件,其实定义的私有类型一般是不可能修改和扩展的,不像新的单元。

一些细微的改动

  • 常见对话框如何公开属性 EncodingIndex 和 ShowEncodingList(控制下拉编码列表是否启用并因此可用)
  • TTrackbar 的 OnTracking 事件(当轨迹栏上的拇指位置发生变化时触发)。
  • 在 TPageControl.FindNextPage 中使用附加的 CheckTabEnabled 参数禁用的跳过选项。
  • TButtonCategory 有一个 VisibleGutter 属性。
  • TDateTimePicker 和 TRichEdit 在未启用时正确显示。
  • 在此版本中,TScrollBox 自动支持鼠标滚轮——请注意,此更改可能会以不需要的方式影响现有应用程序的行为,因为新的默认设置是为没有焦点的控件激活鼠标滚轮滚动。
  • VCL 函数 ScaleImage 支持 Alpha 通道。
  • TVirtualImageList.Images 有一个适当的属性设置器。
  • TTreeNode 提供对 nsDropHilited 状态的支持。
  • 默认表单大小现在更大。
  • SetSelText 和 SetSelTextBuf 提供不重置 Undo 缓冲区的选项。
    • 这是由新属性 CanUndoSelText 管理的。默认为 False,保持向后兼容性。如果设置为 True,它允许调用 Undo(或使用 UI 调用 Undo 操作)以撤消调用 SetSelText 或 SetSelTextBuf 或通过分配给 SelText 属性所做的更改。
  • 一些小的 TEdgeBrowser 改进。
  • TCustomTitleBarPanel 现在具有 TitleButtonClose、TitleButtonRestore、TitleButtonMin 属性和 OnUpdateTitlebarButtons 事件。
  • TDateTimePicker 允许在 UI 中同时更改日期和时间
  • TPngImage 对象处理与 TWICImage 对象的分配
  • TWinControl 现在支持 LockDrawing 和 UnlockDrawing,触发 WM_SETREDRAW Windows 消息的执行:
    • 方法 TWinControl.LockDrawing 禁用控件更新
    • 方法 TWinControl.UnlockDrawing 启用控件更新
    • 如果调用了 LockDrawing(并且未调用 UnlockDrawing),则属性 TWinControl.IsDrawingLocked 返回 True
    • 当 Win32 控件绘图被禁用时,属性 TWinControl.RedrawDisabled 返回 True

FireMonkey的改动

对于 FireMonkey,我们专注于一些核心重构,尤其是桌面和 Windows。 现在 macOS 和 Windows 的平台服务重构为单独的单元,扩展了 IFMXMultiDisplayService 和 TDisplay,将所有与指标相关的服务提取到 FMX.Platform.Metrics、表单的约束大小以及重构:

  • IFMXSaveStateService
  • IFMXDeviceService
  • IFMX虚拟键盘服务
  • IFMXTimerService
  • IFMXLoggingService
  • IFMXMenuService

Windows 的 TWebBrowser 组件通过平台 WebView 2 组件扩展了对 Chromium Edge 的支持,类似于现有的 VCL TWebBrowser 支持。 您可以使用 TWebBrowser 的新 WindowsEngine 属性选择浏览器引擎。

Google Play Billing版本 4

RAD Studio 11.0 提供对最新版本的 Google Billing API 的支持,该更新将在今年晚些时候成为 Play Store 应用程序的强制性更新(最终截止日期为 21 年 11 月)。 新 API 与 FMX 库无缝集成,您的代码应该很容易适应新 API。

Android 30 API 支持

Android API 30 支持包括以下更改

  • 支持以 Android API 30 为目标(2021 年的 Google Play 商店要求)
  • 我们还从旧的“支持库”库迁移到新的“AndroidX”库

此外,对于 Android,RAD Studio 现在支持“multidex”功能(允许您的应用程序生成多个“classes.dex”文件)并使用更新的“D8”DEX 编译器而不是旧的“DX”编译器来编译 Java 字节码为DEX。 新版本包括一组不同的 Java 库,这使得旧项目不兼容。 当您使用旧版本的 RAD Studio 打开 Android 项目构建时,您需要:

  • 导航到工程视图。
  • 选择 Android 32 位或 Android 64 位作为当前目标平台。
  • 右键单击Libraries节点。
  • 单击“Revert System Files to Default”菜单项。

其他改进

  • Firemonkey Accessibility Pack 现在集成在核心产品中(而不是单独下载)
  • 改进了样式和平台控件组合的 Z-Order 管理
  • 删除了旧的不推荐使用的非范围枚举值(即添加了 FMX Helper 类以支持 2014 年不推荐使用的枚举)
  • 在Android平台上支持TWebBrowser文件上传
  1. RTL和Data

核心 RAD Studio 库中有许多改进。 在这里,我们总结了 RTL、FireDAC、HTTP 和 REST 客户端库等的关键变化。

平台标识符

RTL 为 macOS/Arm64 平台添加了一个新的平台标识符 pidOSXArm64。 现有的 pidAndroid32Arm 和 pidAndroid64Arm 标识符被新的 pidAndroidArm32 和 pidAndroidArm64 取代。 现在,所有与平台相关的标识符都使用相同的编译器格式和顺序:<Platform name> <Architecture name> <Bitness>

RTL:TZipFile

我们专注于 ZIP 文件(即 RTL 的 TZipFile 类)质量、改进和优化。 我们添加了对 Zip64 的支持以及在 TZipFile 中删除文件的方法。 此外,TZipHeader 有一个 GetFIleName 方法,TZipFile.IsValid() 接受一个流参数,而 System.Zip 适用于大于 4 GB 的文件。

RTL 大型数据结构改进

我们在 64 位编译器下为更大的内存结构使用正确的数据类型方面做了一些改进。 例如,64 位的 TMemoryStream 支持大于 2 GB 的数据结构。 与此相关,我们添加了新方法 TThread.GetTickCount64(而现有的返回 32 位值的 TThread.GetTickCount 保留在 RTL 中以保持兼容性)。

新的Record Helpers

TDateTime 有一个新的record helper,其中包括一个“UTC Now”功能(在原始日期 RTL 中不可用),实际上称为 NowUTC。 此版本还为 Delphi 中的 TCurrency 数据类型引入了一个helper, TCurrencyHelper,类似于 TDoubleHelper。

蓝牙和 BLE 改进

这方面的改进包括经典蓝牙和蓝牙 LE 以及大多数平台,特别关注 Windows 10 和 Android(以及 iOS 和 macOS)。 改进还包括Beacons支持。

其他 RTL 增强功能

泛型集合改进

当使用多个泛型类型时,一些泛型集合曾经将 TKey 和 TValue 作为泛型类型的符号名称。 现在这令人困惑,因为 TValue 是 RTL 中的特定类型。 为避免混淆,符号名称已更改。 对现有代码没有影响,因为在实例化泛型类型时,符号名称将替换为具体类型。 此外,集合类的其他构造函数很少,它们将值数组作为参数,包括:

TDictionary Capacity、GrowThreshold 和散列的实现得到了改进,在性能/内存使用/最小冲突之间取得了更好的平衡。 内部实现类 TListHelper 已被删除,以支持使用强类型字段 TArray<T>,更新所有相关的流和数据映射代码。

RTTI

对 RTTI 的开放数组支持:允许通过 RTTI 调用具有开放数组参数的方法,并且还支持 TVirtualMethodInterceptor 中的开放数组参数。 TValue 添加了对 TDateTime 的特定支持。 此外,TValue 和 Variant 类型的互换也得到了改进。

PPL

使 PPL 线程池统计信息更易于访问,这意味着 TThreadPoolStats.Get 方法现在是公共的

新的 TPointerStream 类,通过指示指针位置和大小,允许使用 TStream 接口读取和写入内存数据。 TStream.CopyFrom 不需要大小,这可能是未知的。 当 Count 很大时,该方法也得到了优化(提高了 400%)。

日期到字符串转换

日期到字符串和反向转换已得到改进。 值得注意的是,现在 StrToDate 严格遵循“to date”格式字符串,支持带有月份和日期名称的日期格式,并支持带有任意文本的日期格式。 还改进了 TFormatSettings 与日期/时间相关的属性初始化,并统一了所有平台上的表示。

创建接口实例

有一个新的 System.Generics.Defaults._MakeInterfaceInstance 允许创建接口实例,其中所有接口方法都由匿名方法表示。

TNoRefCountObject

新类 System.TNoRefCountObject 是一个非引用计数的 IInterface 实现(替换旧的和奇怪的命名 TSingletonObject)

优化和其他

  • 优化 _FinalizeRecord 和 _FinalizeArray
  • 旧的 TDatamodule.OldCreateOrder 和 TCustomForm.OldCreateOrder 属性已被删除,并且始终默认为 false。如果该属性存在于表单描述文件中,则会被忽略(但不会产生错误)。 legacy 属性用于与旧的创建顺序逻辑兼容,很久以前在 Delphi 的早期版本中。
  • 改进的 Pascal System.Pos
  • TArray<T>.BinarySearch 优化
  • 添加了 TList<T>.Sort( …, Index, Count ) 的重载
  • 添加 System.IOUtils.TFile.Size
  • ClassParent 和 InitInstance 的 TObject 性能修复
  • System.IOUtils.TPath 的一些改进
  • RTL 支持超过 260 个字符的系统路径,如果操作系统支持的话(比如在最新版本的 Windows 上)
  • 添加了类属性 TThread.OnSynchronize
  • EInOutError 和 EInOutArgumentException 消息现在包括路径并具有路径字段。

改进了以下性能:

  • _UInt32ToHexString 和 _UInt64ToHexString
  • TSingleHelper 和 TDoubleHelper 的 Parse 和 TryParse
  • TGUID 数据结构现在仅在 System.pas 中定义

JSON

  • 将 ParseJSONValue() 从 TJSONObject 移动到 TJSONValue
  • 为整数添加了重载的 TJSONObject.AddPair

UTF8ToString 更改

接受 AnsiChar 数组的 UTF8ToString 重载已被删除,并且 UTF8ToString(array of Byte) 已弃用。 删除的函数是:UTF8ToString(const S: _PAnsiChr.

FireDAC

  • PostgreSQL 驱动程序支持最高 v 13 的 PostgreSQL,包括支持 PostgreSQL 存储过程
  • 正式支持 Oracle 19c 和 Oracle 存储过程的 128 个字符的参数名称。
  • 使用 soDigitsAsNumbers 扩展 TFDSortOption,匹配 System.SysUtils 中类似的 TCompareOption。
  • Firedac 监视器 UI 改进。
  • 改进了 Firebird 驱动程序以在 VendorHome 中而不是在 /bin 子文件夹中查找驱动程序(这对于旧版本的 Firebird 是正确的)

Internet、HTTP 和 REST 客户端库

  • 后端和 EMS 客户端组件的超时机制:
    • TEMSProvider、TkinveyProvider、TParseProvider 类有 2 个新属性:ConnectTimeout 和 ReadTimeout
    • TEMSApi.TConnectionInfo、TParseApi.TConnectionInfo、TkinveyApi.TConnectionInfo:有变量 ConnectTimeout 和 ReadTimeout
    • TDSRestConnection 也 ConnectionTimeOut
  • Windows添加了对 HTTP / 2 的支持
    • 新属性 THttpClient.ProtocolVersion
    • 新属性 TNetHttpClient.ProtocolVersion
  • 新的 TBase64URLEncoding 编码和 TNetEncoding.Base64URL 属性
  • 在整个 RTL 中从 gethostbyname 切换到 getaddrinfo,适用于所有平台。
  • 新的 TCertificate.PublicKey,其中包含公钥模数
  • ContentType 现在是字符串类型,而不是枚举。这允许您使用任何一种内容类型字符串。此外,RestRequest 中的新 CustomContentType
  • 在 Windows 的 TNetHTTPClient 中支持 TLS 1.3
  • 对 TSocket 的多项改进
  • 一个新组件 TRESTRequestDataSetAdapter 简化了通过 JSON 将 TDataSet(例如,TFDMemTable)数据上传到服务器。它是服务器端 TRESTResponseDataSetAdapter REST 组件的伴侣。
  • TRESTClient 组件显示底层 HTTPClient 组件的 SecureFailureReasons 属性
  • 在 Vcl.Styles 单元中,TCustomStyle 类 FCustomElements 和 FSource 现在在受保护的部分中声明。

互联网服务器技术

WebBroker

ISAPI DLL 线程有一个可配置的 StackSize,使用变量 Web.Win.ISAPIThreadPool.StackSize。 在发送/流式传输大于 2 GB (MaxInt) 的文件时显着提高了 WebBroker 性能。

RAD Server

RAD 服务器的多部分/表单数据支持

DataSnap

DataSnap:现在可以使用基于 TDSMethodMapEvent 事件的新机制来配置 REST URI

Delphi 11.1的所有更新全部在上面了,对我影响最大的也就是Android更新的那部分,希望早日将Android项目升级到11.1。

非常希望那些已经升级到11.1的同学也讲下心得体会,指导下我。

可以加QQ群(10900297)一起交流Delphi APP开发: