gpt4 book ai didi

delphi - TDBEdit PopupMenu 默认行为

转载 作者:行者123 更新时间:2023-12-02 03:38:38 25 4
gpt4 key购买 nike

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

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

最佳答案

您可以使用应用程序的 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 以及然后将其分配给表单。这还没有经过浸泡测试,可能需要一些技巧,但希望应该能让你继续下去。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com