TDBEdit PopupMenu默认行为

时间:2016-12-17 20:10:12

标签: delphi

当选择没有设置PupupMenu属性的TDBEdit控件并单击鼠标右键时,Delphi 5(是的,我知道它已经很老)和Delphi 10.1之间的行为似乎发生了变化。在Delphi 5中,TDBEdit的父控件PopupMenu被呈现(假设它当然有一个)但在Delphi 10.1中标准'提供Windows上下文菜单['撤消','剪切',...'从右到左阅读顺序'等]。

如果没有明确设置的话,我怎样才能让Delphi 10.1使用TDBEdit控件的父控件的PopupMenu。正在迁移的应用程序有多种形式,每种形式都有数十个TDBEdit控件,而且必须将每个PopupMenu属性显式设置为父控件的想法有点令人生畏!

1 个答案:

答案 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,然后将其分配给表单。这还没有进行过浸泡测试,可能需要进行一些调整,但希望能让你前进。