Jump to content

A.M. Hoornweg

  • Content Count

  • Joined

  • Last visited

  • Days Won


Everything posted by A.M. Hoornweg

  1. A.M. Hoornweg

    ICS v8.64 can't compile on Delphi 7

    I maintain some libraries that are used in our company and that have to be compatible with a range of compilers (2007 .. current). Some of our programs are used on embedded devices with older operating systems hence the need for D2007. We want our products to compile without hints or warnings. Totally apart from the usual string problems (unicode/ansi and codepages), there's the issue of Embarcadero deciding to move RTL functions from one unit to another, of functions being declared "deprecated" and of functions suddenly being declared "inline". So in order to suppress such warnings, I need to know when Embarcadero decided to pull off such changes.
  2. A.M. Hoornweg

    ICS v8.64 can't compile on Delphi 7

    This is the most complete list I could find: https://stackoverflow.com/questions/8460037/list-of-delphi-language-features-and-version-in-which-they-were-introduced-depre
  3. A.M. Hoornweg

    ICS v8.64 can't compile on Delphi 7

    I constantly have to look up in which Delphi version a certain feature was introduced. And not just me, literally *every* component manufacturer maintains his own *.INC file with $defines to keep track of these things. Those *.INC files have to be maintained with every new delphi version and they're a royal P.I.T.A. Wouldn't it be great if Embarcadero (or anyone else, really) published a git repository with a freely usable *.INC file, with $defines for all feature changes in every Delphi version? That way everybody could speak a common "language" for detecting features instead of re-inventing the wheel.
  4. As a workaround, you could disable the structure highlighting stuff in Delphi 10.4 and instead install CNPACK, which also offers that feature. This image shows what it looks like (in Delphi XE).
  5. It is one of the reasons why I'm not a friend of "skinning". But my changed Windows settings tackle the root cause which is unnecessary re-drawing of UI elements for the sake of smoothness and animations. I don't need any of that. Responsiveness is much more important.
  6. @Mike Torrettinni do you have your virtual machine on a SSD? You should, it makes a dramatic difference. One more thing about VMWare and GPU acceleration. My notebook happens to have more than one GPU. It has an Intel adapter but also a faster additional NVIDIA GPU. A nice but little known feature of VMWare is that it lets you select which GPU to use, but tweaking such advanced settings involves manually editing the virtual machine's *.vmx file. These changes make the virtual machine less "portable" between host machines since different host machines may have different GPU's. mks.dx11.vendorID = "0x10de" (This selects the NVidia GPU. "0x8086" selects Intel, "0x1002" selects AMD) mks.enableDX11Renderer = "TRUE" (This enables DirectX11/OpenGL acceleration. It is the default setting). Some DirectX drivers have been "blacklisted" by VMWare for some reason; in that case no DirectX/OpenGL acceleration is available at all inside VM's. This might be an explanation for slow behavior. But luckily you can override even that setting in the *.vmx file: mks.gl.allowBlacklistedDrivers = TRUE One more thing about VMWare Workstation in general. Normally if one uses VMWare one would leave Hyper-V disabled on Windows and let VMWare handle all the virtualization. But the latest VMWare version 15.5.X can also run "on top of" Hyper-V. I don't know if there's a speed penalty involved with that. There might be.
  7. In my case, every project is generally in its own repository. Some projects, however, consist of many sub-projects (for example, a main project and a bunch of plugins/dlls and maybe a configuration program); in such a case, I keep these in one repository because they count as one big project. Almost all my projects use a bunch of libraries, some of which are commercial ones. And of course I keep each of these libraries is in a repository of its own. Source code versioning systems like Subversion and Git allow you to reference "external" repositories for libraries (in Git they are called Submodules). So each of my project repositories has a subfolder "externals" where it automatically downloads the libraries which it needs.
  8. @c0d3r before you do anything drastic, please try the Windows 10 graphics settings I mentioned earlier. They made a vast difference for me and my colleagues. And the settings are easily reversible if you don't like them.
  9. A.M. Hoornweg

    Native Svg parsing and painting in Windows

    I just noticed that TMS VCL UIPack supports drawing SVG graphics and there's even a tAdvSVGImageCollection. I haven't tested it myself though. I quote from the manual: "SVG supported elements: - circle - clipPath - defs (limited to predefined style, no gradients, no paths, only single fill/stroke parameters) - ellipse - g - image (limited to base64 encoded string value) - line - path - pattern (no gradients, no paths, only single fill/stroke parameters) - polygon - polyline - rect - style Within the style element supported parameters are: - fill (no gradients) - stroke (no gradients) - stroke-width - opacity Within the primitives (line, polygon, polyline, rect, path) supported parameters are: - fill (no gradients) - stroke (no gradients) - stroke-width - transform (scale, rotate, translate, matrix) With SVG support in TMS VCL UI Pack we aim for smaller SVG icon sets that can be used to target normal and high DPI applications. When scaling, SVG will scale accordingly and still render sharp at different resolutions. SVG support has been added to avoid the need for numerous icons for each different scale / resolution"
  10. A.M. Hoornweg

    Admin Tool for IBToGo2020

    Since Interbase and Firebird share common roots, I suggest you try if Firebird Editor Pro or FlameRobin work with this version. I use these for Firebird.
  11. A.M. Hoornweg

    10.4 Sydney Patch #3 released

    Warning: There is a manual step that has to be performed in patches 10.4.2 and 10.4.3 (you have to manually execute a batch file after downloading/applying the patch using GetIt). If you overlook that, the update is indicated as installed in GetIt but in reality, it isn't !!!!
  12. The problem is caused by the fact that a VM does not have a "real" accelerated graphics adapter. So lots of graphical bells and whistles that are used by Windows 10 (such as "smooth" scrolling, transparency, drop shadows, animations of menus and listboxes etc) are done by the much slower CPU instead of by the GPU. And that is VERY noticeable in the Delphi IDE. Disabling those options in Windows made my Delphi 10.4 FLY instead of crawl.
  13. I did it on both.
  14. I have that same setup. My Delphi 10.4 enterprise IDE was very sluggish until I changed some Windows 10 settings inside the VM as well as on the host machine. After those changes it behaves much faster. -> start - control panel -> in the control panel, double-click the "System" applet -> click "Advanced system settings" -> in the field "Performance", click the button "Settings" Then select the settings as in the image below. Re-start windows.
  15. Hello all, All of a sudden I can't login to Quality Central ( https://quality.embarcadero.com/secure/Dashboard.jspa ) anymore. And the "contact support" link on that page requires me to be logged in, so that effectively makes support totally unreachable to me. Can anyone please give me a pointer to the person or team who is responsible for that web site?
  16. A.M. Hoornweg

    FastMM - Fragmentation Analysis?

    You could use OutputDebugString in conjunction with Sysinternals' DebugView to monitor the size of your lists in certain time intervals. That way you can observe if one of your lists is growing out of control. DebugView can do tcpip client/server by the way, that way you can observe the debugging output on a different computer.
  17. A.M. Hoornweg

    FastMM - Fragmentation Analysis?

    Maybe you should look at allocations that bypass Delphi's memory manager and hence not get caught by FastMM4. I mean stuff like VirtualAlloc, GlobalAlloc, LocalAlloc and HeapAlloc. Are you using any external DLLs written in C ?. You max need a tool like AQTime or Deleaker to track down such leaks.
  18. Same here. In the hands of a more capable company, Delphi could/would have conquered the world. Out of interest, which development system would you pick today?
  19. YES you need it. With a source control system you can make as many backups (commits) per day as you want and you can return to any older version of a file if you broke something. A few tips: - There are very good freeware GUIs available (such as TortoiseSVN and TortoiseGit). Please use those, they save a lot of hassle. - I personally don't let the Delphi IDE manage the files in the repository, I prefer to do it manually. I use both svn and git, but I use them exclusively using the aforementioned tools. - It isn't really necessary to use an external server for your own (non-shared) repositories. An external USB drive will do just fine. - Whenever you want to add/delete/move/rename a file in your working copy, don't do it with the Windows explorer, only do it with Tortoise.
  20. A.M. Hoornweg

    tContainedObject, tAggregatedObject

    Hello all, does anyone have any links to documentation/examples about the correct use of tContainedObject and tAggregatedObject? I find the little documentation I can find rather confusing. Kind regards, Arthur
  21. A.M. Hoornweg

    tContainedObject, tAggregatedObject

    Okay, that makes sense; so if I use tAggregatedObject then I can use the "AS" keyword to freely switch between the inner and the outer interface (see example 1) whereas in tContainedObject that isn't possible (it would only let me switch from the outer to the inner interface, right?) .
  22. A.M. Hoornweg

    Regex Validate string

    In my experience, when reporting is done on oil wells in the Middle East, the Arabic text is often interspersed with English technical terms. And for a developer it is quite a challenge to get mixed LTR-RTL text input right.
  23. A.M. Hoornweg

    tContainedObject, tAggregatedObject

    But tAggregatedObject doesn't DO the reference counting, it lets the controller (the owner) do that. And the controller explicitly manages the inner object's lifetime, not through reference counting. function TAggregatedObject._AddRef: Integer; begin Result := FController._AddRef; end; And when using a plain vanilla tObject (my examples 2 and 3), the owner ALSO does the reference counting. Same thing, but faster (since the _addref isn't chained). So I still don't see what tAggregatedObject is actually meant for, what problem it is supposed to solve!
  24. A.M. Hoornweg

    tContainedObject, tAggregatedObject

    COM is not the problem, I've been implementing COM objects for years. My question is really specific about the correct use and usefulness of tAggregatedObject and tContainedObject, because as far as I can see they are not needed at all to build aggregates, tInterfacedobject can already do so using ordinary tObjects. So I'm probably missing something essential about their use and usefulness! For example, this aggregate uses a tAggregatedObject: type iHello = interface ['{58AD07B9-FCE5-494A-94B2-E1CAF7D05B1D}'] procedure Hello; end; iGoodbye = interface ['{35079C32-AF3D-4E9D-808C-6A6DDED38663}'] procedure Goodbye; end; tAggregate = class(taggregatedobject, iHello) procedure Hello; end; tCompositeObject1 = class(tinterfacedobject, iHello, iGoodbye) protected ainner: tAggregate; function GetInner: iHello; public procedure Goodbye; destructor Destroy; override; property Inner: iHello read GetInner implements iHello; end; procedure tAggregate.Hello; begin messagebox(0, pchar('Hello'), pchar('Hello'), mb_ok); end; destructor tCompositeObject1.Destroy; begin messagebox(0, pchar('Destructor'), pchar('tCompositeObject1'), mb_ok); ainner.free; inherited; end; function tCompositeObject1.GetInner: iHello; begin if not assigned(ainner) then ainner := tAggregate.create(self); result := ainner; end; procedure tCompositeObject1.Goodbye; begin messagebox(0, pchar('Goodbye'), pchar('Goodbye'), mb_ok); end; procedure TestCode1; var Hello: iHello; Goodbye: iGoodbye; begin Goodbye := tCompositeObject1.create; Goodbye.Goodbye; Hello := Goodbye as iHello; Hello.Hello; end; ... and this one does the very same thing using a plain vanilla tObject: type iHello = interface ['{58AD07B9-FCE5-494A-94B2-E1CAF7D05B1D}'] procedure Hello; end; iGoodbye = interface ['{35079C32-AF3D-4E9D-808C-6A6DDED38663}'] procedure Goodbye; end; tSimpleObject = class procedure Hello; end; tCompositeObject2 = class(tinterfacedobject, iHello, iGoodbye) protected ainner: tSimpleObject; function GetInner: tSimpleObject; public procedure Goodbye; destructor Destroy; override; property Inner: tSimpleObject read GetInner implements iHello; end; procedure tSimpleObject.Hello; begin messagebox(0, pchar('Hello'), pchar('Hello'), mb_ok); end; destructor tCompositeObject2.Destroy; begin messagebox(0, pchar('Destructor'), pchar('tCompositeObject2'), mb_ok); ainner.free; inherited; end; function tCompositeObject2.GetInner: tSimpleObject; begin if not assigned(ainner) then ainner := tSimpleObject.create; result := ainner; end; procedure tCompositeObject2.Goodbye; begin messagebox(0, pchar('Goodbye'), pchar('Goodbye'), mb_ok); end; procedure TestCode2; var Hello: iHello; Goodbye: iGoodbye; begin Hello := tCompositeObject2.create; Hello.Hello; Goodbye := Hello as iGoodbye; Goodbye.Goodbye; end So is there any advantage in using tAggregatedObject / tcontainedobject at all ? I currently see more advantages in using tObject, because that allows me to take an existing class and encapsulate it inside a wrapper class whenever I want it to be interface based. For example, these few lines of code make a tStringlist interface-based, expose the methods add, get and put and make the whole thing reference counted: type // Just expose a selected bunch of methods of tStrings iStrings = interface ['{242798EB-0A53-4284-BA16-306FF354E2AC}'] function Add(const S: string): Integer; function Get(Index: Integer): string; procedure Put(Index: Integer; const S: string); property Strings[index: Integer]: string read Get write Put; default; end; tInterfacedStrings = class(tinterfacedobject, iStrings) protected fList: tStringlist; function getList: tStringlist; public destructor Destroy; override; property list: tStringlist read getList implements iStrings; end; destructor tInterfacedStrings.Destroy; begin fList.free; inherited; end; function tInterfacedStrings.getList: tStringlist; begin if not assigned(fList) then fList := tStringlist.create; result := fList; end;
  25. Hello all, when I deploy a FMX application to Ubuntu (in this case the "Screenshot" fmx demo) the Delphi 10.4 debugger hangs totally. My Windows and Linux machines are both VMWare VM's. I can see that the freshly compiled executable appears in the home/PAServer/scratch-dir/myname/Screenshot directory. The message log in the Delphi IDE gives a warning "Local file \Redist\libfmux.so not found. Skipping deployment." The executable is not started on the Linux system by PAServer. I am able to start the executable manually, so the executable itself must be OK. But Delphi hangs so thoroughly that I can't debug it. I can only terminate Delphi in the task manager. Am I doing something wrong?