当选择了未设置其PupupMenu属性的TDBEdit控件并单击了“鼠标右键”时,Delphi 5(是的,我知道它很旧)和Delphi 10.1之间的行为似乎有所变化。在Delphi 5中,将显示TDBEdit的父控件PopupMenu(假定它具有一个),但是在Delphi 10.1中,将显示“标准” Windows上下文菜单[“撤消”,“剪切”,...“从右向左阅读顺序”等)。 。]。

如果没有显式设置,如何获取Delphi 10.1以使用TDBEdit控件的父控件的PopupMenu。所迁移的应用程序具有各种形式,每种形式都有数十个TDBEdit控件,并且必须将其PopupMenu属性中的每个属性显式设置为其父控件的属性的想法令人生畏!

最佳答案

您可以使用应用程序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是否不为零(如果已将其显式设置为某种值),尚未将其设置为封闭表单的PopUpMenu,然后将其分配给表单的。尚未经过浸泡测试,可能需要一些技巧,但希望可以帮助您。

关于delphi - TDBEdit PopupMenu默认行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41202605/

10-11 04:03