Noutați

Structured Programming in Delphi – DelphiCon 2020

Have you heard of functional programming but are vague on the details?  Are you ready to expand beyond the object-oriented mindset?  Tomorrow, Nick Hodges, author of Coding in Delphi, will teach us how to harness functional programming techniques to craft beautiful programs in Delphi.  Just one day away, Functional Programming with Delphi is a knowledge-broadening talk you don’t want to miss! DelphiCon 2020 offers ten talks and four expert panels by Embarcadero tech partners and Most Valuable Professionals spanning the range of software from education to industrial database access. Come for the functional programming and leave with a greater understanding of how to maximize performance with Delphi. The conference is free and open to the public. Sign up now by clicking the “Save my seat” button at delphicon.embarcadero.com!

Read More

Learn To Build A Python GUI For Processing Images With Pillow Library In A Delphi Windows App

Are you looking for a simple way to process images programmatically? You can do it with Python for Delphi using Pillow library. Python for Delphi (P4D) is a free tool that allows you to execute Python scripts, create new Python modules and types in Delphi. This post will guide you on how to run Pillow library code using Python for Delphi. You can easily build Python GUI apps using your favorite Python libraries for Windows using Delphi and C++Builder and Python4Delphi. In order to run the Python script in Python for Delphi, open and run project Demo1. Then insert the script into lower Memo, click Execute button, and get the result in upper Memo. You can find the Demo1 source on GitHub. procedure TForm1.Button1Click(Sender: TObject); begin PythonEngine1.ExecStrings( Memo1.Lines ); end; procedure TForm1.Button1Click(Sender: TObject); begin   PythonEngine1.ExecStrings( Memo1.Lines ); end; With Pillow library, you can perform geometric and color transformations. It also allows to cut, copy part of the image and merge several images into one. Let’s take a look at some examples. Open, show, and get image properties First, open the image using function open(). You can get image properties such as format, size, type. from __future__ import print_function from PIL import Image im = Image.open(“test.jpg”) print(im.format, im.size, im.mode) im.show() from __future__ import print_function from PIL import Image im = Image.open(“test.jpg”) print(im.format, im.size, im.mode) im.show() Create thumbnails thumbnail() function allows you to create an image thumbnail. The input parameters of this function are the size of the image that you want to get in pixels. Use save() function to save the image in a specified directory. from __future__ import print_function from PIL import Image import os path = “test.JPG” im = Image.open(path) size = (250, 250) outfile = os.path.splitext(path)[0] + “.thumbnail” im.thumbnail(size) im.save(outfile, “JPG”) from __future__ import print_function from PIL import Image import os   path = “test.JPG” im = Image.open(path) size = (250, 250) outfile = os.path.splitext(path)[0] + “.thumbnail”   im.thumbnail(size) im.save(outfile, “JPG”) Geometrical transformations Function transpose() allows you to perform different geometrical transformations with the image. For example, you can rotate the image by a given angle or flip it horizontally and vertically. from __future__ import print_function from PIL import Image im = Image.open(“test.jpg”) box = (0, 0, 320, 426) region = im.crop(box) region = region.transpose(Image.ROTATE_180) region = region.transpose(Image.FLIP_LEFT_RIGHT) im.paste(region, box) im = im.rotate(45) im.save(“test2.jpg”) from __future__ import print_function from PIL import Image im = Image.open(“test.jpg”) box = (0, 0, 320, 426) region = im.crop(box) region = region.transpose(Image.ROTATE_180) region = region.transpose(Image.FLIP_LEFT_RIGHT) im.paste(region, box) im = im.rotate(45) im.save(“test2.jpg”) Change images colors Now let’s look at how to change image color. Function split() allows you to decompose the image into separate colors and work with each color separately. In the following example first, we split the image into separate parts by color. Then select the area where the green value is less than 150. At the next step, we increase the blue value by 0.5. In the end, we merge everything into a new image. source = im.split() R, G, B = 0, 1, 2 mask = source[G].point(lambda i: i source = im.split() R, G, B = 0, 1, 2 mask = source[G].point(lambda i: i 150 and 255) out = source[B].point(lambda i: i * 0.5) source[R].paste(out, None, mask) source[B].paste(out, None, mask) im = Image.merge(im.mode, source) Now you can make various modifications […]

Read More

Quickly Migrate and Modernize Your Delphi/C++ Apps Using FastReport With Windows High DPI Setup

Display panel manufacturers have packed an increasing number of pixels into each unit of physical space on their panels resulted in the dots per inch (DPI) of modern display panels. In the past, most displays had 96 pixels per linear inch of physical space (96 DPI); in 2017, displays with nearly 300 DPI or higher are readily available. Variety of monitors like SD, Full HD, 4K Ultra HD, 8K Ultra HD in the market. We have laptops, desktops with small screens, and without display scale factor/DPI changes it’s very hard to use it and this can be even more complicated when talking about Full HD, 4K Ultra HD, 8K Ultra HD. Our application should be able to handle them. You cannot be sure what every user prefers. Some common scenarios where the display scale factor/DPI changes are: Multiple-monitor setups where each display has a different scale factor and the application is moved from one display to another (such as a 4K and a 1080p display) Docking and undocking a high DPI laptop with a low-DPI external display (or vice versa) Connecting via Remote Desktop from a high DPI laptop/tablet to a low-DPI device (or vice versa) Making display-scale-factor settings change while applications are running Desktop applications must tell Windows if they support DPI scaling. By default, the system considers desktop applications DPI unaware and bitmap-stretches their windows. By setting one of the Unaware, System, Per-Monitor, and Per-MonitorV2. available DPI awareness modes, applications can explicitly tell Windows how they wish to handle DPI scaling. When updating a System DPI-aware application to become Per-MonitorV2 aware, the code which handles UI layout needs to be updated such that it is performed not only during application initialization but also whenever a DPI change notification (WM_DPICHANGED in the case of Win32) is received. Things to know on migrating your Delphi Application to High DPI ? Set the DPI awareness Mode in Project->Options->Application->Manifest-DPI Awareness and Select Per-MonitorV2. Use Sceen.PixelsPerInch-primaryDispaly DPI Use TVirtualImageList instead of TImageList. Check all custom draw for absolute positions Use Control.CurrentPPI to get Current PPI of Control Mixed Mode for dialogs(SetThreadDPIAwarenesscontext) Use Form events OnBeforeMonitorDPIChanged/OnAfterMonitorDPIChanged. Note: Ensure backward compatibility for your platform and Delphi version of your application. Some of the Delphi And FastReport High DPI Controls: TControl: procedure such as ScaleforPPI, ChangScale, ScaleControlsForPPI helps for High DPI change. TFrxBAseForm: procedure such as UpdateResources, UpdateFormPPI, ProcessPreferences, and Message WM_DPICHANGED helps for FastReport form DPI change. TFrxDPIAwareCustomControl: procedure such as DoPPIChanged, GetScale, and Message WM_DPICHANGED_AFTERPARENT helps for FastReport custom control DPI change. Check out the Video Fast Migration to Windows 10 High DPI, below for Demonstration. Check the latest RAD Studio 10.4.1 Features which includes VCL Style Changes for High DPI.

Read More

Learn How To Use Auto-Typed Variables In C++ For Windows Development

auto-typed variables is a C++11 feature that allows the programmer to declare a variable of type auto, the type itself being deduced from the variable’s initializer expression. The auto keyword is treated as a simple type specifier (that can be used with * and &), and its semantics are deduced from the initializer expression. auto-typed Variables Examples int IntFnc() {} bool BoolFunc() {} char* CharSFunc() {} int _tmain(int argc, _TCHAR* argv[]) { // x is int auto x = IntFunc(); // y is const bool const auto y = BoolFunc(); // w is char* auto w = CharSFunc(); return 0; } int IntFnc() {} bool BoolFunc() {} char* CharSFunc() {}      int _tmain(int argc, _TCHAR* argv[]) {     // x is int     auto x = IntFunc();     // y is const bool     const auto y = BoolFunc();     // w is char*     auto w = CharSFunc();       return 0; } Multi-declarator auto The C++11 standard includes the multi-variable form of auto declarations, such as: int* func(){} int _tmain(int argc, _TCHAR* argv[]) { auto x = 3, * y = func(), z = 4; return 0; } int* func(){}   int _tmain(int argc, _TCHAR* argv[]) {         auto x = 3, * y = func(), z = 4;         return 0; } The restriction with multi-declarator auto expressions is that the variables must have the same base type. For example, the following line of code is well-formed: auto x = 3, y = *(new int); auto x = 3, y = *(new int); because x and y have the same base type : int, while the following code: will generate the error: [bcc64 Error] File1.cpp(11): ‘auto’ deduced as ‘int’ in declaration of ‘x’ and deduced as ‘double’ in declaration of ‘y’. This feature is supported by the Clang-enhanced C++ compilers. Check out all of the modern C++ language features supported in the latest C++Builder for Windows development.

Read More

Learn To Build Modern Enterprise-Grade Native Applications For Windows With RAD Studio

In this webinar, one of the Embarcadero MVP Serge Pilko shows off the RAD Studio against Electron and other JavaScript frameworks for desktop application development. Overview Native desktop development for Windows JavaScript framework-based solutions vs. RAD Studio for Windows Development Electron & Node.js .NET WinForms & WPS vs. Delphi & C++ Builder VCL or FMX JavaScript for Desktop Many JavaScript libraries let you create desktop GUI applications with web technologies like JavaScript, HTML, and CSS. And it is connected to the web easily. With JavaScript desktop development libraries you can’t get the native performance, no native user interface.  Consumes more memory because your JavaScript application needs an engine Source code protection issue Not all enterprise developers are ready to rely on open-source solutions  Delphi & C++ Builder for Desktop A proven tool for Windows desktop development Small executable file size and low memory usage Native application The best performance you can get Thousands of use cases are ready to explore Native look and feel Easy to design and bring the best user experience Be sure to check out the whole session to learn about the benchmarks in action and more about modernizing your applications! Learn more about enhancing your productivity with RAD Studio.

Read More

More TMS WEB Core Tips & tricks

Today we want to bring to your attention two totally different TMS WEB Core features. These little tidbits that can bring your TMS WEB Core web client application from good to great. The first is about handling application termination and the second is about getting something more out of TWebStretchPanel. Application termination For long, handling web application termination was simple: it was not really handled. When there was a reason to handle it server side, software developers came up with the concept of sessions. In a nutshell, when a user first requests a HTML page from the server, a session is started and typically a session timer runs. If the users requests a page update or performs another request from the user, the session timer is reset. If the user does nothing or worse, closes the browser, the server timer runs and when it reaches a predefined time, for example 20 minutes, the session is considered closed and thus stopped. We have all experienced the consequences. You decide to go and grab a cup of coffee, meet a colleague in the coffee room, have an interesting talk that of course takes longer than expected and you return to your desk, want to continue using your web application and you are greeted with a session timeout and need to login again. In the world of modern single-page web client applications with stateless REST backend, this is a lot less likely to occur as it is way less likely to have a reason for server side session management. An easy way to look at it, is that the session state is now kept in the client and the web client application will just perform stateless HTTP(s) requests to a backend when data update or retrieval is needed. And still, even in this much more server resource friendly scenario, developers might have a reason to know when the user closes the web application to save something client or server side. To handle this, modern browsers expose the browser window “unload” and “onbeforeunload” JavaScript event. This event is triggered when the browser window is about to be closed or the user leaves the page via navigation. Other than just handling leaving the web client application, it can also be signalled to the user and a confirmation dialog shown to ask if the user really wants to leave. In TMS WEB Core, taking advantage of this is really simple. In your TMS WEB Core web client application, handle the main form’s OnBeforeUnload event. If you wish to show a confirmation dialog, return the confirmation message text via the parameter AMessage. Note that in Google Chrome, a confirmation message will be shown when the message is not empty but it will contain the standard Google text. For the reason, see: https://bugs.chromium.org/p/chromium/issues/detail?id=587940 Here is a code extract that shows the concept. A simple string variable will determine whether some action is needed before closing or not. This string s is empty by default but during application execution can be set (here via a button click). When this string is not empty, it is used to show a prompt when the user wants to close the application via the form.OnBeforeUnload event and in the form.Unload event it can be effectively handled to do a last action before unloading. […]

Read More

Learn How To Build Decoupled Delphi Applications Quickly With Delphi Event Bus Framework

Modularity is very important in software architecture so that applications built can be easily extendable and maintainable. Consider your building an application with multiple components in it. If we decide to remove a component and replace it with another component it should not affect the application. This can be done by decoupling software architecture. Do you want to build such decoupled applications in Delphi? This post guide you to build using Delphi Event Bus Framework. EventBus: An event bus allows publish/subscribe-style communication between components without requiring the components to explicitly be aware of each other. Looks like Observer Pattern? No, there is a difference. In the observer pattern, the broadcast is performed directly from the observable to the observers, so they “know” each other. But when using a publish/subscribe pattern, there is a third component, called event bus, which is known by both the publisher and subscriber. It is Decoupled between Publisher and Subscriber. Delphi Event Bus allows you to decouple components that asynchronously receive and process events and or emit events. Consumers can subscribe to this event bus and declaratively specify which events they wish to consume. The event consumer a publisher is completely decoupled. Simplifies the communication between components. Delphi Event Bus Features: Easy and clean: DelphiEventBus is super easy to learn and use because it respects KISS and “Convention over configuration” design principles. By using default TEventBus instance, you can start immediately to delivery and receive events Designed to decouple different parts/layers of your application Event-Driven, Thread Safe, Unit Tested Attributes based API: Simply put the Subscribe attribute on your subscriber method you are able to receive a specific event Support different delivery modes: Specifying the TThreadMode in Subscribe attribute, you can choose to deliver the event in the Main Thread or in a Background one, regardless of where an event was posted. The EventBus will manage Thread synchronization. How it works : TEvent = class(TObject) // additional information here end; TEvent = class(TObject) // additional information here end; Prepare subscribers: Declaring your subscribing method: [Subscribe] procedure OnEvent(AEvent: TAnyTypeOfEvent); begin // manage the event end; [Subscribe] procedure OnEvent(AEvent: TAnyTypeOfEvent); begin   // manage the event end; Prepare subscribers: Register your subscriber: GlobalEventBus.RegisterSubscriber(self); GlobalEventBus.RegisterSubscriber(self); GlobalEventBus.post(LEvent); GlobalEventBus.post(LEvent); Check this below video for Demonstration of How the Delphi Event Bus Framework(DEB) works. Delphi Event Bus Demonstration Checkout the full source code for Delphi Event framework here.

Read More

Awesome Pascal Is A Curated List Of Awesome Open Source Delphi Pascal Frameworks, Libraries, Resources, And More

Developer Anton Frost has a curated listed of Awesome Delphi projects available over on GitHub. It offers a wide variety of projects across multimedia, game development, GUI, scripting, database, reporting, utilities, serial ports, memory management, and much more. Take A Look According to the project “only open-source projects are considered. Dead projects (not updated for 3 years or more) must be really awesome or unique to be included.“ You can submit your own projects to the list by creating a pull request to get projects included. This awesome collection is formatted and available on Delphi.ZEEF.com as well.

Read More

Learn Useful Hints For Working With Styles To Build Visually Stunning Windows Applications

Want to style your Delphi/C++Builder applications with few steps? Want to view and choose your style before applying to your application? Don’t know how to do? This post will guide you. A style is a set of graphical details that define the look and feel of a VCL/FMX application. Similar to a theme in Windows. A style permits you to change the appearance of every part and state of a control.   Where are the styles on your computer? C:UsersPublicDocumentsEmbarcaderoStudio21.0Styles. Plenty of styles available under this folder, you can choose from here. Where can you get other styles from? Use Tools -> Get it Manager -> Styles -> Select one among them and install. After installing these styles can be found under this folder C:UsersPublicDocumentsEmbarcaderoStudio21.0Styles With folder names per platform like -> Android, iOS, macOS, Linux, and Win. Other these styles, we can get some third party Styles from DelphiStyles How to view your styles? Navigate to his folder, C:Program Files (x86)EmbarcaderoStudio21.0binVCLStyleViewer.exe and pass the parameter with the Style name with path. Similarly for FMX Styles use FMXStyleViewer.exe. Alternatively, you can open the style files, by right click-> open with ->Navigate to VCLStyleViewer.exe or FMXStyeViewer Accordingly. How to convert VCL-Styles to FMX- Styles? Open IDE->Tools->Bitmap Style Designer and open the existing VCL styles and then Save the file as FMX style with Option Save as type value “FireMonkey Style” How do I assign a style to the program? Place a TStyleBook component to the form. Double Click and open the style file from the location mentioned above. Save and close the Style Designer. Assign the Stylebook reference to Form StyleBook Property. Use TStyleBook.UseStyleManager property checked when more than one form created from the main form where StyleBook property is assigned. Note: For Dialogs in FMX the styles are not applied, we need to create custom dialogs. How do I assign a style per platform? On Double-clicking the TStyleBook -> Style designer contains the option Platform where you can choose your platforms. How to set styles for multi-platform in a single application? You can use style manager to set the styles at runtime, but we need to take care of checking the platform, and deployment as well. A Simple solution is to use different data modules for each platform and place TStyleBook in each platform, instantiate according to the platform. Check this full video of useful hints for working with styles. Check out the High DPI Styles and VCL Styling Per Control feature introduced in Latest RAD studio 10.4.1

Read More

Learn A Faster Way To Make A Python Module As A DLL Using Python4Delphi Sample App

Sometimes we may need to share the functionalities as DLL and we know, creating a DLL in Delphi is a simple task. We learned how to create Python Module and add methods to it in Delphi. How about making a python module as DLL using Python4Delphi and import this python module in another application? This post will guide you to do that. You can also use Python4Delphi with C++Builder. Python4Delphi Demo9 Sample App shows how to create a Module, add a routine to that module, Import the module in a python script, and access the added routine. You can find the Demo9 source on GitHub. Prerequisites: Download and install the latest Python for your platform. Follow the Python4Delphi installation instructions mentioned here. Alternatively, you can check out this video Getting started with Python4Delphi. Components used in Python4Delphi Demo9 App: No visual components were added to the library however the following class were instantiated by using PythonEngine.pas TPythonEngine: A collection of relatively low-level routines for communicating with Python, creating Python types in Delphi, etc. It’s a singleton class. TPythonModule: It’s inherited from TMethodsContainer class allows creating modules by providing a name. You can use routines AddMethod, AddMethodWithKW to add a method of type PyCFunction. You can create events using the Events property. TMemo: A multiline text editing control, providing text scrolling. The text in the memo control can be edited as a whole or line by line. You can find the Python4Delphi Demo9 sample project from the extracted GitHub repository ..Python4DelphiDemosDemo09.dproj. Open this project in RAD Studio 10.4.1 and run the application. Implementation Details: This Sample contains one library project(demodll) and a VCL application project(Demo09). Demodll contains a procedure PyInit_demodll which will create an instance of TPythonEngine and TPythonModule. PythonEngine loads the python DLL using the LoadDll procedure. PythonModule named ‘demodll’ will have a method to add 2 integers. See the code below. When building this project, demodll.pyd is created. function PyInit_demodll : PPyObject; begin Result := nil; try gEngine := TPythonEngine.Create(nil); gEngine.AutoFinalize := False; gEngine.UseLastKnownVersion := False; gEngine.RegVersion := ‘3.9’; //

Read More