Tuesday, June 27, 2017

DropTime Class

Over the years, I tried to find ways to speed up and provide a unique time picker for my users and subscribers.  And I ended up working on different classes for this need:

DropClock - is a time picker based on combobox.  It has Interval property (default is 1) that allows faster picking of the hour and minute portion.   If interval is say set to 5, then the values shown will be with interval of 5, i.e., 5,10,15,20.... But it still is not fast enough because user still has to scroll down on the combobox especially if Interval is on default 1.

Then I created ScrollTime class which is like on Android.  It works with mouse scroll where you position your mouse pointer above the hour and scroll up and down.  The same on minute.  But it still is not fast enough too, plus it eats space on form.

Finally I created TimerX which is what I used in dtPickerX class for its time needs.  This is based on spinners so user can either type or spin the values.  But then it still is not fast enough.

I need something that will really make my users and subscribers' lives easier.

Finally I thought of a new idea this morning and I started working on it.  And behold my latest class, DropTime class.

And using this is damn very fast.  Where the user will simply do this:  click, click, click, click.  Just like when you are reading it.  Of course, nothing will beat a textbox with picture "99:99" as all we need to do is type 4 numbers there.  But who wants a plain textbox for time these days?

Anyway, finally I am very satisfied with this that I also replaced TimerX in dtPicker with this one.

I am sure you will say, why not put the dropdown time going to the right as it looks better?  Until I find why clicking outside the border of its parent form causes it to close the dropdown portion of dtPickerX, it will remain that way.

Additional Properties for the dropdown section only

Themes = Default value is .F..  Turning this to .T. will remove the sunken effect of selection and will replace the appearance with a 3D effect

Alignment = 1 is Left (Default) and 2 is Right (Default on dtPickerX)

BackColor and ForeColor = well, colors

This will be part of the next update  to my subscribers (including the enhancements on NavigatorX).  Cheers!

Monday, June 19, 2017

NavigatorX class

Updates June 21, 2017

Added Options button (red gear on the image below)

Default value is shown.  You can turn it off via setting NoOption property to .T. and this button will be hidden.  Useful in some cases where we want to restrict users to specific things only.  This Option button (right now) gives users on-the-ply capabilities to do any of these:

  • Change Interval - by default, the interval of skipping a record is one (1).  It can be set on the PEM, Others tab into greater number but then you will be stuck up on that fixed interval.  So I decided to give users the capability to change skipping of number of records at their whim, and so this.
  • Jump To Record - is requested by a subscriber after I updated them yesterday.  This allows you to specify the record number to jump stright into that.
  • Set Filter (available only when bound to Grid) - allows you to filter grid records on-the-ply. 
  • Remove Filter (available only when bound to Grid) - as the name implies, remove the filter that you set above.
After posting this, I continued on testing the class and I made further changes to the Filtering Capability as follows:

It now forces you to click on a target column first before it allows filtering. If you haven't, it will give you the message 'Click on a Column First' which cannot be selected too.

That is because it has to know on which column of the grid it should perform the filtering.  After clicking on a header, then that is the time it will show the filtering capability and mentioning as well the target field like this:

In the above image, I clicked on the header of column for Company.  Please note that when it says Set Filter to Company, that company there is the underlying field used by that column and not the column header's caption.  That allows the users to realize too where they are performing the filter.

However, I remember that not in all cases, a filtering feature is good because there might be cases where there is already a filtering implemented in a grid and if we use this class filtering capability, then it can overwrite the filter condition which you guys set by codes.  And so for cases like that, I added the NoFilter property.  Set this to .T.  and it will not show that filtering capability anymore.

Miscellaneous Effects

Miscellaneous effects for GUI can be done via playing with these properties:

1.  BackColor, BackStyle, SpecialEffect, BorderColor, and BorderWidth.

2. Hover Effect.  Cousin Glen suggested an idea to show the border of the class on Mouse Enter.  I like it so I added it here as well.  To make the effect look better (at least to my taste), I changed SpecialEffect to zero as default.  So now when you move your mouse on top of the class, it is suddenly raised and when you move away from it, it goes back flat and borderless.

Some more ideas may come to me in the future about this class or some may be suggested by others.  We will see.

NavigatorX is a new control class that handles record navigation like going to top, previous record, next record, and going to last record or bottom.  I was browsing for some things on the web when I saw again a Paginator (Page 4 of 24) and I said to myself, well this looks cool to be added to ssUltimate Library?  But since we are not dealing with pages inside VFP as we have grid, then it is best known to us as a navigator.

Saturday, June 10, 2017

Breaking down Grid's Column object

A foxite member has sought assistance on how to make an active cell of a specific column change color, as additional visual highlight, upon receiving focus.  Of course it means AllowCellSelection is .T. to allow that specific cell focus.  So I showed him how via a sample code whereby I manipulated both GotFocus() and LostFocus() of the text object for that column to change the backcolor when it receives focus and to return it back to white on LostFocus.

I said new findings because a fellow respected member of Foxite, Tony Vignone, has mentioned on a comment under mine  that lostfocus is not needed on my sample codes as it achieves that switching of backcolor even without it (lostfocus codes I have shown) though he is not clear as to the whys.  So he asked me if I have an idea as to the whys.

And yes, having manipulated objects of VFP myself to create a single new object in form (control classes like xBox, PopCalc, DTPickerX, EditX, etc.) for my ssUltimate library, I do immediately got a "new perspective" of how a grid's column is composed of.  And this is what I am sharing here now.  How really is a column of a grid composed of?

Column's Composition

Originally I think of a column consisting of 3 objects.  A container, a header and a textbox (by default). His comments helped lift up the fog in my eyes which resulted to this new perspective of a grid's column's composition now.

Saturday, June 3, 2017

DTPickerX Revisited

Talking to one subscribers via FB Messenger last night made me aware that he is not aware of all of its feature so I decided to create this now to itemize its important features.

Return Values

Others may not be aware but it does not simply return a date or datetime value.  It returns a lot of other values as follows:

  • Value = depending on nLevel property, it can either return a date value or a datetime value
  • nYear = returns the numeric year of the selected date
  • nMonth = returns the numeric month of the selected date
  • nDay = returns the numeric day of the selected date
  • _BOM = always returns the beginning of month of the selected date
  • _EOM = always returns the end of month of the selected date
  • _DateTime = regardless of nLevel, always returns the datetine value of the selected date
  • SQLValue (new) = always return the date on YMD string format.  Useful for other backends such as MSSQL, MySQL, MariaDB or any other backend that requires the same format

Language Localization

Todate, dtPickerX supports seven (7) languages per request of subscribers as follows:

0=Indonesian, 1=English, 2=Italian, 3=Spanish, 4=Turkish, 5=Romanian, 6=German

Friday, June 2, 2017

grdSortLock - Some More...

After adding the capability to hide and unhide column(s) yesterday, I decided to add some more features for this.  I can edit yesterday's post but then those who read it already may not be aware of the additional changes I made after that as they may no longer revisit that other post  so this new post.  Here are what is new (again) on this class:

1.  Cleaner arrow icons representing sort order.  Also I realized some plain users may get confused with the terms Sort Ascending or Sort Descending  so those are replaced with simple terms which are Order Up and Order Down

2.  Added now the locked icons if  a column is locked as additional visual guide.  So here is how it will look like now with locks implemented

3.  Added other more visual Toggling for RecordMark, Theme, GridLines, ScrollBars and Views. It means your users now can change those on-the-ply based on their taste

As for Views, this allows you to change something like this

Into this:

But while those other toggling are cool to give users a chance to change the looks of the grid based on their taste, those are half-baked so to speak being those are not retained by the class right now.  So when I have another more extra time, I will give this class that capability to remember a grid's last settings, per machine, so a user can personalize their grids and keep those preferences.

Well that is all for now! Cheers!

Tuesday, May 30, 2017

Hide/Unhide Grid Columns

This is actually per request of my very first subscriber MK Sharma.  So he was looking for a tool to hide/unhide grid columns on-the-ply that he asked me if this can be incorporated on the ssUltimate library.   I said okay I will look into it but I was busy with simultaneous projects these days that I kept shoving it at the back of my mind.

Finally I became a bit free of my workload and so I decided to work on this one today.  I did not realize adding this feature will not require a lot of my time that I kept unnecessarily putting this request on hold thinking I will do it later when I am free, which happens today; as it is hard to concentrate on extra things when you are already working on 3 projects simultaneously.

Anyway, that feature now is part of GridSortLock class.  So this means said class can now Sort, Lock and Hide/Unhide columns of the grid.  Here are some images of it:

Wednesday, April 26, 2017

MariaDB - Speeding Up Records Migration

I started testing MariaDB as my new backend and while it is simple enough to do the switch onto that, there are some things that I need to adjust on my VFP codes.  Some of those are the field types, for logical fields I have to use TINYINT (for MySQL ODBC 5.1 or later) or BIT (for MySQL ODBC 3.51), for dates it does not accept {} for an empty date, etc.

However, this post is not about that. It is more on the speed of migration approach.  Bear in mind I am new with this, only less than a week but I think regardless of it, this can help some who might be using MariaDB or MySQL as backends.

One way to connect from VFP to MariaDB is via SPT (SQL Pass-Through). With a code like this:

If SQLExec(gomyapp.DbBaseConn,'INSERT INTO MyTable (MyField) VALUES (?m.lcMyValue)') <= 0