gpt4 book ai didi

windows - 用我自己的替换 TCustomEdit 上下文菜单

转载 作者:可可西里 更新时间:2023-11-01 12:37:07 26 4
gpt4 key购买 nike

我想用我自己的弹出菜单(有很多操作)替换 TCustomEdit 组件(如 TEdit 或 TMemo)中 delphi 显示的所有弹出菜单。到目前为止,我用我自己的 TPopUpMenu 手动替换了每个组件的 PopUpMenu 属性。但我想知道我是否可以在不为所有表单中的每个组件手动修改此属性的情况下执行此操作。

我想要一个钩子(Hook)之类的东西来拦截对该系统菜单的调用并替换为我自己的菜单。这可能吗?

enter image description here

最佳答案

如果您的表单派生自一个共同的祖先(而不是默认的 TForm),例如 TMyBaseForm,意思是 TForm1 = class(TMyBaseForm)这可以很容易地完成。在 TMyBaseForm.OnShow 事件中,您可以遍历它的控件,如果您找到 TEditTMemo,您可以设置它们的 PopupMenu 动态属性。

另一种方法是使用 Screen.OnActiveFormChange(如果您右键单击事件控件,Screen.OnActiveControlChange 会触发得太迟 - 编辑:这是真的仅使用 D5) 在您的主表单事件处理程序中捕获事件表单并遍历 Screen.ActiveForm 控件并设置 TEditTMemo 属性 PopupMenu 到您的自定义 MyPopupMenu:

procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveFormChange := ActiveFormChange;
end;

procedure TForm1.ActiveFormChange(Sender: TObject);
begin
CustomEditControlsNormalize(Screen.ActiveForm);
end;

type
TCustomEditAccess = class(TCustomEdit);

procedure TForm1.CustomEditControlsNormalize(F: TForm);
var
I: Integer;
begin
if not Assigned(F) then Exit;
for I := 0 to F.ComponentCount - 1 do
if F.Components[I] is TCustomEdit then
TCustomEditAccess(F.Components[I]).Popupmenu := MyPopupMenu;
end;

要确定哪个 TCustomEdit 控件导致 Popupmenu 弹出,请引用 MyPopupMenu.PopupComponent(在 MyPopupMenu.OnPopup 事件中) :

procedure TForm1.MyPopupMenuPopup(Sender: TObject);
begin
if MyPopupMenu.PopupComponent is TCustomEdit then
begin
FEditPopupControl := TCustomEdit(MyPopupMenu.PopupComponent);
Caption := FEditPopupControl.Name; // debug :-P
end;
end;

编辑 Screen.OnActiveControlChange 是我最初的想法。我已经在 D5 中测试过了。如果 Edit1 被聚焦,我右击 Edit2,它会先弹出默认菜单,然后它才成为事件控件。我终于用 D7 和 D2009 测试了这个。两者都很好。这只是一个D5 问题 所以Justmade's answer肯定是比使用 Screen.OnActiveFormChange 更好的解决方案。

关于windows - 用我自己的替换 TCustomEdit 上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9627448/

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