-
Content Count
336 -
Joined
-
Last visited
-
Days Won
4
Everything posted by shineworld
-
Mmmmm.... seems that Canvas.FillText can't be used... I'm not a guru on Python and DelphiFMX so I can mistake in anything but debugging: >>> import DelphiFMX as fmx >>> img = fmx.Image(None) >>> bmp = img.Bitmap >>> bmp.Handle >>> bmp.Width = 200 >>> bmp.Height = 200 >>> c = bmp.Canvas >>> r = fmx.RectF(0,0,10,10) >>> c.FillText(r, 'hello', True, 1, [], ['Center'], ['Center']) the FindMethod "find" FillRect and first ARect parameter in FMX is a Record when Python call to c.FillText manages R as a class so the arguments check stops at the first argument with an error. Waiting for GURU info 🙂
-
Seems TTextAlign is not available in DelphiFMX library : Microsoft Windows [Versione 10.0.19045.2965] (c) Microsoft Corporation. Tutti i diritti sono riservati. P:\>pip list Package Version ---------------------- ------------ delphifmx 1.0.6 NameError: name 'TTextAlign' is not defined Traceback (most recent call last): File "D:\x\develop\qem\cnc_api_client_core_1\python\api_client_fmx_demo\api_client_fmx_demo_desktop_view.py", line 692, in __on_timer_update canvas.FillText(r, 'hello world', False, 1, [], TTextAlign.Center, TTextAlign.Center) ^^^^^^^^^^ NameError: name 'TTextAlign' is not defined *** Remote Interpreter Reinitialized *** >>> import delphifmx as fmx >>> dir(fmx) ['Abort', 'Action', 'ActionList', 'AdapterListView', 'AniIndicator', 'AppearanceListView', 'Application', 'Arc', 'ArcDial', 'BaseBindScopeComponent', 'BaseLinkingBindSource', 'BaseObjectBindSource', 'BaseValueRange', 'BasicAction', 'BasicBindComponent', 'BindComponentDelegate', 'BindingsList', 'BitmapTrackBar', 'Bounds', 'BufferedFileStream', 'BufferedLayout', 'Button', 'BytesStream', 'Calendar', 'CalloutPanel', 'CalloutRectangle', 'CameraComponent', 'CaretRectangle', 'CheckBox', 'CheckColumn', 'Circle', 'Collection', 'ColorBox', 'ColorButton', 'ColorComboBox', 'ColorListBox', 'ColorPanel', 'ColorPicker', 'ColorQuad', 'Column', 'ComboBox', 'ComboColorBox', 'ComboEdit', 'ComboEditBase', 'CommonCustomForm', 'Component', 'ContainedAction', 'ContainedActionList', 'ContainedBindComponent', 'Control', 'ControlSize', 'CornerButton', 'CreateComponent', 'CurrencyColumn', 'CustomAction', 'CustomActionList', 'CustomBindingsList', 'CustomBufferedLayout', 'CustomButton', 'CustomCalendar', 'CustomColorComboBox', 'CustomComboBox', 'CustomComboEdit', 'CustomControlAction', 'CustomCornerButton', 'CustomDateEdit', 'CustomDateTimeEdit', 'CustomEdit', 'CustomEditBox', 'CustomForm', 'CustomGrid', 'CustomLinkControlToField', 'CustomLinkListControlToField', 'CustomLinkPropertyToField', 'CustomListBox', 'CustomListView', 'CustomMediaCodec', 'CustomMediaPlayerAction', 'CustomMemo', 'CustomMemoryStream', 'CustomMultiView', 'CustomNumberColumn', 'CustomPath', 'CustomPopupForm', 'CustomPopupMenu', 'CustomPresentedFramedScrollBox', 'CustomPresentedFramedVertScrollBox', 'CustomPresentedHorzScrollBox', 'CustomPresentedScrollBox', 'CustomPresentedVertScrollBox', 'CustomPrototypeBindSource', 'CustomScrollBox', 'CustomSwitch', 'CustomTimeEdit', 'CustomTrack', 'CustomValueRange', 'CustomValueRangeAction', 'CustomViewAction', 'DateColumn', 'DateEdit', 'DateTimeColumn', 'DateTimeColumnBase', 'DelphiDefaultContainer', 'DelphiDefaultIterator', 'DelphiMethod', 'DialogService', 'Edit', 'Ellipse', 'Expander', 'ExpanderButton', 'FMXBindNavigateAction', 'FMXBindNavigateApplyUpdates', 'FMXBindNavigateCancel', 'FMXBindNavigateCancelUpdates', 'FMXBindNavigateDelete', 'FMXBindNavigateEdit', 'FMXBindNavigateFirst', 'FMXBindNavigateInsert', 'FMXBindNavigateLast', 'FMXBindNavigateNext', 'FMXBindNavigatePost', 'FMXBindNavigatePrior', 'FMXBindNavigateRefresh', 'FileExit', 'FileHideApp', 'FileHideAppOthers', 'FileStream', 'FloatColumn', 'FlowLayout', 'FmxObject', 'Form', 'Frame', 'FramedScrollBox', 'FramedVertScrollBox', 'GetProcessDpiAwareness', 'GlyphColumn', 'GradientEdit', 'Grid', 'GridLayout', 'GridPanelLayout', 'GroupBox', 'HandleStream', 'HintAction', 'HorzScrollBox', 'IDABORT', 'IDCANCEL', 'IDCLOSE', 'IDCONTINUE', 'IDHELP', 'IDIGNORE', 'IDNO', 'IDOK', 'IDRETRY', 'IDTRYAGAIN', 'IDYES', 'Image', 'ImageColumn', 'ImageControl', 'IntegerColumn', 'IsDpiAware', 'Label', 'Layout', 'Line', 'LinkControlDelegate', 'LinkControlToField', 'LinkControlToFieldDelegate', 'LinkListControlToField', 'LinkPropertyToField', 'LinkPropertyToFieldDelegate', 'ListBox', 'ListBoxItem', 'ListView', 'ListViewBase', 'MB_ABORTRETRYIGNORE', 'MB_APPLMODAL', 'MB_DEFBUTTON1', 'MB_DEFBUTTON2', 'MB_DEFBUTTON3', 'MB_DEFBUTTON4', 'MB_HELP', 'MB_ICONASTERISK', 'MB_ICONERROR', 'MB_ICONEXCLAMATION', 'MB_ICONHAND', 'MB_ICONINFORMATION', 'MB_ICONQUESTION', 'MB_ICONSTOP', 'MB_ICONWARNING', 'MB_NOFOCUS', 'MB_OK', 'MB_OKCANCEL', 'MB_RETRYCANCEL', 'MB_SYSTEMMODAL', 'MB_TASKMODAL', 'MB_YESNO', 'MB_YESNOCANCEL', 'MainMenu', 'Media', 'MediaPlayer', 'MediaPlayerControl', 'MediaPlayerCurrentTime', 'MediaPlayerPlayPause', 'MediaPlayerStart', 'MediaPlayerStop', 'MediaPlayerValue', 'MediaPlayerVolume', 'Memo', 'MemoryStream', 'MenuBar', 'MenuItem', 'MultiView', 'NumberBox', 'Object', 'ObjectViewAction', 'OpenDialog', 'PaintBox', 'Panel', 'PascalInterface', 'PascalRecord', 'Path', 'PathLabel', 'Persistent', 'Pie', 'Point', 'PointF', 'Popup', 'PopupColumn', 'PopupMenu', 'Position', 'PresentedFramedScrollBox', 'PresentedFramedVertScrollBox', 'PresentedHorzScrollBox', 'PresentedListView', 'PresentedScrollBox', 'PresentedTextControl', 'PresentedVertScrollBox', 'ProgressBar', 'ProgressColumn', 'PrototypeBindSource', 'RadioButton', 'Rect', 'RectF', 'Rectangle', 'ResourceStream', 'RoundRect', 'SaveDialog', 'ScaledLayout', 'Screen', 'ScrollBar', 'ScrollBox', 'SearchBox', 'Selection', 'SelectionPoint', 'SetHighDpiAware', 'SetProcessDpiAwareness', 'Shape', 'Size', 'SizeF', 'SizeGrip', 'SmallScrollBar', 'SpeedButton', 'SpinBox', 'Splitter', 'StatusBar', 'Stream', 'StringColumn', 'StringGrid', 'StringStream', 'Strings', 'StyleBook', 'StyleManager', 'StyleStreaming', 'StyledControl', 'Switch', 'SysCommonAction', 'TabControl', 'TabItem', 'Text', 'TextControl', 'Thumb', 'TimeColumn', 'TimeEdit', 'Timer', 'ToolBar', 'Touch', 'Track', 'TrackBar', 'ValueRange', 'ValueRangeAction', 'VarParameter', 'VertScrollBox', 'ViewAction', 'VirtualKeyboard', 'WindowClose', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'crAppStart', 'crArrow', 'crCross', 'crDefault', 'crDrag', 'crHSplit', 'crHandPoint', 'crHelp', 'crHourGlass', 'crIBeam', 'crMultiDrag', 'crNo', 'crNoDrop', 'crNone', 'crSQLWait', 'crSize', 'crSizeAll', 'crSizeNESW', 'crSizeNS', 'crSizeNWSE', 'crSizeWE', 'crUpArrow', 'crVSplit', 'fmCreate', 'fmOpenRead', 'fmOpenReadWrite', 'fmOpenWrite', 'fmShareCompat', 'fmShareDenyNone', 'fmShareDenyRead', 'fmShareDenyWrite', 'fmShareExclusive', 'ssAlt', 'ssCtrl', 'ssDouble', 'ssLeft', 'ssMiddle', 'ssRight', 'ssShift'] >>>
-
OK Bitmap can be modified not, but I was not able to find how to use TCanvas.FillText with Python DelphiFMX. Any try to pass arguments give me: Traceback (most recent call last): File "D:\x\develop\qem\cnc_api_client_core_1\python\api_client_fmx_demo\api_client_fmx_demo_desktop_view.py", line 690, in __on_timer_update canvas.FillText(r, 'hello world', False, 100.0, None, 'Center', 'Center') TypeError: "FillText" called with invalid arguments. # update tab digital inputs/outputs values if self.TabControl.ActiveTab == self.TabDIO: bitmap = self.DIOImage.Bitmap bitmap.Width = int(self.DIOImage.Width) bitmap.Height = int(self.DIOImage.Height) bitmap.Clear(0xFF000000) canvas = bitmap.Canvas r = RectF(8 + 15, 10, bitmap.Width - 8, bitmap.Height - 10) # from delphi FMX documentation # procedure FillText( # const ARect: TRectF; # const AText: string; # const WordWrap: Boolean; # const AOpacity: Single; # const Flags: TFillTextFlags; # const ATextAlign: TTextAlign; # const AVTextAlign: TTextAlign = TTextAlign.Center # ); virtual; canvas.FillText(r, 'hello world', False, 100.0, None, 'Center', 'Center')
-
This can help because I was able to find and download ONLY OpenCV DLL for 64-bits.
-
I was not able to run pre-made samples. They are 32-bit not 64-bit and library README.MD say that only 64-bit are possibile. I've tried to activate 64-bit platform in samples project but only 32-bit it is possible.
-
Contributing to projects on GitHub with Subversion
shineworld replied to dummzeuch's topic in Tips / Blogs / Tutorials / Videos
In the company, when we switched from SVN to GIT, it was hard, initially just using console commands. Then we started using TortoiseGIT and a way opened up. Everything runs smoothly. Collaborative work got easier, like tracking changes, versions, etc. At this point, I honestly don't regret SVN at all... -
Take care: You can have a Python embed version OUT of path which works but if you have the same version of Python installed normally your embedded version pip list will reach ALSO a cached path (from the normally installed Python version) in %APPDATA%\Python\Python<version>\site-packages. This does not overload your native Python embed local packages, just add others to pip visibility.
-
Win11/Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz Max 1.99 GHz (Max limited because a notebook)/4-cores/8-threads/16GB/RAD10.4/Release/<below data> D:\spritz_bench>spritz_bench.exe spritz prng: 149.50 MiB/s D:\spritz_bench>spritz_bench.64.exe spritz prng: 191.12 MiB/s
-
I wrote "it's fast" not "it's the fastest". In some things it is the same as C++, in others, it is slightly slower but not as bad. I work on very large projects, the last one being about 19 million lines of code, where there is a lot of math and UI. I don't regret C++, I've tried translating parts from Delphi to Visual Studio C++ and then embedded as a DLL with no significant gains, but resulting in longer development times and adding debugging difficulties. I use C and C++ a lot in the linux environment for embedded boards in ARM architecture, even if I have never seriously dealt with the freepascal counterpart, as in that environment you would navigate by sight.
-
you can't compare Python vs Delphi but think of Python with Delphi 🙂
-
Delphi is not DEAD is a very very OOP-powerful language. It is fast. It is simple and concise. It is robust and safe. It is productive (few lines of code compared to C++, Java, etc). If completely customizable, you can modify any unit of any library (with sources) to do customized things. Projects code has high longevity (I've moved old projects of 2007 to the latest versions with very few changes). Support many platforms (I will hope in the future full direct support of Linux also for arm processors). Long life to the Delphi!
-
For me the better solution is 1. To use Python on Delphi, to access the immense packages library of Python overall in math things. 2. Use Delphi to create new very fast modules, and packages, for Python, for example to move threaded things on Delphi where Python thread are very funny. 3. Use Delphi VCL/FMX to create robust Python UI and programs. Delphi compiled code is one of more fast in the market. Python covers a lot of scientific fields. Use either and you will be a winner.
-
Hi all, I would like to add, to a python4delphi module, a getter method which return a 'dict'. For example: > import pycnccore1 as pyc >cnc_core = pyc.CNCCore() >print(cnc_core.paths) {'user_path': 'c:\\xyz', 'machine_path': 'd:\\machine_test', and so on} I don't know how to create a Delphi type to contain the dictionary and convert it to a Python dict as a result of the getter method. function TPyCNCCore.GetPaths(AContext: Pointer): PPyObject; begin Adjust(@Self); var PathDict: <i_do_not_know>; PathDict.Append('user_path', Self.UserPathString); PathDict.Append('machine_path', Self.MachinePathString); ... and so on ... Result := GetPythonEngine.VariantAsPyObject(PathDict); end; class procedure TPyCNCCore.RegisterGetSets(PythonType: TPythonType); begin inherited; with PythonType do begin PythonType.AddGetSet('paths', @TPyCNCCore.GetPaths, nil, 'Returns the used paths', nil); end; end; Thanks in advance for your suggestions Silverio
-
Ah ok, I completely misrepresented your previous sugestions. So it would make more sense to do a normal GetPath(name) method that returns the value instead of returning a dictionary with all the variables 🙂 It makes sense Thanks for the suggestion
-
In other projects, I've used the automatic conversion of Delphi classes to related Python wrapper classes. In this project, I would like manually create the python module classes using low-level python implementation. Looking at P4D WrapFireDac.pas code I saw a way to manually create a dictionary. Seems to work but is hard to know when to apply Py_XDecRef.... function TPyCNCCore.GetPaths(AContext: Pointer): PPyObject; var Key: PPyObject; Value: PPyObject; PathsDict: PPyObject; Engine: TPythonEngine; procedure AddItem(const K, V: string); begin Key := Engine.VariantAsPyObject(Variant(K)); Value := Engine.VariantAsPyObject(Variant(V)); Engine.PyDict_SetItem(PathsDict, Key, Value); Engine.Py_XDecRef(Key); Engine.Py_XDecRef(Value); end; begin Adjust(@Self); Engine := GetPythonEngine; PathsDict := Engine.PyDict_New; AddItem('MachineBackupPath', Self.FCNCManager.MachineBackupPath); AddItem('MachineCustomizePath', Self.FCNCManager.MachineCustomizePath); AddItem('MachineMacrosPath', Self.FCNCManager.MachineMacrosPath); AddItem('MachineMediaPath', Self.FCNCManager.MachineMediaPath); AddItem('MachinePath', Self.FCNCManager.MachinePath); AddItem('MachineRunPath', Self.FCNCManager.MachineRunPath); AddItem('MachineVmPath', Self.FCNCManager.MachineVmPath); AddItem('SamplesPath', Self.FCNCManager.SamplesPath); AddItem('UserDataPath', Self.FCNCManager.UserDataPath); Result := PathsDict; end; I don't know if this is the right way to 'return' a dict in a getter method.. In my ignorance of the subject, I am navigating by sight. Should be cool a direct way to convert a TDictionary to Python dict.
-
Check also https://www.tmssoftware.com/site/blog.asp?post=1091 or import Adobe Reader ActiveX: Just 1 minutes to integrate Reader in an empty delphi application
-
To propagate open-source state, on an inherited library, project must be under LGPL.
-
Hi all, First of all, I apologise if what is required is poorly described, but unfortunately I know very little about networks and their knowledge. But let's get down to facts. In an industrial machine control application, I have inserted a server, a TCP/IP server based on JSON messages, which allows the connection of several clients at the same time and enables motor movement commands to be executed or information to be retrieved from the system. A client programme connects to the server and from then on can do anything with the device it has connected to. At this point, security problems arise, especially for the operator standing at the machine, since a malicious client intruding into the network could trigger dangerous operations for the operator standing near the machine and unaware that someone unauthorised has taken control of it remotely. Now I have been asked to add a security layer, but as a complete ignoramus on the subject, I deal mainly with compilers of languages and UI environments and not with networks, I was wondering how to add a system of certification and authorisation of the client to the server connection. For the client I use python while the server is done with Indy 10 using TIdTCPServer. Thank you in advance for any suggestions and help. Best regards Silverio
-
Protected TCP/IP Client/Server connection
shineworld replied to shineworld's topic in Network, Cloud and Web
I will try to learn how to add TLS in TIdTCPServer and TIdTCPClient 🙂 -
Protected TCP/IP Client/Server connection
shineworld replied to shineworld's topic in Network, Cloud and Web
The API Server (based on TCP/IP JSON requests) permits commands as {"cmd":"start.axis.movement"} so a TCP/IP client can connect to API Server, ask for an axis motor to start. At moment any TCP/IP client, eg: Telnet, can ask for an API Server connection and is not safe for machine operator. I would like to permit connection ONLY on trusted client applications (I my case a python program or a Delphi program which run in office). And I would like that client/api messages are crypted during transport so none can intercept and learn what commands are used. I can crypt/decript JSON messages to obfuscate them using for eg: bluefish or similar but I can't avoid a not trusted/client connection. -
Hi all. Usually I use FMX styles as they are for Firemonkey applications. I need to check a style contents with the designer (I do that with VCL styles), but I'm not able to find FMX Style Designer in Tools menu. Searching with Google seems that FMX Style Designer is available since XE but I cannot find it. Have you any idea about ?
- 1 reply
-
- fmx
- style designer
-
(and 1 more)
Tagged with:
-
Sorry all, found it... is in TStyleBook component properties...
- 1 reply
-
- fmx
- style designer
-
(and 1 more)
Tagged with:
-
pyvista How to deploy third-party python modules, like Pyvista?
shineworld replied to Juan C.Cilleruelo's topic in Python4Delphi
The readme is in Italian language but can be simply tranlsated with google: After pip installation with > python get-pip.py it is necessary to rename python<version>._pth to python<version>._pth-disabled or delete it so you can install packages with pip. readme.txt- 10 replies
-
- deploy
- installing
-
(and 1 more)
Tagged with:
-
pyvista How to deploy third-party python modules, like Pyvista?
shineworld replied to Juan C.Cilleruelo's topic in Python4Delphi
The embedded python is not in the Windows path so he can't reach the %USERDATA%\Programs\Python\<embedded_python_path>\Scripts\pip. You can also remove pip during installation when finisched to install all the offline packages 🙂- 10 replies
-
- deploy
- installing
-
(and 1 more)
Tagged with:
-
pyvista How to deploy third-party python modules, like Pyvista?
shineworld replied to Juan C.Cilleruelo's topic in Python4Delphi
These are 3 scripts (windows) that I use to: 1] create requirements.txt file of pip installed packages 2] download whl packages from requirements.txt 3] install the whl packages (offline) A resulting requirements.txt looks like: cffi==1.15.1 cnc-api-client-core==1.3.1 contourpy==1.0.6 cryptography==38.0.4 cycler==0.11.0 delphifmx==0.1.51 delphivcl==0.1.40 fonttools==4.38.0 kiwisolver==1.4.4 lxml==4.9.2 matplotlib==3.6.2 numpy==1.23.4 opcua==0.98.13 opencv-contrib-python==4.6.0.66 packaging==21.3 pbr==5.11.0 Pillow==9.3.0 pip==22.3.1 pybind11==2.10.1 pycparser==2.21 pyparsing==3.0.9 PySide6==6.4.0.1 PySide6-Addons==6.4.0.1 PySide6-Essentials==6.4.0.1 PySimpleGUI==4.60.4 python-dateutil==2.8.2 pytz==2022.7 scipy==1.9.3 screeninfo==0.8.1 setuptools==65.5.1 shiboken6==6.4.0.1 six==1.16.0 skia-python==87.5 tendo==0.3.0 wheel==0.38.3 Inno Setup script install Python embd and packages in this way; [Run] Filename: {userpf}\{#MyAppName}.python\python.64.exe; Parameters: "-y"; WorkingDir: {userpf}\{#MyAppName}.python; StatusMsg: Unpack Python files...; Flags: runhidden Filename: {userpf}\{#MyAppName}.python\python.exe; Parameters: "-m pip install --no-index --find-links offline-packages --force-reinstall --requirement requirements.txt"; WorkingDir: {userpf}\{#MyAppName}.python; StatusMsg: Install Python Offline Packages...; Flags: runhidden #endif python-create-requirements.bat python-offline-download.bat python-offline-install.bat- 10 replies
-
- deploy
- installing
-
(and 1 more)
Tagged with: