Здравствуйте. В моем приложении есть ComboBox1 (стиль csDropDownList). Надо сделать так, чтобы пользователь не мог выбрать в ComboBox1 другую строку (отличную от текущей) с помощью мышки или клавиатуры. В принципе, худо-бедно подходит способ
ComboBox1.Enabled:=false;
Но при этом меняется стиль комбобокса, текст становится бледным, а этого хочется избежать.
Как это сделать?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
12-02-2022 02:45
Во-первых, "серый" цвет комбо-бокса и есть признак того, что пользователь не может его редактировать. Это правильный подход к программированию интерфейсов, ломать его не надо, я бы на месте пользователя возмутился: "Программа не работает" - на глаз поменять значение можно, а фактически - нет.
Если же требуется НЕ давать возможность раскрывать список и редактировать текущую строку, то для отображения информации выбран неправильный компонент. Для отображения статичной информации применяется компонент TLabel. Его внешний вид явно показывает, что редактирование пользователем принципиально невозможно.
Если же требуется переключаться между редактируемым и нередактируемым вариантами (например: возможность редактировать значения зависит от более вышестоящей "галочки"), то можно без особого труда положить друг поверх друга TLabel и TComboBox и при изменении состояния "галочки" скрывать ненужный компонент и показывать - нужный. Это будет достаточно наглядно. Но, повторюсь, подобная "пересборка" формы может мерцать и "серый" фон выставляемый через Enabled:=false это интуитивно правильно решение, другого искать не надо.
>>>пользователь не мог выбрать в ComboBox1 другую строку (отличную от текущей) с помощью мышки или клавиатуры
А можно использовать TJvComboBox из библиотеки JEDI.
У JvComboBox, свойство ReadOnly устанавливает запрет, и редактирования строки, и выпадения списка.
>>>пользователь не мог выбрать в ComboBox1 другую строку (отличную от текущей) с помощью мышки или клавиатуры
Можно сделать с помощью сообщения EM_SETREADONLY и события ComboBox.OnChange
//Установка ReadOnly для ComboBox: запрещает и вводить текст, и выбирать из выпадающего списка
procedure ComboBoxSetReadOnly(AComboBox :TComboBox; AReadOnly :boolean);
begin
if AReadOnly
then AComboBox.Tag := AComboBox.Items.IndexOf(AComboBox.Text) + 1
else AComboBox.Tag := 0;
SendMessage(GetWindow(AComboBox.Handle, GW_CHILD), EM_SETREADONLY, Ord(AReadOnly), 0);
end;
//Событие ComboBox.OnChange для ComboBoxSetReadOnly
procedure TfvMain.ComboBoxChange(Sender: TObject);
begin
with Sender as TComboBox do
if Tag > 0
then ItemIndex := Tag - 1;
end;
Можно тупо в лоб вывести поверх combo TEdit с нужным текстом и ReadOnly.
Или очистить items, оставив выбранный, а потом восстанавливать.
Но это лишь мои фантазии в первый момент после прочтения вопроса.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.