Очевидно, это ошибка, но я не могу понять, почему это происходит. Вот минималистичный код для воспроизведения. Просто поместите поле со списком и кнопку в форме и напишите следующие обработчики событий:
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 в 64-разрядной версии Windows 7 Home Premium с установленными последними обновлениями.