预订和预约窗体
预订窗体需要一个遵守休息日的入住范围、客人数量、到达时间,也许还有对上次入住的评分。月历强制执行 MinDate、MaxRangeDays 和禁用日期,数值调节框统计客人数,时间选择器接受键入的时间,评分收集反馈,全都使用同一个主题。BookingForm 演示用七个编辑器搭建了一个酒店预订,并带有实时摘要。
- 日历范围
- 数值调节框
- 评分
十五款窗体输入控件,在每台显示器上外观一致,行为如同原生编辑框:带真实预订规则的日历、日期和时间选择器、范围滑块、颜色选择器、标签、星级评分、数值调节框、按钮、搜索、掩码和货币编辑框、多列查找和备注框,外加用于设置的开关、IP 地址编辑框、时间跨度编辑框、字体选择器、复选列表框、双列表框、用于触摸面板的 NumPad 和屏幕键盘。用您自己的语言输入日期,保存前检查整个窗体,一个属性即可切换到深色主题,还能将编辑器绑定到数据集。
十六项功能,让日期、金额、代码、选项和标签输入快捷又不易出错。
十五款输入控件涵盖真实业务窗体的各类字段,每一款都提供 VCL、FireMonkey 和 .NET 版本。
控件一览
预订窗体、设置页面和筛选器总是需要同样的输入:日历、日期或时间选择器、滑块、颜色、标签列表、星级评分、带单位的数字、掩码代码、价格、从长列表中选择、搜索框和备注。sgcEditors 将这十五款控件作为一个风格统一的系列提供给您。每款控件都有 VCL 和 FireMonkey 版本,发布的属性和事件相同,也有 WinForms、WPF 和 Avalonia 版本,名称相同,因此您在一款控件上学到的知识适用于其他所有控件。它们共用同一个主题、同一种强调色和同一套键盘模型。从工具面板的 SGC Editors 页拖放它们,第一次运行就外观正确。
TsgcVCLMonthCalendar、TsgcVCLDatePicker、TsgcVCLTimePicker、TsgcVCLDateTimePickerTsgcVCLRangeSlider 和用于数字的 TsgcVCLSpinEditTsgcVCLColorPicker、TsgcVCLTokenEdit、TsgcVCLRatingTsgcVCLButtonEdit、TsgcVCLSearchEdit、TsgcVCLMaskEdit、TsgcVCLCurrencyEdit、TsgcVCLLookupEdit、TsgcVCLMemoTsgcVCLCustomEditor
控件一览
酒店、诊所或租赁柜台从不会接受任意日期。月历可选择单个日期,或在 SelectionMode 设为 esmRange 时选择一段日期范围,并由 MaxRangeDays 限制范围的最大天数。超出 MinDate 和 MaxDate 的日期、DisabledDates 列出的日期、周末等 DisabledWeekDays,以及您的 OnIsDateDisabled 处理程序拒绝的任何日期,都会以删除线绘制且无法选择。ISO 8601 周数以及月、年和十年视图可帮助用户快速跳转到很远的日期。同一个日历也驱动日期选择器的下拉面板,因此凡是选择日期的地方,规则都同样适用。
SelectionMode:esmSingle 或 esmRangeMinDate、MaxDate 和 MaxRangeDaysDisabledDates、DisabledWeekDays、OnIsDateDisabledShowWeekNumbers 显示 ISO 周数
控件一览 仅限注册版
价格、重量或距离的筛选器,用滑轨上的范围来表达最直观。范围滑块可用一个滑块在 Min 和 Max 之间选取一个值,或在 RangeMode 下用两个滑块选取一个范围,水平或垂直均可。它会绘制刻度、标签,并在被拖动的滑块上方显示数值提示,点击滑轨会把最近的滑块移到该处。两个滑块绝不会交叉,Step 使数值对齐步长,MinRange 保持最小间隔,因此筛选范围不会意外变空。数值和标签遵循控件的区域设置,包括小数点和千位分隔符。
RangeMode 配合 Value 和 EndValueMin、Max、Step 和 MinRangeTickInterval、ShowLabels、ShowValueTipLabelFormat 或 OnFormatLabel 用于货币社区版:只绘制并编辑一个滑块;EndValue 会保留但不显示。
阅读帮助主题
控件一览 仅限注册版
标签、收件人和技能是列表,而不是一行文字。标记编辑框将每个条目绘制为带删除按钮的胶囊,胶囊会自动换行,放不下时可滚动。分隔符、Enter、Tab 或失去焦点都会把输入的文字变成胶囊,粘贴 a, b, c 会生成三个。OnValidateToken 可规范化或拒绝每个条目,AllowDuplicates、CaseSensitive 和 MaxTokens 设置规则。在注册版中,自动补全列表会在用户输入时给出建议。加载或保存记录时,可用 AddToken、RemoveToken 和 Clear 通过代码修改列表。
Tokens 保存胶囊;Delimiters 结束一个胶囊OnValidateToken 和 InvalidTokens 检查每个条目AutoCompleteItems 和 AutoCompleteMinChars 用于建议OnTokenAdded 和 OnTokenRemoved 报告变化社区版:胶囊、验证和限制可用;自动补全列表不会打开。
阅读帮助主题控件一览 仅限注册版
主题编辑器、图表设置和标签设计器需要的不只是固定调色板。颜色选择器将色板网格、饱和度与明度方块、色相条、透明度条,以及带预览和十六进制编辑框的一行叠放在一起,由 Parts 选择显示其中哪些部分。十六进制编辑框接受 #RGB、#RGBA、#RRGGBB 和 #RRGGBBAA。选择器将色相与颜色分开保存,因此灰色也保留其色相,用户拖动时方块不会跳动。您可以把品牌调色板定义为色板,用户仍可一键使用完整的选择器。
Parts 配合 ecpSwatches、ecpHSV、ecpAlpha、ecpHexSwatches 和 SwatchColumns 用于您的调色板SelectedColor 为 ARGB 值OnChangeComplete社区版:仅有色板和十六进制;不绘制 HSV 方块和透明度条,透明度始终为 $FF。
阅读帮助主题控件一览
许多字段需要在文本旁边放一个按钮:浏览文件、打开对话框、清除值。按钮编辑框可在原生编辑框的任意一侧放置浏览、下拉、搜索、清除、加号、减号、文本或自绘按钮,每个按钮都有自己的快捷键,屏幕阅读器会按名称列出每个按钮并可按下它。搜索编辑框在输入暂停后触发 OnSearch,按 Enter 则立即触发,并在下拉历史中再次提供之前的搜索。备注框是带主题的多行编辑器,支持占位符、带可选上限的字符计数器,以及在 MinLines 和 MaxLines 之间随行数变化的高度。
TsgcVCLButtonEdit,带有 Buttons 和 OnButtonClickTsgcVCLSearchEdit,带有 SearchDelay、History 和 OnSearchTsgcVCLMemo,带有 ShowCounter、MaxLength、AutoHeight控件一览
电话号码、邮政编码、账号和价格都需要固定格式。掩码编辑框接受 Delphi EditMask 语法或 .NET MaskedTextBox 语法的输入掩码,因此同一个掩码在 Delphi 和 .NET 应用程序中的行为一致:固定字符保持不变,每个位置只接受对应类型的字符,Text 返回带或不带固定字符的值。货币编辑框存储精确的 Currency 值(.NET 中为 decimal),不使用浮点数。未获得焦点时,它显示区域设置的完整货币格式;用户输入时,显示带符号或 ISO 代码的分组数字。MinValue、MaxValue 和 AllowNegative 将金额限制在范围内。
EditMask 和 MaskSyntax:emxDelphi 或 emxDotNetIsComplete、EditText 和 SaveLiteralsValue、Decimals、CurrencyCode、SymbolModePositivePattern 和 NegativePattern控件一览
客户、产品和国家按名称选择,但按键值存储。查找编辑框打开带可选标题行的多列下拉列表,并随用户输入进行过滤。编辑框显示显示列,KeyValue 保存键值,例如国家名称背后的国家代码。行来自 Items(每行一条,单元格以 | 分隔),或来自用于服务器搜索的 OnGetItems,OnNotInList 决定输入的文本与任何行都不匹配时如何处理。在 .NET 中,行也可以通过 ItemsSource、DisplayMember 和 ValueMember 来自任意集合,适用于 WinForms、WPF 和 Avalonia。
Columns,带有 Title、Width 和 AlignmentKeyColumn、DisplayColumn 和 KeyValueShowHeader、MatchMode、DropDownRowsItemsSource、SelectedValue控件一览
设置页和选项面板用来打开和关闭功能。开关是复选框的现代形式:一条圆角轨道,上面有一个圆形滑块滑向新状态,两侧都可以放可选的标题,需要时轨道内还可以显示“开”和“关”文字。它是自绘的,打开时采用主题的强调色,并随 DPI 缩放。用户的更改会先经过 OnChanging,因此窗体中的规则可以拒绝它,而 OnChange 在每次更改后运行,无论是用户还是代码所做的更改。
TsgcVCLToggleSwitch 和 TsgcFMXToggleSwitch,在 .NET 中为 TsgcWinFormsToggleSwitch、TsgcWpfToggleSwitch 和 TsgcAvaloniaToggleSwitchChecked、Caption、CaptionPosition、带 OnText 和 OffText 的 ShowText、ReadOnly 和 AnimatedTrackOnColor、TrackOffColor 和 ThumbColor,或使用主题的颜色,以及决定轨道大小的 SwitchWidth 和 SwitchHeightOnChanging 通过 Allow 取消用户的更改,OnChange 在每次更改后触发,Toggle 像用户一样更改状态Checked 默认双向绑定,在 WinForms 中它会为数据绑定触发 CheckedChanged开关包含在所有版本中,社区版也不例外。
阅读帮助主题控件一览
网络设置、设备配置和防火墙规则都需要输入地址。在 IPv4 模式下,IP 地址编辑框显示四个以点分隔的八位组字段,并随用户输入自动跳到下一个字段,因此输入地址与普通编辑框一样快,而且格式始终正确:大于 255 的值会被限制,焦点离开时空字段变为 0。在 IPv6 模式下它是一个文本字段,接受十六进制数字、冒号和点,会验证文本,并在焦点离开时按 RFC 5952 规范格式写出,因此 2001:DB8:0:0:0:0:2:1 变成 2001:db8::2:1。
TsgcVCLIPAddressEdit 和 TsgcFMXIPAddressEdit,在 .NET 中为 TsgcWinFormsIPAddressEdit、TsgcWpfIPAddressEdit 和 TsgcAvaloniaIPAddressEditMode 选择 IPv4 或 IPv6,Address 是值,Octets 读取或设置 IPv4 地址的一个字段IsValid 表示地址是否完整,启用 Required 后,为空或不完整的地址会显示主题的错误边框OnChange 在每次更改后触发,Clear 清空地址,屏幕阅读器会看到带有 Value 模式的编辑框Address 默认双向绑定,在 WinForms 中它会为数据绑定触发 AddressChangedIP 地址编辑框包含在所有版本中,社区版也不例外。
阅读帮助主题控件一览
超时、间隔或运行时间是一段时长,而不是一天中的某个时刻。时间跨度编辑框按天、小时、分钟、秒和毫秒的分段显示它,用户通过输入、方向键、鼠标滚轮或微调按钮一次编辑一个分段。一次步进会进位到下一个分段,因此 59 秒加一是一分钟,而且显示的最高分段没有上限,所以不显示天时,50 小时显示为 50:00:00。
TsgcVCLTimeSpanEdit 和 TsgcFMXTimeSpanEdit,在 .NET 中为 TsgcWinFormsTimeSpanEdit、TsgcWpfTimeSpanEdit 和 TsgcAvaloniaTimeSpanEditValue 在 Delphi 中以毫秒表示,在 .NET 中是 TimeSpan,并提供 Days、Hours、Minutes、Seconds 和 Milliseconds 各部分Segments 选择显示的分段,DisplayFormat 以时钟格式 1.02:30:05.250 或带单位的格式 1d 2h 30m 5s 250ms 写出值MinValue 和 MaxValue 限制值,AllowNegative 接受前导负号,Increment 和 ShowButtons 设置步长和微调按钮Value 默认双向绑定,在 WinForms 中它会为数据绑定触发 ValueChanged时间跨度编辑框包含在所有版本中,社区版也不例外。
阅读帮助主题控件一览
报表设计器、标签编辑器和设置页都会让用户选择字体。字体选择器是一个带下拉按钮的编辑框,其列表用各自的字体绘制每个字体系列。输入可筛选字体系列,最近选择的系列列在分隔线上方的最前面,还有一个筛选器只保留等宽字体系列,适用于代码编辑器或终端。在应用程序填充列表之前,列表来自平台。
TsgcVCLFontPicker 和 TsgcFMXFontPicker,在 .NET 中为 TsgcWinFormsFontPicker、TsgcWpfFontPicker 和 TsgcAvaloniaFontPickerFontName 是值,Fonts 是字体系列列表,RefreshFonts 在安装字体后重新加载列表ShowPreview 用各自的字体绘制每个名称,PreviewText 在名称后添加示例文本RecentCount 和 RecentFonts 保存最近选择的系列,供应用程序保存并重新加载FontFilter 只保留等宽字体系列,Alt+向下键打开列表,回车键或单击选择系列,Esc 关闭列表FontName 默认双向绑定字体选择器包含在所有版本中,社区版也不例外。
阅读帮助主题控件一览
网格的列、报表的筛选条件或许可的模块,都是很长的选项列表。复选列表框是一个可滚动的列表,每一行都有一个复选框,可以是未选中、选中或灰色,每个项目还有一个启用标志。可选的全选标题行会选中或取消选中所有已启用的项目,可选的筛选框会隐藏不包含所输入文本的行,但不改变它们的状态。只绘制可见的行,因此 10000 个项目的列表依然流畅。
TsgcVCLCheckListBox 和 TsgcFMXCheckListBox,在 .NET 中为 TsgcWinFormsCheckListBox、TsgcWpfCheckListBox 和 TsgcAvaloniaCheckListBoxItems 的每个项目带有 Checked、State 和 ItemEnabled,AllowGrayed 提供第三种状态ShowCheckAll 显示三态的全选行,ShowFilter 显示筛选框CheckAll、UncheckAll 和 CheckedCount,以及在用户更改时先于 OnChange 触发的 OnClickCheckCheckedItems 和 CheckedIndices 是用于绑定的只读列表,ItemCheck 事件先于 Change 触发复选列表框包含在所有版本中,社区版也不例外。
阅读帮助主题控件一览
选择报表的列、小组的成员或流程的步骤,意味着把项目从一个列表移到另一个列表。双列表框在左侧绘制可用列表,在右侧绘制已选列表,中间的按钮移动选中的行或所有行,外侧的上移和下移按钮对已选列表重新排序。双击或拖动会把项目移到另一个列表,在已选列表内拖动则会重新排序。
TsgcVCLDualListBox 和 TsgcFMXDualListBox,在 .NET 中为 TsgcWinFormsDualListBox、TsgcWpfDualListBox 和 TsgcAvaloniaDualListBoxAvailableItems 和 SelectedItems、AvailableCaption 和 SelectedCaption、ShowCaptions 和 ShowReorderButtonsSortAvailable 按顺序插入移回的项目,ShowFilter 在每个列表上方添加筛选框,ReadOnly 保留选择并拒绝移动MoveToSelected、MoveAllToSelected、MoveToAvailable、MoveAllToAvailable、MoveUp 和 MoveDown 的作用与按钮相同OnMoving 可以让某个项目留在原处,OnChange 每次操作只触发一次SelectedItems 默认双向绑定,在 WinForms 中它会为数据绑定触发 SelectedItemsChanged双列表框包含在所有版本中,社区版也不例外。
阅读帮助主题为键盘用户提供快速输入,保存前检查每个字段,为每位用户提供合适的语言,并可直接链接到您的数据集。
输入、语言与数据
数据录入人员是键入日期的,而不是在日历里一路点击。sgcEditors 的每个文本字段都是平台的真实编辑控件,因此日语、中文和韩语的输入法组合、剪贴板、撤销、上下文菜单和屏幕阅读器都能正常工作。解析很宽松:斜杠、连字符、点、冒号、逗号或空格都可分隔各字段,区域设置中的月份和星期名称也能识别,两位数年份会按基准年处理。上下键可滚动光标所在的部分,无法解析的文本会触发 OnParseError。
DisplayFormat 使用 d、m、y、h、n、s 段OnParseError 用于接受或拒绝异常输入AllowEmpty 和 TextHint 用于可选字段输入、语言与数据
车间里的触摸面板没有键盘,而系统键盘会遮住半个屏幕。NumPad 以足够用手指或戴手套操作的大按键输入数字。在窗体上放置一个停靠的键盘,它会写入获得焦点的控件;也可以给控件附加一个下拉键盘,点按控件即可在其下方打开键盘。目标无需任何改动:键盘读取其范围和小数位数,并把数值作为用户更改写入,因此目标的舍入、限值和 OnChange 的运行方式与用户亲自输入时完全相同。
TsgcVCLNumPad 和下拉形式的 TsgcVCLNumPadPopup,也提供 FireMonkey 版本和 .NET 版本Associate 选择目标,或让键盘跟随获得焦点的控件NumPad 包含在每个版本中,社区版也不例外。它是面向操作员画面的 sgcUI HMI 套件的一部分。
阅读帮助主题输入、语言与数据
自助终端、自助服务机或操作员面板除了数字,还需要输入姓名、编码和备注。屏幕键盘是建立在与 NumPad 相同输入路径上的完整键盘。把它停靠在窗体上,它会写入获得焦点的控件;也可以附加一个下拉键盘,在编辑框获得焦点时于其下方打开。键盘从不抢走焦点,因此目标的插入符和选区保持原位,标准编辑框、备注框和 sgcEditors 控件无需任何改动。
TsgcVCLKeyboard 和下拉形式的 TsgcVCLKeyboardPopup,也提供 FireMonkey 版本,以及 .NET 中的 WinForms、WPF 和 Avalonia 版本Associate 选择目标,或让键盘跟随焦点。AutoPopup、AutoPopupAll、PopupPosition 和 CloseOnEnter 控制下拉行为sgcKeyboardRegisterLayout 注册自己的布局,以及在 Layouts 中循环切换的布局键OnKeyText 在文本写入之前更改或取消它,OnEnterKey 在回车之后运行屏幕键盘包含在每个版本中,社区版也不例外。它是面向操作员画面和自助终端的 sgcUI HMI 套件的一部分。
阅读帮助主题
输入、语言与数据
国际化团队和多语言产品需要让每位用户读起来都自然的日期。每个控件都有自己的 FormatSettings,由用户区域设置填充,并可在运行时更改,因此同一窗体上的两个控件甚至可以使用两种区域设置。日历和选择器从中获取日名和月名、日期和时间格式、AM 和 PM 字符串以及分隔符。FirstDayOfWeek 和 WeekNumbering 遵循区域设置或您的选择,数字则使用正确的小数点和千位分隔符。单位、提示和无障碍名称仍是您自己的属性,因此可以和窗体的其余部分一起翻译。
FormatSettingsFirstDayOfWeek:efdLocale 或强制 efdMondayWeekNumbering:默认为 ewnISO8601TsgcEditorLocale
输入、语言与数据 仅限注册版
大多数 Delphi 业务窗体都建立在 TDataSet 之上,而手动连接每个编辑器既重复又繁琐。十款数据感知控件通过 DataSource 和 DataField 直接绑定到字段:日期选择器、时间选择器、数值调节框、评分、第二个滑块绑定 EndDataField 的范围滑块、按钮编辑框、采用其字段 EditMask 的掩码编辑框、货币编辑框、备注框,以及通过 ListSource、KeyField 和 ListField 从第二个数据集填充多列列表的查找编辑框,类似 TDBLookupComboBox。AllowEmpty 开启时,空字段显示为空,必填字段会向验证器报告空值。它们通过 TsgcEditorFieldLink 绑定,该类只使用 DB 单元,因此 FireMonkey 版本无需 LiveBindings。在 .NET 中,WinForms 编辑器通过 DataSource、DataMember 和 DataField 绑定字段,数据源可以是 BindingSource、DataTable、DataView 或 List,WPF 和 Avalonia 的值属性支持双向绑定。把它们放到现有窗体上,您已有的数据集逻辑照常工作,无需改动。
TsgcVCLDBDatePicker、TsgcVCLDBTimePicker、TsgcVCLDBSpinEditTsgcVCLDBRating 和 TsgcVCLDBRangeSliderTsgcVCLDBButtonEdit、TsgcVCLDBMaskEdit、TsgcVCLDBCurrencyEdit、TsgcVCLDBMemo、TsgcVCLDBLookupEditDataSource、DataField、EndDataField;查找列表通过 ListSource、KeyField、ListFieldDataSource、DataMember、DataField;WPF 和 Avalonia:值属性支持双向绑定在 .NET 社区包中,WinForms 编辑器没有 DataSource、DataMember 和 DataField;WPF 和 Avalonia 绑定以及查找编辑框的 ItemsSource 在两个版本中都可使用。
阅读帮助主题输入、语言与数据
窗体只有在每个字段都正确时才算完成。sgcUICore 的验证器按规则检查窗体上的控件:必填、范围、长度、正则表达式、电子邮件、与另一个字段比较以及您自己的代码。它查找控件的方式与智能粘贴相同,因此无论是 sgcEditors 控件,还是标准的编辑框、备注框、组合框、复选框和选择器,都会被检查,适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia。掩码编辑框会报告不完整的值,查找编辑框会报告不在列表中的文本,无需任何规则。错误以主题错误颜色的边框、以消息作为工具提示的图标和可选的汇总列表显示,屏幕阅读器会连同字段一起读出消息。在 .NET 中,验证器还会显示数据层的错误:WinForms 和 WPF 上的 IDataErrorInfo 和 INotifyDataErrorInfo,Avalonia 上的数据验证错误。
TsgcVCLValidator、TsgcFMXValidator、TsgcWinFormsValidator、TsgcWpfValidator、TsgcAvaloniaValidatoruvrRequired、uvrRange、uvrLength、uvrRegex、uvrEmail、uvrCompare、uvrCustomTrigger:默认为 uvtExit,也可为 uvtChange 或 uvtManual;保存前调用 ValidateTsgcVCLValidationSummary 列出错误,点击时聚焦到对应字段每个版本都包含,社区版也不例外。正则表达式在 Delphi 7 到 13 和 .NET 上匹配相同的文本。
阅读帮助主题输入、语言与数据
布局控件排列窗体上的控件,sgcEditors 和标准控件均适用,支持分组、选项卡分组和多列,标题对齐到同一宽度,带有用户可拖动的分隔条和从右到左的布局,SaveLayout 把排布保存为 JSON。数据表单建立在它之上。把它指向一个 TDataSet,或绑定您自己类的对象,它就会为每个字段创建一个 sgcEditors 控件、每个字段的验证规则、错误汇总,以及用于浏览、添加、编辑、删除和提交记录的导航条。智能粘贴用粘贴的文本(例如电子邮件签名或地址块)填充整条记录,并标出它填充的字段。在 .NET 中,WinForms、WPF 和 Avalonia 的数据表单接受 DataTable、列表或对象。
TsgcVCLLayoutControl、TsgcFMXLayoutControl;SaveLayout 和 LoadLayoutTsgcVCLDataForm、TsgcFMXDataForm、TsgcWinFormsDataForm、TsgcWpfDataForm、TsgcAvaloniaDataFormFields:每个字段的标题、类型、必填、限制、分组、选项卡和顺序;类使用 BindObjectSmartPasteFromClipboard、SmartPasteUndo 和导航条上的智能粘贴按钮布局控件包含在每个版本中,社区版也不例外;Delphi 社区版没有 sgcEditors 的设计时包,因此在那里需要用代码创建。数据表单、其验证规则及其智能粘贴仅限注册版。
阅读帮助主题评审人员会检查的细节:无需鼠标,在每台显示器上都清晰,外观与您的应用程序匹配。
键盘、DPI 与主题
如今,150% 缩放的笔记本电脑旁边放着 100% 缩放的外接显示器是常态,而模糊的输入控件显得廉价。sgcEditors 以 96 DPI 的逻辑像素布局每个控件,并按屏幕的缩放比例绘制,您的代码无需做任何事。当 VCL 窗体移动到 DPI 不同的显示器时,内部编辑框及其字体会随控件缩放,下拉面板则按其打开所在显示器的 DPI 绘制。FireMonkey 的光栅化遵循场景缩放,适用于 Retina 和 Android。
WM_DPICHANGED 时重新缩放SaveToPNG 接受缩放比例以生成清晰图像
键盘、DPI 与主题
sgcEditors 的任何功能都不需要鼠标。绘制型控件自行获取焦点,文本控件则把焦点转交给其内部编辑框,获得焦点的控件会以强调色绘制 2 像素的焦点环。在日历中,方向键按一天或一周移动并跳过禁用日期,PageUp 和 PageDown 按月移动,Shift 可扩展范围。在选择器中,F4 或 Alt+Down 打开下拉面板,Escape 恢复原值。数值调节框可用 Up、Down、PageUp 和 PageDown 步进。
Increment 和 LargeIncrement
键盘、DPI 与主题
当每个输入控件都遵循同一个主题时,窗体才显得完整。每个控件都有 Theme、AccentColor 和 TextStyle,边框、悬停、按下状态、选中和禁用状态的颜色都由它们推导而来,因此一个属性就能改变整体外观。这些令牌与每款 sgcUI 产品使用的相同,所以放在 sgcDashboard 磁贴中或 sgcToolbar 下方的编辑器无需额外工作即可匹配。禁用的控件会自动向背景色过渡。在运行时切换主题,每个编辑器都会重绘,方便您提供深色模式设置。
Theme:utDefault(默认,跟随应用程序主题)、utLight 或 utDarkAccentColor 用于选中、滑块、填充和焦点环TextStyle 用于大小、粗体和颜色sgcUI 套件演示中的 sgcEditors:使用内置模拟数据、可离线运行的完整应用程序。
客户联系人卡片上的评分和信用额度编辑器。
Altamira ERP →
日期和时间选择器设置工艺趋势的可见时间窗口。
Altamira Plant →
预订窗体需要一个遵守休息日的入住范围、客人数量、到达时间,也许还有对上次入住的评分。月历强制执行 MinDate、MaxRangeDays 和禁用日期,数值调节框统计客人数,时间选择器接受键入的时间,评分收集反馈,全都使用同一个主题。BookingForm 演示用七个编辑器搭建了一个酒店预订,并带有实时摘要。
业务线应用整天都在编辑记录。十款数据感知编辑器通过 DataSource 和 DataField 绑定到 TDataSet 字段,范围滑块绑定两端,空字段显示为空。结合真正的键盘输入和宽松解析,操作员可以快速键入数值,数据集接收到的是干净的数据。DataAware 演示把这十个编辑器放在 TClientDataSet 上,旁边是 TDBGrid 和 TDBNavigator。
在多个国家使用的计划工具必须向每位用户显示正确的周起始日、周数和月份名称。每个控件都带有自己的 FormatSettings,因此同一窗体可以并排显示德语日历和英语日历,FirstDayOfWeek 和 WeekNumbering 遵循区域设置或您的规则。Calendar 演示可在英语、德语、西班牙语、法语和意大利语之间切换,并将范围限制为 14 天。
Delphi、C++ Builder 和 C# 中使用相同的 API:一个评分、一个范围滑块和一个标记编辑框,全部通过 OnChange 报告。
uses
SysUtils, Classes, Controls, Forms, StdCtrls,
sgcEditors_Types, sgcEditors_VCL_Value, sgcEditors_VCL_Token;
type
TFeedbackForm = class(TComponent)
public
Stars: TsgcVCLRating;
Budget: TsgcVCLRangeSlider;
Tags: TsgcVCLTokenEdit;
Summary: TLabel;
procedure EditorChange(Sender: TObject);
end;
procedure TFeedbackForm.EditorChange(Sender: TObject);
begin
// OnChange fires for every new value: clicked, dragged or typed
Summary.Caption := Format('%.1f stars, budget %.0f to %.0f, %d tags',
[Stars.Value, Budget.Value, Budget.EndValue, Tags.Tokens.Count]);
end;
function CreateFeedbackForm(aForm: TForm): TFeedbackForm;
begin
Result := TFeedbackForm.Create(aForm);
Result.Stars := TsgcVCLRating.Create(aForm);
Result.Stars.Parent := aForm;
Result.Stars.SetBounds(16, 16, 200, 32);
Result.Stars.Glyph := ergHeart;
Result.Stars.Precision := erpHalf;
Result.Stars.Value := 3.5;
Result.Stars.OnChange := Result.EditorChange;
Result.Budget := TsgcVCLRangeSlider.Create(aForm);
Result.Budget.Parent := aForm;
Result.Budget.SetBounds(16, 60, 320, 48);
Result.Budget.Max := 500;
Result.Budget.Step := 10;
Result.Budget.RangeMode := True;
Result.Budget.Value := 80;
Result.Budget.EndValue := 240;
Result.Budget.ShowLabels := True;
Result.Budget.OnChange := Result.EditorChange;
Result.Tags := TsgcVCLTokenEdit.Create(aForm);
Result.Tags.Parent := aForm;
Result.Tags.SetBounds(16, 120, 320, 64);
Result.Tags.TextHint := 'Add a tag';
Result.Tags.AutoCompleteItems.CommaText := 'Breakfast,Parking,Pool';
Result.Tags.AddToken('Breakfast');
Result.Tags.OnChange := Result.EditorChange;
Result.Summary := TLabel.Create(aForm);
Result.Summary.Parent := aForm;
Result.Summary.SetBounds(16, 196, 320, 20);
Result.EditorChange(nil);
end;#include <vcl.h>
#include "sgcEditors_Types.hpp"
#include "sgcEditors_VCL_Value.hpp"
#include "sgcEditors_VCL_Token.hpp"
class TFeedbackHandler : public TObject
{
public:
TsgcVCLRating *Stars;
TsgcVCLRangeSlider *Budget;
TsgcVCLTokenEdit *Tags;
TLabel *Summary;
void __fastcall EditorChange(TObject *Sender);
};
void __fastcall TFeedbackHandler::EditorChange(TObject *Sender)
{
// OnChange fires for every new value: clicked, dragged or typed
Summary->Caption = FormatFloat("0.0", Stars->Value) + " stars, budget " +
FormatFloat("0", Budget->Value) + " to " + FormatFloat("0", Budget->EndValue) +
", " + IntToStr(Tags->Tokens->Count) + " tags";
}
TFeedbackHandler * __fastcall CreateFeedbackForm(TForm *Form)
{
TFeedbackHandler *H = new TFeedbackHandler();
H->Stars = new TsgcVCLRating(Form);
H->Stars->Parent = Form;
H->Stars->SetBounds(16, 16, 200, 32);
H->Stars->Glyph = ergHeart;
H->Stars->Precision = erpHalf;
H->Stars->Value = 3.5;
H->Stars->OnChange = H->EditorChange;
H->Budget = new TsgcVCLRangeSlider(Form);
H->Budget->Parent = Form;
H->Budget->SetBounds(16, 60, 320, 48);
H->Budget->Max = 500;
H->Budget->Step = 10;
H->Budget->RangeMode = true;
H->Budget->Value = 80;
H->Budget->EndValue = 240;
H->Budget->ShowLabels = true;
H->Budget->OnChange = H->EditorChange;
H->Tags = new TsgcVCLTokenEdit(Form);
H->Tags->Parent = Form;
H->Tags->SetBounds(16, 120, 320, 64);
H->Tags->TextHint = "Add a tag";
H->Tags->AutoCompleteItems->CommaText = "Breakfast,Parking,Pool";
H->Tags->AddToken("Breakfast");
H->Tags->OnChange = H->EditorChange;
H->Summary = new TLabel(Form);
H->Summary->Parent = Form;
H->Summary->SetBounds(16, 196, 320, 20);
H->EditorChange(NULL);
return H;
}using System;
using System.Drawing;
using System.Windows.Forms;
using esegece.sgcUICore;
using esegece.sgcEditors;
public class FeedbackForm : Form
{
private readonly TsgcWinFormsRating stars;
private readonly TsgcWinFormsRangeSlider budget;
private readonly TsgcWinFormsTokenEdit tags;
private readonly Label summary = new Label { Location = new Point(12, 196), Size = new Size(320, 20) };
public FeedbackForm()
{
ClientSize = new Size(360, 230);
stars = new TsgcWinFormsRating { Location = new Point(12, 12), Size = new Size(200, 32) };
stars.Glyph = TsgcEditorRatingGlyph.ergHeart;
stars.Precision = TsgcEditorRatingPrecision.erpHalf;
stars.Value = 3.5;
budget = new TsgcWinFormsRangeSlider { Location = new Point(12, 56), Size = new Size(320, 48) };
budget.BeginInit();
budget.Max = 500;
budget.Step = 10;
budget.RangeMode = true;
budget.Value = 80;
budget.EndValue = 240;
budget.EndInit();
budget.ShowLabels = true;
tags = new TsgcWinFormsTokenEdit { Location = new Point(12, 116), Size = new Size(320, 64) };
tags.TextHint = "Add a tag";
foreach (string s in new[] { "Breakfast", "Parking", "Pool" })
tags.AutoCompleteItems.Add(s);
tags.Tokens.Add("Breakfast");
// OnChange fires for every new value: clicked, dragged or typed
foreach (TsgcWinFormsCustomEditor e in new TsgcWinFormsCustomEditor[] { stars, budget, tags })
{
e.OnChange = s => ShowSummary();
Controls.Add(e);
}
Controls.Add(summary);
ShowSummary();
}
private void ShowSummary() =>
summary.Text = $"{stars.Value:0.0} stars, budget {budget.Value:0} to {budget.EndValue:0}, {tags.Tokens.Count} tags";
}dotnet add package esegece.sgcEditors.WinForms由 sgcUICore 的验证器检查的查找编辑框、掩码编辑框和货币编辑框。用户保存时调用 Validate:它显示每个错误并聚焦到第一个无效字段。
function CreateOrderValidator(aForm: TForm; aCountry: TsgcVCLLookupEdit;
aPhone: TsgcVCLMaskEdit; aPrice: TsgcVCLCurrencyEdit): TsgcVCLValidator;
var
oRule: TsgcVCLValidationRule;
begin
// cells: key | name, the edit shows the name and KeyValue keeps the code
aCountry.Items.Add('ES|Spain');
aCountry.Items.Add('FR|France');
aCountry.Items.Add('DE|Germany');
aCountry.KeyColumn := 0;
aCountry.DisplayColumn := 1;
// Delphi EditMask syntax: the user types the digits, the literals stay
aPhone.EditMask := '(000) 000-0000;0;_';
aPrice.CurrencyCode := 'EUR';
Result := TsgcVCLValidator.Create(aForm);
Result.Container := aForm;
Result.Display := [uvdBorder, uvdIcon];
oRule := TsgcVCLValidationRule(Result.Rules.Add);
oRule.Control := aCountry;
oRule.Kind := uvrRequired;
oRule := TsgcVCLValidationRule(Result.Rules.Add);
oRule.Control := aPrice;
oRule.Kind := uvrRange;
oRule.MinValue := '1';
oRule.MaxValue := '10000';
end;public class Country
{
public string Code { get; set; }
public string Name { get; set; }
}
public class OrderForm : Form
{
private readonly TsgcWinFormsLookupEdit country = new TsgcWinFormsLookupEdit();
private readonly TsgcWinFormsMaskEdit phone = new TsgcWinFormsMaskEdit();
private readonly TsgcWinFormsCurrencyEdit price = new TsgcWinFormsCurrencyEdit();
private readonly TsgcWinFormsValidator validator = new TsgcWinFormsValidator();
public OrderForm()
{
country.SetBounds(16, 16, 240, 28);
phone.SetBounds(16, 56, 240, 28);
price.SetBounds(16, 96, 240, 28);
Controls.AddRange(new Control[] { country, phone, price });
// any list: the edit shows Name, SelectedValue returns Code
country.ItemsSource = new List<Country>
{
new Country { Code = "ES", Name = "Spain" },
new Country { Code = "FR", Name = "France" }
};
country.DisplayMember = "Name";
country.ValueMember = "Code";
phone.EditMask = "(000) 000-0000"; // MaskedTextBox syntax by default
price.Decimals = 2;
validator.Container = this;
validator.Rules.Add(new TsgcWinFormsValidationRule
{ Control = country, Kind = TsgcUIValidationRuleKind.uvrRequired });
validator.Rules.Add(new TsgcWinFormsValidationRule
{ Control = price, Kind = TsgcUIValidationRuleKind.uvrRange, MinValue = "1" });
}
public bool Save() => validator.Validate();打开的数据集上的 TsgcVCLDataForm 会创建编辑器、验证规则和导航条。设置字段的类型和分组,重建后,导航条上的智能粘贴按钮即可从剪贴板填充记录。
uses
Forms, Controls, DB,
sgcUICore_AI, sgcEditors_DataForm, sgcEditors_VCL_DataForm;
function CreateCustomerForm(aOwner: TForm; aSource: TDataSource;
aProvider: TsgcUIAIProvider): TsgcVCLDataForm;
var
oField: TsgcDataFormField;
begin
Result := TsgcVCLDataForm.Create(aOwner);
Result.Parent := aOwner;
Result.Align := alClient;
// an open dataset: one field, one editor and one rule per TField
Result.DataSource := aSource;
oField := Result.Fields.FindField('EMAIL');
oField.Kind := edfEmail;
oField.Required := True;
oField.Group := 'Contact';
Result.Fields.FindField('PHONE').Group := 'Contact';
Result.RebuildEditors;
// the Smart Paste button of the navigator fills every field from the
// clipboard; without a provider a local parser reads "Name: value" lines
Result.Provider := aProvider;
end;Gallery、Calendar、BookingForm、Validation 和 DataAware 提供 VCL 和 C++ Builder 版本,另有适用于 FireMonkey 的 GalleryFMX 和 ValidationFMX;.NET 版本提供适用于 WinForms、WPF 和 Avalonia 的 Gallery 和 Validation,以及 BookingForm、BindingWpf 和 DataAwareWinForms。
十五个编辑器位于同一窗体中,带有主题开关、只读开关、事件日志和 PNG 导出。这是体验每款控件及其键盘行为的最快方式。
最长 14 天的范围、周数、禁用的周末和节假日,以及在英语、德语、西班牙语、法语和意大利语之间切换的区域设置。
酒店预订,带有入住、客人和到达时间的实时摘要、国家查找、掩码电话号码,以及在预订前检查客人字段的验证器。它展示了这些控件如何在真实窗体上协同工作。
十款数据感知编辑器位于 TClientDataSet 上,并配有 TDBGrid 和 TDBNavigator,另有从第二个数据集填充的查找编辑框和检查必填字段的验证器。数据感知控件需要注册版或试用版。
使用 FireMonkey 编辑器构建的 Gallery,适用于 Windows 和 Android,属性和事件与 VCL 控件相同。
标准控件和 sgcEditors 控件上的每种规则类型、三种触发方式、边框和图标显示以及汇总列表。ValidationFMX 在 FireMonkey 中实现相同功能,.NET 版本提供 Validation、ValidationWpf 和 ValidationAvalonia。
适用于 Delphi (VCL) 的五个 QuickStart 演示位于 Demos\Editors\Delphi\00.QuickStart。PDF 指南逐步讲解这些演示:窗体上的第一批编辑器、读取和写入值、主题、验证,以及基于数据表单构建的联系人应用程序。
免费的社区版(NuGet 上的 esegece.sgcEditors.Community)包含全部十五款控件、布局控件和验证框架,但颜色选择器没有 HSV 方块和透明度条,标记编辑框没有自动补全列表,范围滑块只有一个滑块,并且没有数据感知编辑器,没有数据表单,也没有 WinForms DataSource 绑定。
| 功能 | 社区版(免费) | 注册版 |
|---|---|---|
| 全部十五款控件,支持 VCL、FireMonkey 和 .NET | ✓ | ✓ |
| 验证:规则、错误显示、汇总(sgcUICore) | ✓ | ✓ |
| WinForms、WPF 和 Avalonia 中来自 ItemsSource 的查找列表 | ✓ | ✓ |
| Native text entry, lenient parsing, localisation | ✓ | ✓ |
| Calendar ranges, limits and disabled days | ✓ | ✓ |
| Keyboard, DPI, themes and headless output | ✓ | ✓ |
| 触摸面板用 NumPad | ✓ | ✓ |
| 带十种布局的屏幕键盘 | ✓ | ✓ |
| 用于设置的开关 | ✓ | ✓ |
| 适用于 IPv4 和 IPv6 的 IP 地址编辑框 | ✓ | ✓ |
| 用于时长的时间跨度编辑框 | ✓ | ✓ |
| 可预览每个字体系列的字体选择器 | ✓ | ✓ |
| 带全选和筛选框的复选列表框 | ✓ | ✓ |
| 带移动和排序按钮的双列表框 | ✓ | ✓ |
| 布局控件及保存为 JSON 的布局(Delphi 社区版中用代码创建) | ✓ | ✓ |
| Two thumb range slider | − | ✓ |
| HSV square and alpha bar of the colour picker | − | ✓ |
| Auto complete list of the token edit | − | ✓ |
| Data aware editors (Delphi and C++ Builder) | − | ✓ |
| WinForms DataSource、DataMember 和 DataField | − | ✓ |
| 来自 TDataSet、类、DataTable 或对象的数据表单,含验证和智能粘贴 | − | ✓ |
每款控件都提供 VCL、FireMonkey、WinForms、WPF 和 Avalonia 版本,属性和事件相同。
| 控件 | VCL 和 C++ Builder | FireMonkey | .NET |
|---|---|---|---|
| 月历 | TsgcVCLMonthCalendar | TsgcFMXMonthCalendar | TsgcWinFormsMonthCalendar |
| 日期选择器 | TsgcVCLDatePicker | TsgcFMXDatePicker | TsgcWinFormsDatePicker |
| 时间选择器 | TsgcVCLTimePicker | TsgcFMXTimePicker | TsgcWinFormsTimePicker |
| 日期时间选择器 | TsgcVCLDateTimePicker | TsgcFMXDateTimePicker | TsgcWinFormsDateTimePicker |
| 范围滑块 | TsgcVCLRangeSlider | TsgcFMXRangeSlider | TsgcWinFormsRangeSlider |
| 颜色选择器 | TsgcVCLColorPicker | TsgcFMXColorPicker | TsgcWinFormsColorPicker |
| 标记编辑框 | TsgcVCLTokenEdit | TsgcFMXTokenEdit | TsgcWinFormsTokenEdit |
| 评分 | TsgcVCLRating | TsgcFMXRating | TsgcWinFormsRating |
| 数值调节框 | TsgcVCLSpinEdit | TsgcFMXSpinEdit | TsgcWinFormsSpinEdit |
| 按钮编辑框 | TsgcVCLButtonEdit | TsgcFMXButtonEdit | TsgcWinFormsButtonEdit |
| 搜索编辑框 | TsgcVCLSearchEdit | TsgcFMXSearchEdit | TsgcWinFormsSearchEdit |
| 掩码编辑框 | TsgcVCLMaskEdit | TsgcFMXMaskEdit | TsgcWinFormsMaskEdit |
| 货币编辑框 | TsgcVCLCurrencyEdit | TsgcFMXCurrencyEdit | TsgcWinFormsCurrencyEdit |
| 查找编辑框 | TsgcVCLLookupEdit | TsgcFMXLookupEdit | TsgcWinFormsLookupEdit |
| 备注框 | TsgcVCLMemo | TsgcFMXMemo | TsgcWinFormsMemo |
| 开关 | TsgcVCLToggleSwitch | TsgcFMXToggleSwitch | TsgcWinFormsToggleSwitch |
| IP 地址编辑框 | TsgcVCLIPAddressEdit | TsgcFMXIPAddressEdit | TsgcWinFormsIPAddressEdit |
| 时间跨度编辑框 | TsgcVCLTimeSpanEdit | TsgcFMXTimeSpanEdit | TsgcWinFormsTimeSpanEdit |
| 字体选择器 | TsgcVCLFontPicker | TsgcFMXFontPicker | TsgcWinFormsFontPicker |
| 复选列表框 | TsgcVCLCheckListBox | TsgcFMXCheckListBox | TsgcWinFormsCheckListBox |
| 双列表框 | TsgcVCLDualListBox | TsgcFMXDualListBox | TsgcWinFormsDualListBox |
| NumPad | TsgcVCLNumPad, TsgcVCLNumPadPopup | TsgcFMXNumPad, TsgcFMXNumPadPopup | TsgcWinFormsNumPad, TsgcWinFormsNumPadPopup |
| 屏幕键盘 | TsgcVCLKeyboard, TsgcVCLKeyboardPopup | TsgcFMXKeyboard, TsgcFMXKeyboardPopup | TsgcWinFormsKeyboard, TsgcWinFormsKeyboardPopup |
| 布局控件 | TsgcVCLLayoutControl | TsgcFMXLayoutControl | TsgcWinFormsLayoutControl |
| 数据表单 | TsgcVCLDataForm | TsgcFMXDataForm | TsgcWinFormsDataForm |
.NET 列显示的是 WinForms 的名称,WPF 和 Avalonia 也有相同的控件,前缀分别为 TsgcWpf 和 TsgcAvalonia。非可视辅助类:TsgcEditorModel、TsgcEditorLocale 和 TsgcEditorFieldLink。十款数据感知编辑器(TsgcVCLDBDatePicker、TsgcVCLDBTimePicker、TsgcVCLDBSpinEdit、TsgcVCLDBRating、TsgcVCLDBRangeSlider、TsgcVCLDBButtonEdit、TsgcVCLDBMaskEdit、TsgcVCLDBCurrencyEdit、TsgcVCLDBMemo 和 TsgcVCLDBLookupEdit,以及对应的 FireMonkey 版本)仅限注册版,适用于 Delphi 和 C++ Builder;在 .NET 中,注册版的 WinForms 编辑器通过 DataSource、DataMember 和 DataField 绑定。布局控件包含在每个版本中,数据表单仅限注册版。验证器和验证汇总属于 sgcUICore:TsgcVCLValidator、TsgcFMXValidator、TsgcWinFormsValidator、TsgcWpfValidator 和 TsgcAvaloniaValidator。
| 目标 | 组件 | 平台 |
|---|---|---|
| Delphi 7 至 13,VCL | TsgcVCL 编辑器 | Win32,XE2 起支持 Win64 |
| Delphi XE6 至 13,FireMonkey | TsgcFMX 编辑器 | Windows、macOS、iOS 和 Android |
| C++ Builder 2007 至 13 | TsgcVCL 和 TsgcFMX 编辑器 | 生成的 .hpp 头文件和静态库 |
| Delphi 10.2 至 13,框架无关 | 模型、布局模型及其 JSON,无界面 PNG 与 SVG 输出 | Linux64(无 Linux 控件) |
| .NET Framework 4.7.2、.NET 8、9 和 10 | WinForms、WPF 和 Avalonia 编辑器 | Windows 桌面和 Avalonia 目标平台 |
支持。每个文本字段都是平台的真实编辑控件,VCL 中是无边框 TEdit,FireMonkey 中是 FMX TEdit,因此日语、中文和韩语的输入法组合、剪贴板、撤销、上下文菜单和屏幕阅读器无需特殊代码即可工作。请参阅文本输入与输入法。
可以。MinDate 和 MaxDate 设置范围,DisabledDates 列出节假日,DisabledWeekDays 屏蔽周末,OnIsDateDisabled 决定任何其他规则。禁用的日期以删除线绘制,键盘会跳过它们,在选择器中键入时也会被拒绝。Calendar 演示屏蔽了周末和两个节假日,以展示规则的实际效果。
在 Delphi 和 C++ Builder 中有十款:日期选择器、时间选择器、数值调节框、评分、范围滑块、按钮编辑框、掩码编辑框、货币编辑框、备注框和查找编辑框,每款都有 VCL 和 FireMonkey 版本。它们需要注册版或试用版。在 .NET 中,注册版的 WinForms 编辑器通过 DataSource、DataMember 和 DataField 绑定字段,在两个版本中,控件都使用 WinForms、WPF 和 Avalonia 的数据绑定,查找编辑框从 ItemsSource 获取其行。
全部十五款控件和验证框架都包含在内。社区版不含颜色选择器的 HSV 方块和透明度条、标记编辑框的自动补全列表、范围滑块的第二个滑块,以及 WinForms 编辑器的 DataSource、DataMember 和 DataField 成员。Delphi 数据感知编辑器仅限注册版。请参阅版本。
可以。把 sgcUICore 的验证器放到窗体上,设置其 Container 并添加规则:必填、范围、长度、正则表达式、电子邮件、比较和自定义。它会检查 sgcEditors 控件以及标准的编辑框、备注框、组合框、复选框和选择器,显示边框、图标和可选的汇总,屏幕阅读器会读出消息。保存前调用 Validate。每个版本都包含,适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia。请参阅验证。
可以。每个控件都保留自己的 FormatSettings 副本,因此日名和月名、格式、分隔符以及每周的第一天可以因控件而异。Calendar 演示可在运行时在英语、德语、西班牙语、法语和意大利语之间切换,除非您另行选择,否则周数遵循 ISO 8601。
对于日期和时间,可以:TsgcVCLDatePicker、TsgcVCLTimePicker 和 TsgcVCLDateTimePicker 是带下拉日历或时间列表的键入式编辑框。此外,它们还能宽松地解析月份名称,遵守限制和禁用日期,遵循 sgcUI 主题,并按每台显示器的 DPI 绘制。
可以。C++ Builder 2007 以及 2010 至 13 通过生成的头文件和库使用相同的 VCL 和 FireMonkey 控件,每个 Delphi 演示(包括 DataAware)也都提供 C++ Builder 工程。本页的代码标签页展示了 Delphi、C++ Builder 和 C# 中的同一个窗体,每个示例在发布前都已编译通过。