delphi – 有没有办法在使用Frames时具有类似KeyPreview的功能?

delphi – 有没有办法在使用Frames时具有类似KeyPreview的功能?,第1张

概述我希望在Frames中有一个KeyPreview功能,我的意思是,当输入(例如,选择框架的一个控件,或鼠标在里面)是在一个框架(这将有几个面板和其他控件) )然后由框架首先处理用户按下的键. 有没有办法做到这一点?我没有在TFrame中找到类似于KeyPreview的属性. 我正在使用RAD Studio的XE5版本,尽管我主要使用C Builder. 由于我最近的 “When does a Sh 我希望在Frames中有一个KeyPrevIEw功能,我的意思是,当输入(例如,选择框架的一个控件,或鼠标在里面)是在一个框架(这将有几个面板和其他控件) )然后由框架首先处理用户按下的键.

有没有办法做到这一点?我没有在TFrame中找到类似于KeyPrevIEw的属性.

我正在使用RAD Studio的XE5版本,尽管我主要使用C Builder.

解决方法 由于我最近的 “When does a ShortCut fire”调查,我已经为你的Frame制定了一个独立的解决方案.

简而言之:所有关键消息都输入到活动控件的TWinControl.CNKeyDWon中.该方法调用TWinControl.IsMenuKey,它在确定消息是否为ShortCut时遍历所有父节点.是通过调用其GetPopupMenu.IsShortCut方法来实现的.我已经覆盖了Frame的GetPopupMenu方法,如果它不存在则创建一个.请注意,您始终可以自己向框架添加PopupMenu.通过继承TPopupMenu并重写IsShortCut方法,调用Frame的KeyDown方法,该方法用作您需要的KeyPrevIEw功能. (我也可以分配OnKeyDdown事件处理程序).

unit Unit2;interfaceuses  WinAPI.Messages,System.Classes,Vcl.Controls,Vcl.Forms,Vcl.Menus,Vcl.StdCtrls;type  TPopupMenu = class(Vcl.Menus.TPopupMenu)  public    function IsShortCut(var Message: TWMKey): Boolean; overrIDe;  end;  TFrame2 = class(TFrame)    Label1: TLabel;    Edit1: TEdit;  private    FPrevIEwPopup: TPopupMenu;  protected    function GetPopupMenu: Vcl.Menus.TPopupMenu; overrIDe;    procedure KeyDown(var Key: Word; Shift: TShiftState); overrIDe;  end;implementation{$R *.dfm}{ TPopupMenu }function TPopupMenu.IsShortCut(var Message: TWMKey): Boolean;var  ShiftState: TShiftState;begin  ShiftState := KeyDataToShiftState(Message.KeyData);  TFrame2(Owner).KeyDown(Message.CharCode,ShiftState);  Result := Message.CharCode = 0;  if not Result then    Result := inherited IsShortCut(Message);end;{ TFrame2 }function TFrame2.GetPopupMenu: Vcl.Menus.TPopupMenu;begin  Result := inherited GetPopUpMenu;  if Result = nil then  begin    if FPrevIEwPopup = nil then      FPrevIEwPopup := TPopupMenu.Create(Self);    Result := FPrevIEwPopup;  end;end;procedure TFrame2.KeyDown(var Key: Word; Shift: TShiftState);begin  if (Key = Ord('X')) and (ssCtrl in Shift) then  begin    Label1.Caption := 'OH NO,DON''T DO THAT!';    Key := 0;  end;end;end.
总结

以上是内存溢出为你收集整理的delphi – 有没有办法在使用Frames时具有类似KeyPreview的功能?全部内容,希望文章能够帮你解决delphi – 有没有办法在使用Frames时具有类似KeyPreview的功能?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1273929.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存