【问题标题】:TDBEdit PopupMenu Default BehaviourTDBEdit PopupMenu 默认行为
【发布时间】:2017-05-03 07:48:13
【问题描述】:

似乎是delphi 5之间的行为的变化(是,我知道它是非常旧的)和delphi 10.1当没有选择没有其PupupMenu属性集的TDBedit控件并且单击鼠标右键时。在 Delphi 5 TDBEdit 的父控件中显示 PopupMenu(当然假设它有一个),但在 Delphi 10.1 中显示了“标准”Windows 上下文菜单 ['Undo'、'Cut'、...'从右到左阅读顺序'等.].

如果没有明确设置一个 TDBEdit 控件的父控件的 PopupMenu,我如何让 Delphi 10.1 使用它。被迁移的应用程序有数百个表单,每个表单都包含数十个 TDBEdit 控件,并且必须将它们的每个 PopupMenu 属性显式设置为三个父控件的属性,这有点令人生畏!

【问题讨论】:

  • 是的,这种行为变化可能有点痛苦。鉴于您拥有的表格数量,您是否正在寻找涉及某种运行时修复或 .DFM 文件的(半)自动更新的解决方案?就个人而言,我会考虑使用 GExpert 的 Grep Results 实用程序中的 Replace 工具来更改 .DFM。
  • 确实如此。时间就是生命。 Popup 属性和 OnContextPopup 事件文档提供了用于处理弹出菜单的自动或显式呈现的各种选项组合,但没有提及显示“windows”弹出菜单的默认行为(这取决于所使用的操作系统)。
  • 除非我可以在 IDE 中找到一个项目\应用程序级别选项来抑制这种行为,否则我认为我将不得不“教育”用户选择和字段,并确保他们然后人民币点击外部防止弹出窗口的字段而不是父控件弹出窗口(设计为包含当前选定字段的选项)。

标签: delphi


【解决方案1】:

您可以使用应用程序的 Screen 对象的 OnActiveFormChange 事件对此进行简单(或者,您可能会说是简单化)运行时修复。

将大部分必要的代码放在至少由您的主窗体使用的数据模块中可能是最简单的。

例如在数据模块中添加以下方法:

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,然后将其分配给表单。这还没有经过浸泡测试,可能需要一些技巧,但希望能让您继续前进。

【讨论】:

  • 非常感谢。具有讽刺意味的是,当每个 Form 的 PopupMenu 被激活时,会检查 Form 的控件(包括任何 TDBEdit),并使用它们的当前状态(例如“内容”)来影响 Form 的 PopupMenu 中显示的项目。
  • @SLBentall:很高兴为您提供帮助。我承认我只是粗略地搜索了 TDBEdit 的 PopUpMenu 是如何在 Delphi Seattle 中设置的,找不到它并决定我的“大锤”方式可能是一种方法。
猜你喜欢
  • 2021-08-07
  • 2019-07-29
  • 2014-10-03
  • 1970-01-01
  • 2021-09-11
  • 2017-04-05
  • 2015-05-28
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多