Это, очевидно, ошибка, но я не могу отследить, почему происходит. Вот минималистский код для воспроизведения. Просто поместите поле со списком и кнопки на форме и написать следующие обработчики событий:Почему поле со списком меняет текст на текст элемента при изменении шрифта?
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Add('A Item');
ComboBox1.Items.Add('B Item');
ComboBox1.Items.Add('C Item');
ComboBox1.Style := csDropDown;
ComboBox1.AutoComplete := False;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.Text := 'B';
ComboBox1.Font.Color := clRed;
ShowMessage(IntToStr(ComboBox1.ItemIndex));
end;
При нажатии на кнопку в первый раз, вы увидите в поле со списком редактирования полностью выбранный текст второго пункта, но в окне сообщения будет показано, что индекс элемента равен -1. Когда вы опускаете его, выбирается второй элемент. Второй щелчок установит правильный текст, но остальное будет таким же, как при первом щелчке. Таким образом, поле со списком в этом случае ведет себя, как если бы была задействована какая-то странная автозаполнение.
Я отслеживал это до EditWndProc
, где после получения изменения шрифта WM_SETTEXT
сообщение с текстом второго элемента, но я не знаю, откуда оно взялось, и почему с текстом второго элемента.
Итак, мой вопрос весьма конкретный - какой (какой метод) отправляет WM_SETTEXT
при изменении шрифта и как он узнает о совпадении текста второго элемента, когда автозаполнение отключено?
До сих пор я мог воспроизвести это в Delphi 2009 и Delphi XE3 на Windows 7 Home Premium 64-бит с установленными последними обновлениями.
Такое же поведение подтверждено в delphi 2007, это может быть ошибка api в Windows, в какой версии окон вы проверили? – MikeT
Я включу его в вопрос, в Windows 7. – TLama
уже добавил тег :) – whosrdaddy