我有一个显示数据库数据的表单,其中包含几个按钮和多个面板。这些面板包含各种组件,特别是TEdits、TComboBox、TDateTimePicker、TCheckBox、TListBox和TstringGrid。
当用户以只读模式打开表单时,我会禁用除按钮外的所有组件,使用以下代码:
for i := 0 to FrmAddNewMember.ComponentCount-1 do
if FrmAddNewMember.Components[i] is TPanel then
(FrmAddNewMember.Components[ i ] as TPanel).enabled := false;
这个功能很好用,但我希望用户现在能够将TEdits中的文本、TDateTimePicker中的日期、TComboBox中的选定项等复制到剪贴板,但仍不能更改它们。
我修改了代码,将TEdits设置为只读。这对于TEdits实现了我想要的效果,但是其他类型的控件没有只读属性,所以我像之前一样禁用了它们。
for i := 0 to FrmAddNewMember.ComponentCount-1 do
if not (FrmAddNewMember.Components[i] is TButton) then //(keep buttons working)
case FrmAddNewMember.Components[i] of
TEdit: (FrmAddNewMember.Components[ i ] as TEdit).readonly := true; //allows copying but not editing
TComboBox: (FrmAddNewMember.Components[ i ] as TComboBox).enabled := false; //no read only propert?
TDateTimePicker: (FrmAddNewMember.Components[ i ] as TDateTimePicker).enabled := false; //ditto
TCheckBox: (FrmAddNewMember.Components[ i ] as TCheckBox).enabled := false;
TListBox: (FrmAddNewMember.Components[ i ] as TListBox).enabled := false;
TstringGrid: (FrmAddNewMember.Components[ i ] as TstringGrid).enabled := false;
end;
有没有办法使其他控件不可编辑,但仍然允许将它们的内容复制到剪贴板中?
附注 我已经查看了
disable-edits-on-datagridview-but-still-allow-for-highlighting-to-copy-and-paste
和
make-all-controls-on-a-form-read-only-at-once-without-one-linkbutton
并在其他地方搜索。也许这不能简单地完成。
TPanel.Enabled := false
所做的)。个人而言,如果我要编写这样的程序,我会创建自己的组件(派生自标准组件),具有特殊属性,可以正确地禁用它们并保持从它们复制信息的能力。当然,这种方式会花费一些时间(和金钱),但对于进一步的程序维护来说会更好。 - Josef Švejk