带有 CharCase ecLowerCase 或 ecUpperCase 的 TComboBox 异常 "Unable to insert a line"
Exception "Unable to insert a line" TComboBox with CharCase ecLowerCase or ecUpperCase
在 Delphi 10.3.2 中,当我以编程方式在具有 "CharCase = ecLowerCase"(或 ecUpperCase)的 TComboBox 中插入项目时,出现错误
项目 XXXX 引发异常 class EOutOfResources 消息 'Unable to insert a line'
只有当我将单元 SHAREMEM 添加到我的项目时才会出现错误(我需要引用该单元,因为我必须与 DLL 交换动态字符串)。
错误似乎与我在程序 TComboBoxStrings.Add() (unit StdCtrls.pas) 中找到的这个备注有关: 来自 Windows SDK 文档: Comclt32.dll 5.0 版或更高版本:如果设置了 CBS_LOWERCASE 或 CBS_UPPERCASE,CB_ADDSTRING 的 Unicode 版本会更改字符串。如果使用只读全局内存,这将导致应用程序失败。
program combo_lowercase;
uses ShareMem,
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Unit1;
interface
uses Forms, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Controls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
combo: TComboBox;
procedure FormCreate(Sender: TObject);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
combo.Items.Clear;
combo.Items.Add('AAAAAAAAAAAAAA');
combo.Items.Add('bbbbbbbbbbbbbb');
combo.Items.Add('CCCCCccccccccc');
combo.Items.Add('ddddddDDDDDDDD');
end;
end.
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 206
ClientWidth = 496
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object combo: TComboBox
Left = 48
Top = 20
Width = 145
Height = 21
Style = csDropDownList
CharCase = ecLowerCase
TabOrder = 0
end
end
有解决办法吗?
提前致谢。
您显示的代码不会导致您报告的错误。对于 Sharemem
的重要性,我能想到的唯一解释是它的使用导致加载了错误版本的 borlandmm.dll。确保您的进程加载该 DLL 的正确版本。将它从 bin 目录复制到与可执行文件相同的目录。
在 Delphi 10.3.2 中,当我以编程方式在具有 "CharCase = ecLowerCase"(或 ecUpperCase)的 TComboBox 中插入项目时,出现错误
项目 XXXX 引发异常 class EOutOfResources 消息 'Unable to insert a line'
只有当我将单元 SHAREMEM 添加到我的项目时才会出现错误(我需要引用该单元,因为我必须与 DLL 交换动态字符串)。
错误似乎与我在程序 TComboBoxStrings.Add() (unit StdCtrls.pas) 中找到的这个备注有关: 来自 Windows SDK 文档: Comclt32.dll 5.0 版或更高版本:如果设置了 CBS_LOWERCASE 或 CBS_UPPERCASE,CB_ADDSTRING 的 Unicode 版本会更改字符串。如果使用只读全局内存,这将导致应用程序失败。
program combo_lowercase;
uses ShareMem,
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Unit1;
interface
uses Forms, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Controls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
combo: TComboBox;
procedure FormCreate(Sender: TObject);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
combo.Items.Clear;
combo.Items.Add('AAAAAAAAAAAAAA');
combo.Items.Add('bbbbbbbbbbbbbb');
combo.Items.Add('CCCCCccccccccc');
combo.Items.Add('ddddddDDDDDDDD');
end;
end.
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 206
ClientWidth = 496
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object combo: TComboBox
Left = 48
Top = 20
Width = 145
Height = 21
Style = csDropDownList
CharCase = ecLowerCase
TabOrder = 0
end
end
有解决办法吗? 提前致谢。
您显示的代码不会导致您报告的错误。对于 Sharemem
的重要性,我能想到的唯一解释是它的使用导致加载了错误版本的 borlandmm.dll。确保您的进程加载该 DLL 的正确版本。将它从 bin 目录复制到与可执行文件相同的目录。