VisualHint's blog

New critical updates

The products you love from VisualHint continue to be refined. Starting with version 3.3.0, SPG is compatible with .Net 4.5. Prior to this "fix" SPG would crash because of the new way the IComparer interface works. SFPE has also been touched. While very stable, a recent feedback showed that it could crash when opening the month calendar if the min and max range allowed for the DateTimePicker did not contain the Today date.

It is strongly recommended to download and use these versions containing major fixes.


Important updates

This has been a long time since I last posted here. I'm sorry, I had no time to blog anymore. But last week, there was an important update to both SPG.Net and SFPE.Net so I feel I have to mention it here. My products use 3rd party licensing engine and obfuscation tools from the same company and there was two issues with them:

  1. It was not possible to use my .Net 2 assembly on a machine where only .Net 4 is installed.
  2. There was a crash in the VS2010 SP1 designer when opening a form containing my components.

They have now fixed these problems and I have uploaded new builds with these fixes.


Fix to VisualTips from Skybound

Smart PropertyGrid.Net does not use the VisualTips product directly, but the demo sample does. Lately, it was reported an issue (random crashes) with VisualTips if the client application targets .Net 4.0. The solution has now been found and Skybound has published a fix. You will find it here. I remind you that this is an excellent product and it's free.

And since we are talking about tooltips, I would like to outline that the latest SPG build contains refactored code for default tooltips. They now position and size perfectly in various conditions and will also now display well under Windows 7 themes.


Discounts, crisis, euro and vacations

Update: the discount is now closed.

Starting today, a 30% discount will be applied to all products and renewals (except full site and worldwide licenses). The reason is twofold:

The crisis is difficult for everyone and now especially for eurozone customers who suffer from a depreciation of their currency. Lowering my prices is a kind of participation to the recovery effort. This is a medium term decision and I have no firm expiration date.

For the shorter term, I will be in vacations from June 23 to July 7 (almost no kind of support can be provided) and from July 12 to July 20 (minimal support can be provided). So I thought this was also a reason for lowering the prices during the summer. But anyway if you place a purchase during this period, your subscription to support and updates will be extended with one additional month.

These discounts won't last forever so grab them while you can, even if your subscription is still active.

Have a good summer!


VisualHint changes its hosting provider ... and more

Starting on this Friday, Jan 29, I have triggered the DNS changes that will make visualhint.com point to its new home.

Why this move?

So far visualhint.com was a site written in php and hosted at a linux host. I was using the ExpressionEngine CMS to handle the html pages, the dynamic parts like the blog and announcements, the protected downloads and the sales through paypal. I had also a helpdesk system. This was rather flexible but it has 2 drawbacks for me: it is written in php (which is not something I master) and it is too generic. I need more flexibility to handle my customers, licenses and downloads. Being a .net guy, and also because I fell in love with asp.net MVC, I decided to rewrite my web site completely for my exact needs and I'm proud, excited (and a bit frightened) to unveil it now with a first version. It is not fully functional but its core is stable enough to make the jump.

What does it mean for you?

So far, as a customer, you had just the strict minimum: a link to download your product and your serial number. Starting with the new site you will be able to:

  • See your orders
  • See your subscriptions, expiration dates and status
  • See your downloads and serial numbers
  • Receive automatic reminders (in time... can you imagine this was manual so far?)
  • Purchase in CAD$ if you are canadian (it had to be a manual process outside the site so far)

I will ask you to login next week to the VisualHint web site and check your profile, subscriptions and access to downloads/serials. Please let me know if you see something wrong which does not correspond to your actual purchases. Also bear with me if you see some bugs, like receiving a reminder email several times. Here again, please inform me. At last, because all the backend is under my control, you can send feature requests about the web site. Thanks in advance.

About prices, something new?

Yes, the policy about renewals changes in your favor. So far, after your subscription to support and updates expires, you had a one month grace period to renew at a discounted price. After this period, the full price had to be paid again to renew for a year. Starting now, the grace period remains, but a simple late fee will be added (30% for the first year not renewed, 60% the second year and so on). Here is an example: for SPG.Net with sources, after the grace period, you had to pay 308 US$. Now, if you want to renew 3 months after the expiration, you will have to pay 114 US$ (the normal renewal price) + 30%, so 148 US$ instead of 308. 14 months later, it would be 114 US$ + 60%, so 182 US$. Nicer, no?

What are the next steps?

Some things will cease working: the forums (the current ones were underused anyway), the helpdesk and the MFC product pages. So at first, on the support page, you will just see an email address. Use it to contact me. I postpone the development of the forums and helpdesk because I want first to focus on my admin panel which is a central part of my new site and it must work flawlessly. I will add some new features to it bit by bit (like a dashboard, stats, and so on) which are many things invisible to you. Then I will get back to the helpdesk.

If you have any question about these changes, feel free to contact me. Also thank you in advance to put up with the small inconveniences attached to this change which is something important for the future of VisualHint.


A single checkbox for any property…

... or at least for properties that care publishing two standard values.

In the real life, you won’t always have a boolean to represent 2-states variables. Sometimes, you may have an arbitrary type, for example a simple class with two static members (something like Breaker.Opened / Breaker.Closed) or the couple null / anything. Welcome the retouched checkbox inplace control to show this property as a single checkbox. The rule is this: if your property is not a boolean, not an enumeration and not a collection, then the PropertyGrid will check if there is only two standard values (published by a TypeConverter or manually assigned by you). If this is the case, the single checkbox will be used to let the user switch between these values.

In case you are not sure how to do it with your type, there is an example in the updated sample.


The calendar is now kryptonized

A few hours after announcing the addition of a totally new MonthCalendar to the DateTimePicker supplied in Smart FieldPackEditor, here is an addon class that will paint the calendar with the Krypton palettes.

The effect with the various built-in palettes is very professional and I must congratulate Phil of ComponentFactory for the excellent job he does with the Krypton Toolkit. His product is not only a suite of very polished controls, it is also a library that 3rd party developers can use to paint their own controls. And this is a joy to use.

The supplied drawing manager for krypton painting is an example with my own tastes. You are free to modify it or derive your own class from it. If you hit some limitations related to the drawing, your feature requests are welcome (this is true for the features of the calendar too, of course).

The free MonthCalendar, as well as the Krypton drawing manager and a sample are all zipped in this archive.


A new MonthCalendar for the DateTimePicker and the PropertyGrid

There was a miss in the DateTimePicker. The editor was able to take any CultureInfo to localize the displayed strings but the popup calendar was not, simply because SFPE was still using the Microsoft MonthCalendar which accepts only the culture of the thread. It had to be fixed so I decided to write my own calendar.

This choice was also motivated by a second category of customers who use the free Krypton Toolkit API. This framework has no DateTime components (yet). For them I had just to ensure that my calendar is skinnable. But more on this in another post.

Not to make a big change, my calendar by default looks like the MS one (+ a mouse hover effect) and has the following features:

  • It is completely free (see at the bottom). Why? Simply because this is not my business and the community needs a good one that is also supported in a commercial package
  • It can be used standalone or inside the SFPE DateTimePicker
  • It has a CultureInfo property
  • It is not limited by the fateful 1753 year but by what the DateTime type can accept
  • It can display an optional and localizable "Today" button
  • It is nullable, so it can display an optional and localizable "Clear" button too
  • There is a true continuous acceleration when keeping the month and year buttons pressed
  • An overridable drawing manager allows you to customize its look

There are some limitations for this first release, simply because I needed a simple calendar for the DateTimePicker:

  • It displays only one month (no rows and columns of months)
  • It doesn't handle range selections
  • There is no bolded dates

That said, you have nothing to loose trying it. It's free and I think this is not just another calendar component. Personaly I tried the various ones proposed by some famous component vendors and I was not so impressed. They put the accent on the nice themes, but each time I was able to find a visual glitch or an annoying limitation.

Even if you are not a VisualHint customer, you can send me feature requests and I will enhance this calendar bit by bit (here in the comments or at UserVoice). Let me know if you like it too...

Get the month calendar here (the supplied sample references the free Krypton toolkit, so if you don't want that, simply remove the reference and the corresponding code in the form class).


An interactive calendar on your windows desktop

In 2002, when VisualHint was not born yet, I was proposing some components written in C++/MFC under the name aircom.org. The MFC PropertyGrid appeared there, as well as a DateTimePicker and color components.

Today I retrieved a nice little program, called DeskDate that I was selling for a modest 9.95 US$, and reinstalled it on my machine. Take it! It's now free (I'm not responsible if it destroys your computer, bla bla bla). DeskDate displays a permanent calendar on your desktop (you choose the number of rows and columns, and the color), behind all windows (you can bring it on the foreground with a hotkey). Right-click to access the preferences. Here is a screenshot:

alt text

Now, does it give you a clue about my new task for SFPE?


A suffix for the day of the month in the DateTimePicker

The TimeSpanEditor was able to do it but not the DateTimePicker due to the way DateTime.Parse works. I have changed that and the DateTimePicker is now able to show a different suffix depending on the day of the month. Here is an animated screenshot:

English suffix for the DateTimePicker

To work, you need to handle the ValueChanged event, like this:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
    FieldPack fieldPack = (sender as FieldPack);
    Field field = fieldPack.GetField(3);
    if (field != fieldPack.EmptyField)
        SetDayLabel(fieldPack.OwnerEditor as DateTimePicker, field);

private void SetDayLabel(DateTimePicker dtp, Field field)
    if (dtp.Value != null)
        DateTime value = (DateTime)dtp.Value;
        string suffix = "th, ";
        if (value.Day == 1)
            suffix = "st, ";
        else if (value.Day == 2)
            suffix = "nd, ";
        else if (value.Day == 3)
            suffix = "rd, ";

        if (!field.Value.Equals(suffix))
            field.Value = suffix;

Depending on your language, you can of course change the prefix. Note that there is no particular requirement for the format string.