Исключение «Невозможно вставить строку» TComboBox с помощью CharCase ecLowerCase или ecUpperCase - PullRequest
0 голосов
/ 29 сентября 2019

В Delphi 10.3.2 , когда я программно вставляю элементы в TComboBox, имеющий "CharCase = ecLowerCase" (или ecUpperCase), я получаю ошибку Проект XXXX вызывает класс исключений EOutOfResources с сообщением 'Невозможно вставить строку '

Ошибка появляется только тогда, когда я добавляю в свой проект единицу измерения SHAREMEM (мне нужно сослаться на эту единицу, поскольку я должен обмениваться динамическими строками сDLL).

Похоже, ошибка связана с этим замечанием, которое я нашел в процедуре TComboBoxStrings.Add () (unit StdCtrls.pas): Из документации Windows SDK: Comclt32. dll версии 5.0 или более поздней: если установлена ​​CBS_LOWERCASE или CBS_UPPERCASE, Unicode-версия CB_ADDSTRING изменяет строку. При использовании глобальной памяти только для чтения это приводит к сбою приложения.

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

Есть ли обходной путь? Заранее спасибо.

1 Ответ

4 голосов
/ 30 сентября 2019

Код, который вы показываете, не приводит к сообщаемой вами ошибке. Единственное объяснение, которое я могу придумать, чтобы объяснить значение Sharemem, заключается в том, что его использование приводит к загрузке ошибочной версии borlandmm.dll. Убедитесь, что ваш процесс загружает правильную версию этой DLL. Скопируйте его из каталога bin в тот же каталог, что и ваш исполняемый файл.

...