Как я могу отключить традиционные кнопки на панели без изменения их внешнего вида?

#radio-button #delphi-2009

#переключатель #delphi-2009

Вопрос:

Сценарий

У меня достаточно сложная форма, которая используется либо для ввода данных, либо для просмотра без разрешенного редактирования, в зависимости от переменной состояния (цвет и заголовки формы меняются в зависимости от состояния). Он содержит множество панелей, содержащих компоненты типа ввода данных. В состоянии просмотра (без редактирования) для этих панелей установлено значение disabled, что предотвращает изменение любого из компонентов, которые они содержат.

Одна панель содержит четыре традиционные кнопки и поле для заметок с полосами прокрутки. Из-за большого количества текста в заметке я все еще хочу иметь возможность прокручивать поле заметки в режиме просмотра, чтобы прочитать все это. Однако я не хочу, чтобы текст заметки или переключатели менялись.

Что я пробовал

Вместо отключения всей панели я оставляю ее включенной и просто делаю поле для заметок доступным только для чтения. Это позволяет прокручивать, но не редактировать memobox по желанию.

Однако, поскольку панель включена, это означает, что радиокнопки также включены и могут быть изменены.

Если я установлю для свойства enabled каждого radiobutton значение false, я могу предотвратить их изменение по желанию, но это также изменит их внешний вид и выделит их серым цветом.

Вопрос

Как я могу запретить пользователю изменять радиокнопки на этой панели, сохраняя при этом их внешний вид неизменным, как если бы они были включены, т.Е. Без их выделения серым цветом?

Минимальный воспроизводимый пример

 procedure TFrmMember.ShowMemberForm(MemberDisplayMode: TMemberDisplayType);
begin
case FormDisplayMode of

<other stuff in a big case statement depending upon MemberDisplayMode>

ShowNoEdit: begin
            SetFormDisplay(ShowNoEdit);  //set colours and titles etc
            DisableAllControls;          //disable all panels on the form

            //now enable scrolling of the comment memo content but don't allow edits
            PanelComment.Enabled := True;  //enable the panel containing the memo and 4 radiobuttons
            MemoComment.ReadOnly := True;  //don't allow editing of the memo

            //now disable the radio buttons -THIS CHANGES APPEARANCE ??
            RadioButtonCircEmail.Enabled := False;
            RadioButtonCircPost.Enabled := False;
            RadioButtonCircBoth.Enabled := False;
            RadioButtonCircNone.Enabled := False;

            <other stuff>
            end;

    <other stuff in a big case statement depending upon MemberDisplayMode>
    end; //case

end; //procedure ShowMemberForm
  

Комментарии:

1. Как насчет изменения обработчика события OnClick, чтобы он всегда принудительно / восстанавливал значение из модели данных?

2. Если не выделено серым цветом, не будет ли пользователь ожидать, что сможет редактировать значения?

3. Уже существует одно событие OnClick, вызываемое каждой radiobutton, которое выполняет другие функции, но я полагаю, я мог бы добавить к нему код с помощью оператора case, чтобы определить, какая кнопка была нажата. Как мне определить, какая кнопка была отмечена до того, как произошел щелчок по другой кнопке?

4. Я понимаю вашу точку зрения по поводу серого цвета, но это выглядит не очень красиво, так как текст кнопки трудно прочитать на фоне цветной панели. Они не должны ожидать редактирования, поскольку они уже ранее выбрали просмотр данных без редактирования (или были вынуждены сделать это из-за их статуса входа в систему), цвет формы отличается и соответствует не редактированию, и есть большой заголовок с надписью «Только просмотр, никаких изменений»

5. О, и в форме не будет кнопки «Сохранить»

Ответ №1:

Поместите a TPanel на существующую панель и переместите радиокнопки на эту новую панель. Или используйте одну TRadioGroup вместо размещения отдельных кнопок на панели.

Затем вы можете отключить только новую панель / группу, оставив родительскую панель включенной и установив TMemo только для чтения.

Комментарии:

1. Спасибо, Реми, как обычно, после публикации вопроса и собираясь выпить кофе и подольше подумать, я сам придумал точно такой же обходной ответ. Я приму ваш ответ, хотя вы потрудились опубликовать его.