@@ -16,6 +16,17 @@ interface
1616 SetBounds and Repaint 
1717 Exposes properties Parent and Visible 
1818 }  
19+ 
20+  {  TKeyEvent wrapper } 
21+  TKeyEventHandler = class (TEventHandler)
22+  protected 
23+  procedure  DoEvent (Sender: TObject; var  Key: Word; var  KeyChar: WideChar; Shift: TShiftState);
24+  public 
25+  constructor  Create(APyDelphiWrapper: TPyDelphiWrapper; AComponent: TObject;
26+  APropertyInfo: PPropInfo; ACallable: PPyObject); override;
27+  class  function  GetTypeInfo : PTypeInfo; override;
28+  end ;
29+ 
1930 TPyDelphiControl = class  (TPyDelphiFmxObject)
2031 private 
2132 function  GetDelphiObject : TControl;
@@ -179,6 +190,8 @@ procedure TControlsRegistration.RegisterWrappers(
179190 APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiStyleBook);
180191 APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiPopup);
181192 APyDelphiWrapper.RegisterDelphiWrapper(TPyDelphiCustomControlAction);
193+ 
194+  APyDelphiWrapper.EventHandlers.RegisterHandler(TKeyEventHandler);
182195end ;
183196
184197{  TPyDelphiControl } 
@@ -769,6 +782,75 @@ procedure TPyDelphiCustomControlAction.SetDelphiObject(
769782 inherited  DelphiObject := Value ;
770783end ;
771784
785+ {  TKeyEventHandler } 
786+ 
787+ constructor  TKeyEventHandler.Create(APyDelphiWrapper: TPyDelphiWrapper;
788+  AComponent: TObject; APropertyInfo: PPropInfo; ACallable: PPyObject);
789+ var 
790+  LMethod : TMethod;
791+ begin 
792+  inherited ;
793+  LMethod.Code := @TKeyEventHandler.DoEvent;
794+  LMethod.Data := Self;
795+  SetMethodProp(AComponent, APropertyInfo, LMethod);
796+ end ;
797+ 
798+ class  function  TKeyEventHandler.GetTypeInfo : PTypeInfo;
799+ begin 
800+  Result := System.TypeInfo(TKeyEvent);
801+ end ;
802+ 
803+ procedure  TKeyEventHandler.DoEvent (Sender: TObject; var  Key: Word;
804+  var  KeyChar: WideChar; Shift: TShiftState);
805+ var 
806+  LPyObject: PPyObject;
807+  LPyTuple: PPyObject;
808+  LPyResult: PPyObject;
809+  LPyKey: PPyObject;
810+  LVarKeyParam: TPyDelphiVarParameter;
811+  LPyKeyChar: PPyObject;
812+  LVarKeyCharParam: TPyDelphiVarParameter;
813+  LKeyCharStr: string;
814+ begin 
815+  Assert(Assigned(PyDelphiWrapper));
816+  if  Assigned(Callable) and  PythonOK then 
817+  with  GetPythonEngine do  begin 
818+  LPyObject := PyDelphiWrapper.Wrap(Sender);
819+  // var parameters
820+  LPyKey := CreateVarParam(PyDelphiWrapper, Key);
821+  LVarKeyParam := PythonToDelphi(LPyKey) as  TPyDelphiVarParameter;
822+  LPyKeyChar := CreateVarParam(PyDelphiWrapper, KeyChar);
823+  LVarKeyCharParam := PythonToDelphi(LPyKeyChar) as  TPyDelphiVarParameter;
824+ 
825+  LPyTuple := PyTuple_New(4 );
826+  GetPythonEngine.PyTuple_SetItem(LPyTuple, 0 , LPyObject);
827+  GetPythonEngine.PyTuple_SetItem(LPyTuple, 1 , LPyKey);
828+  GetPythonEngine.PyTuple_SetItem(LPyTuple, 2 , LPyKeyChar);
829+  GetPythonEngine.PyTuple_SetItem(LPyTuple, 3 , ShiftToPython(Shift));
830+  try 
831+  LPyResult := PyObject_CallObject(Callable, LPyTuple);
832+  if  Assigned(LPyResult) then 
833+  begin 
834+  Py_DECREF(LPyResult);
835+  if  PyLong_Check(LVarKeyParam.Value ) then 
836+  Key := PyLong_AsLong(LVarKeyParam.Value );
837+ 
838+  if  (LVarKeyCharParam.Value  = Py_None) then 
839+  KeyChar := #0 
840+  else  if  PyUnicode_Check(LVarKeyCharParam.Value ) then 
841+  begin 
842+  LKeyCharStr := PyUnicodeAsString(LVarKeyCharParam.Value );
843+  if  Length(LKeyCharStr) > 0  then 
844+  KeyChar := LKeyCharStr[1 ];
845+  end ;
846+  end ;
847+  finally 
848+  Py_DECREF(LPyTuple);
849+  end ;
850+  CheckError();
851+  end ;
852+ end ;
853+ 
772854initialization 
773855 RegisteredUnits.Add(TControlsRegistration.Create);
774856
0 commit comments