Following on from my previous questions (Delphi 6 TDateTimePicker Windows Visual Theme support via Manifest), we are updating a legacy application developed in Delphi 6 to support Windows Visual Themes (to freshen up the UI). We have included a Manifest and now also Mike Lischke's Windows XP Theme Manager (WXPTM) components, as per previous recommendations.
We can see three components on a new XP tab (palette) in Delphi, have included the path to the library's in our project and dropped the components onto one of the forms. The recompiled EXE is now displaying controls differently from prior to including WXPTM and it seems to have fixed a number of issues, so I am fairly certain (and hope) we have implemented WXPTM correctly.
However, we have some third-party component controls that are descendants of the standard ones, which we thought (hoped) would simply inherit from the replacement/updated controls in WXPTM. Unfortunately, it appears they do not, unless we have missed something out in the WXPTM implementation. Therefore, is it possible to make third-party controls inherit from the updated standard controls in WXPTM? Any tips, tricks, suggestions or advice to point us in the right direction would be greatly appreciated.
Related
Considering the grief we've been having with VCL styles in Delphi 10.2 Tokyo around its use in dynamic link libraries and how it affects the built-in help viewer, as well as a number of negative comments from the community about VCL styles in general, is there another way that we can colour the application windows as in the examples below:
This feature has been part of the application since it's inception in 2001 and it vital for a number of our largest clients, as they actually maintain separate accounts for their subsidiaries and use the colours as an indication of which company they are working with.
Here are the third party skinning products I found so far:
TMS Skin Factory. This has been discontinued.
VCL Styles Utils. This extends VCL Styles and the issues with 10.2
Tokyo remain.
VCLSkin. This has not been updated since XE6.
Almediadev. Just like with DevExpress, we would need to replace all the standard controls with their specific versions in order to apply their skins.
I will update my answer as I find more.
Unfortunately, any answer where we have to replace the components offered by Vcl.StdCtrls or Vcl.ComCtrls with versions specific to the third party package is not going to work. We have 2500 TButtons alone across all the programs in the suite.
EDIT: In the end, we found an answer, or workaround, to the System Exception problem that had us looking at alternatives to VCL Styles in the first place:
Using VCL Styles in a DLL causes System Exception in 10.2 Tokyo
Ok, so I downloaded a .zip file of all different kinds of examples from embarcadero... the way the buttons look and among other things are completely different from when I just create an application within my Delphi 7. I believe these examples were made for or made at a new time... because the button look way different from the way the button when I put them on my application. the buttons from the example look very modern and sleek and have mouse over effects (This applies for all the examples..its not a custom component ) I was wondering I can get this effect in my own applications within Delphi 7.. I can do this by opening one of the examples and just erasing all the code... but that's not what im trying to do..im wondering how I can accomplish these styles.. how come the examples have these nice looking buttons and such..but when I make an app within D7 its much older looking and such..
I apologize if my question is hard to understand.. and I appreciate any help on this.
Thank you in advance.. I appreciate it.
If I understand your question correctly, you're asking about the native control appearance changes that were added by the addition of Windows Themes in Windows XP.
Delphi 7 supported themes by use of the XPManifest component, which does nothing but add a manifest to your application which tells Windows your app is theme-aware and therefore it should load a more recent version of the common controls library. You can find the XPManifest component in the VCL component palette on the Win32 tab, or simply add the XPMan.pas unit to your uses clause. Note that the themed drawing does not work for all controls (grids, for instance, are not drawn using themes, and IIRC neither is TSpeedButton - it's been a long time since I used D7, so I'm not sure exactly what is and isn't supported, but the support is limited).
Starting with Delphi 2007, there is built-in support for Windows Themes, which is available by default in new projects. It can also be enabled in older projects using a checkbox in the Project->Options->Application dialog.
(Of course the real answer is that if you want your app to have the features included in modern versions of Windows, you should upgrade from your Windows-95 era version of Delphi to one that is more recent.)
I have inherited an application that was built in Delphi, using clx components (TcxMaskEdit, TcxCurrencyEdit). I cannot open this application because I lack the clx components in my copy of Delphi. If I ignore the warning messages, the application opens without those components on the forms and the Win32 library disappears. I cannot get these components because they are no longer carried by the original developer. So, this leaves me with two options: either find a way to get the clx components, or convert them to vcl. The application has had so many man hours devoted to it and is so business critical that it cannot be easily re-written or replaced. So, my question is: how can I convert the clx components to vcl or otherwise obtain these deprecated components? Or is there something here that I'm missing?
TcxMaskEdit and TCxCurrencyEdit are not CLX controls. They're part of the older Developer Express components (not sure if they're still around or not). In order to open your project, you'll need to get a copy of whatever version your application used. You'll need to ask the old developer what that was, or contact DevEx support and see if they can help you.
(The CLX components have the same name as their VCL counterparts. The only difference is the unit names in the uses clause of your source; the VCL Dialogs unit is replaced by QDialogs, Forms becomes QForms, and so forth. Switching from CLX to VCL is as easy as searching for any unit starting with Q, and removing that single letter if there's a corresponding VCL unit, and then rebuilding your app.)
My team is currently thinking of moving our existing MDI-based application to a more modern, docking-based approach. We're still thinking, but we'd like to move it to something like VS2010's docking and visual look:
This has the following features:
Shows a blended outline where the window will dock
Docks into tabs, as well as side-by-side
Allows docking by dragging and releasing over an image showing the dock position (I call this a 'docking widget' below)
Looks pretty good too (theme / UI-wise)
I am having trouble finding a good-quality docking library to use with RAD Studio 2010 and am seeking advice on either what library/ies I haven't found, or how to use the ones I have found to achieve something like this.
Update: I ended up buying AutomatedQA's docking library. I think it's the best. More details below in the section about it.
Update 2, July 2011: This question looked at every single docking library available for Delphi/C++Builder, so I'm trying to keep it up to date. Two changes that I'm aware of:
SmartBear, who now own AutomatedQA, have end-of-lifed AutomatedQA's docking library. This the one one I recommended buying. They are considering open-sourcing it.
The one problem I had with DevExpress docking (that made it not worthy buying) was its lack of support for VS2008/10-style docking, with a docking widget, transparent overlay as you dragged, etc. They are now implementing it. Because of this, and since AQDocking is no longer being sold, if I asked this question now my accepted answer would be to buy DevExpress Docking.
I've found the following libraries. Here's an overview:
Inbuilt VCL docking
This allows forms to be docked on other forms or TWinControls, but appears to be quite basic. Forms drag using an XOR painted outline, which works very badly on Vista and Win7. There is a TTabDockSet control for tabbed docked forms, but I can't figure out how to control how the docked forms' titles render once docked. I think implementing docking side-by-side will have to be done manually, creating new docksite panels on the fly. The RAD Studio IDE's docking windows are a bit slicker than this (transparent rectangles when dragging a form, for example) which is odd, since I thought it used the VCL docking support.
JVCL docking
This looks a bit more of a decent solution that the inbuilt VCL docking. It supports docking on any edge or the client, and shows an alphablended rectangle where the form will dock.
It appears to be quite buggy (dropping a second form on top of a first is allowed, but freezes the program) and has no inbuilt tabbed dock support or any kind of drop-location widget.
LMD Docking Pack
This looks promising: while it doesn't seem to directly dock forms, it has docking panels and controls / frames are placed on that. Existing forms could be migrated to frames. It also has a docking widget and tabbed dock support.
However, the demo seems to be quite unreliable. I've got the latest evaluation version installed, and creating a new project with a dock site and several panels and pressing Run causes the following:
This is crashing in the form component streaming. Visually examining the DFM file doesn't show anything wrong, but there's an opaque binary blob for the layout information that may be causing it. This is not especially encouraging in an evaluation version.
DevExpress ExpressDocking
I had high hopes for this: I've never used any DevExpress controls before but they have a good reputation. But their demo program was really disappointing:
The control is flickery and doesn't seem to theme well with Windows, even using the XP style. It does have tabbed docking but it uses an XOR-ed outline - something that doesn't work well on XP or Vista. It also does not have any sort of docking widget. Frankly, it looks like it hasn't been updated since the Windows XP days. Update July 2011: This is being improved.
AutomatedQA / SmartBear docking library
This is the most promising of all the libraries so far.
I regularly use AQTime, an excellent profiler which appears to be written using their own docking library, and it works well. However, the latest version of the docking library trial download is for RAD Studio 2009, and the advice given for installing into 2010 is that it's unsupported, and you should recompile the source. The demo doesn't come with source, and we don't have RS2009, and the installer refuses to install unless we do, and even if we manged to get it to install we can't use it since we would need to recompile the non-existent source.
I've been in touch with their support team, and they pointed me to this thread. I also found another thread with customers asking much the same thing. I've replied and hope to hear better news. I'm not keen to recommend we buy a product I can't evaluate, especially when it's not supported for our IDE.
Update: I have ended up buying this library. In spite of problems evaluating (it works in D2007, and I had a copy of that) it seems the easiest to use of all the libraries, and also the most powerful - it's easy to write a theme for it, for example. I'd definitely recommend it if you need to select a docking library too.
Update July 2011: This library is no longer being sold, but may be open-sourced soon.
What have I missed?
That's everything I've found so far. What now?
Have I missed any good docking libraries for Delphi / C++ Builder / RAD Studio 2010?
Have I missed any features in the libraries I've lookd at so far? An answer like "You missed FooBar" or "JVCL does indeed have a docking widget, and you can use it like so..." would be pretty awesome to hear.
What would you recommend as my next step?
Thanks for your input :)
I am a jedi JVCL developer, and I have used JvDocking in my own commercial in-house projects, and found it to be solid and reliable.
Also, it's free. It's easy to extend. It creates a look and feel about the same as visual studio 2008 era docking.
I haven't found a single library that does everything that I would like, so after doing some experimenting I found that I could do almost everything I wanted by using the Native VCL Docking (NVCLD) controls with a series of custom modifications and some additional controls.
The following is a list things that I've run across in getting the NVCLD to work the way I wanted. I haven't had many problems porting between versions, but that's because I've got the src as well.
If your not looking to roll your own or you really want to use a 3rd party library then you can probably stop reading the rest of this. :)
Additional Components:
TDockPanel
This heavily modified docking panel is the workhorse my system. I found the original on the net but have modified it since to provide a little greater flexibility for my needs.
Custom Docking Forms (Base form)
By using a custom base class for my docking forms and inheriting it when needed I have less modifications to do on all of the descendant forms.
Custom Modifications
These are modifications to the .pas files of the NVCLD components themselves. Most of these modifications no longer have to be done because of some enhancements made to the base controls starting with D2009. You should be able to just create a new descendant and implement the changes in the there instead of modifying the default src files directly.
Transparent Docking Forms
By default (pre-2009 for sure) the NVCLD doesn't support the transparent form movement. There was a JVCL patch released a couple of years back that added that support to the JVCL which was simple to incorporate into a NVLCD patch.
Docking Manager
The default docking manager (pre-2009 for sure) didn't allow for newer/custom button images or docking header changes. This was rectified in D2009 I believe when the necessary methods where made virtual.
Tabbed Docking
To support the Additional docking components I needed to modify the DockTabSet.pas file to support additional docking properties used by the additional components. Most of this was corrected when the Docking Manager was modified as mentions previously.
As I stated most of these changes I made directly to the Delphi Src files and you shouldn't need to do that for newer versions of Delphi. My point is that with a little bit of work up front you can have a fairly robust docking system with out resorting to using a 3rd party library. Not that there is anything wrong with any of them, but I prefer not to use them unless I have no other choice or don't have the time to make it work my way.
I have used JCL, I have LMD, DevExpress and Automated QA Docking Library.
The closest you will find that will meet your need is the AutomatedQA Docking Library. I use it in my work for one of my projects.
Your next step, buy the AutomatedQA Library :)
from a Happy Customer.
I recently experienced some unusual behavior in using a 3rd party Navigator component in Delphi 2007 whereby upon setting the 'Flat' property to True, the buttons didn't remain Flat as they should with Themes Enabled but did so once I unchecked Enable Themes from within my project file and recompiled my program. This obviously didn't seem right since another 3rd party Navigator component I experimented with performed accordingly with 'Flat' set to True and Themes Enabled. I then tried the same with Delphi's TDBNavigator and once again I experienced the same problem as I did with the first 3rd party Navigator component. In researching this matter online, I have found very little other than the fact that, unlike previous versions of Delphi, Delphi 2007 supports Themed Applications out of the box as opposed to having to add another component to support WinXP Themes. All considered, I am hoping that someone else may have experienced similar problems in using TDBNavigator or other 3rd party Navigator components in Themed Applications with the flat property set to true. Any comments or suggestions regarding this matter are appreciated.
Theme support was added to Delphi 2007, but doesn't apply to 100% of the VCL (grids, for example, don't have theme support). I'd suspect that's the issue you're having with the TDBNavigator.
As far as your "3rd party Navigator" problems, it's impossible to give you any advice because you didn't indicate which "3rd party Navigator" controls you're using. Without knowing the specific component names, you've given no information to us to use in trying to help.
Delphi 2010 provides full theme support, including grids. I haven't tested the DBNavigator, as I haven't used it since Delphi 2 or so. Note, however, that Delphi 2009/2010 introduces other issues with older code, because as of Delphi 2009 the VCL is Unicode-based. Some code that uses strings and assumes that a Char is 1 byte in size can be an issue.
Workaround on TDBNavigator,TSpeedButton bug
http://blog.issamsoft.com/index.php?q=en/node/37