【问题标题】:How can I disable TRadioButtons on a panel without changing their appearance?如何在不改变其外观的情况下禁用面板上的 TRAdioButtons?
【发布时间】:2020-10-11 14:44:38
【问题描述】:

场景

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

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

我的尝试

我没有禁用整个面板,而是将其保持启用状态,并将备忘录框设为只读。这允许根据需要滚动但不能编辑备忘录。

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

如果我将每个单选按钮的 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

【问题讨论】:

  • 如何更改 OnClick 事件处理程序以使其始终强制/恢复为数据模型中的值?
  • 如果不显示为灰色,那么用户不希望能够编辑这些值吗?
  • 已经有一个 OnClick 事件,由每个单选按钮调用,它执行其他功能,但我想我可以使用 case 语句向它添加代码以检测单击了哪个按钮。但是,在单击另一个按钮之前,我如何检测已检查了哪个按钮?
  • 我同意你关于变灰的观点,但它看起来不太好,因为很难在彩色面板背景下阅读按钮文本。他们不应该期望进行编辑,因为他们之前已经选择查看数据而不进行编辑(或者将被他们的登录状态强制),表单颜色不同并且与非编辑一致并且有一个大标题说“仅查看,不得编辑”
  • 哦,表单没有“保存”按钮

标签: radio-button delphi-2009


【解决方案1】:

在现有面板上放置 TPanel 并将 RadioButtons 移动到这个新面板。或者,使用单个 TRadioGroup 而不是在面板上放置单个按钮。

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

【讨论】:

  • 谢谢 Remy,像往常一样,在发布问题并去喝杯咖啡并进行更长时间的思考后,我自己想出了完全相同的解决方法。我会接受你的回答,因为你不厌其烦地发布它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多