如何在不更改面板外观的情况下禁用面板上的TRadioButton?

问题描述

场景

我有一个相当复杂的表格,该表格可用于数据输入或查看,不允许进行编辑,这取决于状态变量(表格的颜色和标题取决于状态)。它包含许多面板,其中包含数据输入类型的组件。在查看(非编辑)状态下,这些面板被设置为禁用状态,以防止更改其中包含的任何组件。

一个面板包含四个TradioButton和一个带有滚动条的备注框。 由于备忘录中的文本量很大,在查看模式下,我仍然希望能够滚动备忘录框以便全部阅读。但是,我既不想更改备忘录文本也不能更改单选按钮。

我尝试过的事情

我没有禁用整个面板,而是保持启用状态,只是使备注框为只读。这样可以滚动但不能根据需要编辑备忘录框。

但是,一旦启用面板,则意味着单选按钮也已启用并且可以更改。

如果将每个单选按钮的enabled属性设置为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

解决方法

在现有面板上放置一个TPanel,然后将单选按钮移至该新面板。或者,使用单个TRadioGroup而不是在面板上放置单个按钮。

然后,您可以仅禁用新的面板/组,同时保持父面板的启用并将TMemo设置为只读。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...