Radio button 如何禁用面板上的TRadioButtons而不更改其外观?

Radio button 如何禁用面板上的TRadioButtons而不更改其外观?,radio-button,delphi-2009,Radio Button,Delphi 2009,场景 我有一个相当复杂的表单,用于数据输入或查看,不允许编辑,这取决于状态变量(表单上的颜色和标题根据状态而变化)。它包含许多包含数据输入类型组件的面板。当处于查看(非编辑)状态时,这些面板被设置为禁用,以防止它们包含的任何组件被更改 一个面板包含四个TradioButton和一个带有滚动条的备忘录框。 由于备忘录中的文本量很大,我仍然希望在查看模式下滚动备忘录框,以便全部阅读。但是,我不想更改备忘录文本或单选按钮 我尝试过的 我没有禁用整个面板,而是让它处于启用状态,只是让备忘录框为只读。这允

场景

我有一个相当复杂的表单,用于数据输入或查看,不允许编辑,这取决于状态变量(表单上的颜色和标题根据状态而变化)。它包含许多包含数据输入类型组件的面板。当处于查看(非编辑)状态时,这些面板被设置为禁用,以防止它们包含的任何组件被更改

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

我尝试过的

我没有禁用整个面板,而是让它处于启用状态,只是让备忘录框为只读。这允许按需滚动但不编辑备忘录框

然而,当面板被启用时,意味着单选按钮也被启用并且可以更改

如果我将每个radiobutton的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
procedure TFrmMember.ShowMemberForm(MemberDisplayMode:TMemberDisplayType);
开始
案例格式显示模式
shownedit:开始
SetFormDisplay(ShowNoEdit)//设置颜色和标题等
有害控制//禁用窗体上的所有面板
//现在启用注释备忘录内容的滚动,但不允许编辑
PanelComment.Enabled:=True//启用包含备注和4个单选按钮的面板
MemoComment.ReadOnly:=真//不允许编辑备忘录
//现在禁用单选按钮-这会改变外观??
RadioButtonCircEmail.Enabled:=False;
RadioButtonCircPost.Enabled:=False;
RadioButtonCircAll.Enabled:=False;
RadioButtonCircone.Enabled:=False;
结束;
结束//案例
结束//程序ShowMemberForm

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


然后您可以仅禁用新面板/组,保持父面板处于启用状态,并将
TMemo
设置为只读。

如何更改OnClick事件处理程序,使其始终从数据模型强制/还原为值?如果未灰显,则用户不希望能够编辑值吗?已经有一个OnClick事件,由每个radiobutton调用,它执行其他功能,但我想我可以用case语句向其中添加代码,以检测单击了哪个按钮。但是,在点击另一个按钮之前,我如何检测哪个按钮已被选中?我接受您关于灰显的观点,但它看起来不太好,因为在彩色面板背景下很难读取按钮文本。他们不应该期望编辑,因为他们之前已经选择不编辑查看数据(或者由于他们的登录状态而被迫),表单颜色不同,并且与不编辑一致,并且有一个大标题说“仅查看,不编辑”,哦,表单将没有“保存”按钮谢谢你,雷米,和往常一样,在发布问题、喝杯咖啡、再思考之后,我自己也想出了完全相同的解决方法。不过我会接受你的回答,因为你不辞辛劳地把它贴了出来。