@@ -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