有没有办法做到这一点?我没有在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的功能?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)