当选择没有设置PupupMenu属性的TDBEdit控件并单击鼠标右键时,Delphi 5(是的,我知道它已经很老)和Delphi 10.1之间的行为似乎发生了变化。在Delphi 5中,TDBEdit的父控件PopupMenu被呈现(假设它当然有一个)但在Delphi 10.1中标准'提供Windows上下文菜单['撤消','剪切',...'从右到左阅读顺序'等]。
如果没有明确设置的话,我怎样才能让Delphi 10.1使用TDBEdit控件的父控件的PopupMenu。正在迁移的应用程序有多种形式,每种形式都有数十个TDBEdit控件,而且必须将每个PopupMenu属性显式设置为父控件的想法有点令人生畏!
答案 0 :(得分:3)
您可以使用应用程序OnActiveFormChange
对象的Screen
事件为此执行简单(或者,您可能会说,简单化)的运行时修复。
将大部分必要代码放在至少使用主表单的数据模块中可能最简单。
例如,将以下方法添加到数据模块中:
Uses [...] Forms, DBCtrls;
procedure TdmPopUp.ActiveFormChange(Sender: TObject);
begin
FixUpDBEdits(Screen.ActiveForm);
end;
procedure TdmPopUp.FixUpDBEdits(AForm : TForm);
procedure FixUpDBEdit(ADBEdit : TDBEdit);
begin
if ADBEdit.PopupMenu = Nil then
if ADBEdit.PopupMenu <> AForm.PopupMenu then
ADBEdit.PopupMenu := AForm.PopupMenu
end;
procedure FixUpDBEditsInner(AComponent : TComponent);
var
i : Integer;
begin
if AComponent is TDBEdit then
FixUpDBEdit(TDBEdit(AComponent));
for i := 0 to AComponent.ComponentCount - 1 do
if AComponent.Components[i] is TDBEdit then
FixUpDBEdit(TDBEdit(AComponent.Components[i]));
end;
begin
FixUpDBEditsInner(AForm);
end;
然后,您需要的所有其他代码可以放在主窗体的OnCreate和OnDestroy中:
procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveFormChange := Nil;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveFormChange := dmPopUp.ActiveFormChange;
end;
显然,“努力工作”是在数据模块的FixUpDBEdit
子程序中完成的。我的版本只是检查DBEdit的PopUpMenu
是不是nil(如果已经明确设置为某些内容),它还没有设置为封闭表单的PopUpMenu
,然后将其分配给表单。这还没有进行过浸泡测试,可能需要进行一些调整,但希望能让你前进。