Saturday, December 28, 2013


A friend shared this to me in my facebook account.  It hit the spots in my heart and so I decided to share it here as well.  A very touching message, we thank you David!

A sentimental open letter from an American teacher to the Filipino people (Pls. take time to read this)

By David H. Harwell, PhD

I am writing to thank Filipinos for the way you have treated me here, and to pass on a lesson I learned from observing the differences between your culture and mine over the years.

I am an expatriate worker. I refer to myself as an OAW, an overseas American worker, as a bad joke. The work I do involves a lot of traveling and changing locations, and I do it alone, without family. I have been in 21 countries now, not including my own. It was fun at first. Now, many years later, I am getting tired. The Philippines remains my favorite country of all, though, and I’d like to tell you why before I have to go away again.

I have lived for short periods here, traveled here, and have family and friends here. My own family of origin in the United States is like that of many Americans—not much of a family. Americans do not stay very close to their families, geographically or emotionally, and that is a major mistake. I have long been looking for a home and a family, and the Philippines is the only place I have lived where people honestly seem to understand how important their families are.

I am American and hard-headed. I am a teacher, but it takes me a long time to learn some things. But I’ve been trying, and your culture has been patient in trying to teach me.

In the countries where I’ve lived and worked, all over the Middle East and Asia, it is Filipinos who do all the work and make everything happen. When I am working in a new company abroad, I seek out the Filipino staff when I need help getting something done, and done right. Your international reputation as employees is that you work hard, don’t complain, and are very capable. If all the Filipinos were to go home from the Middle East, the world would stop. Oil is the lifeblood of the world, but without Filipinos, the oil will not come from the ground, it will not be loaded onto the ships, and the ships will not sail. The offices that make the deals and collect the payments will not even open in the morning. The schools will not have teachers, and, of course, the hospitals will have no staff.

MKDirs - Create Folder and Missing Sub-Folders in one go!

Well I posted this inside foxite last time as a fellow member is wondering how it can be done.   Suppose you want to create a folder and several sub-folders like this?

c:\mine\sub1\sub2\my sub3\sub4\sub sub\ too deep or not \how.about now\maybe this time

MD will fail in some of those sub-folders with spaces or dots, or in other words it will be able to create sub-folders only up to a certain extent.

This simple function I named MKDirs fixes that problem using only stock VFP commands and functions.

* Author: Jun Tangunan
* Date: December 19, 2013
Function MKDirs(lcFolder,llUNC)
Local lnSub, lnLoop, lcDir
lnSub = Getwordcount(m.lcFolder,'\')
lcDir = ''
For lnLoop = 1 To m.lnSub
      lcDir = m.lcDir + Getwordnum(m.lcFolder,m.lnLoop,'\')+'\'
      If m.llUNC
            lcDir = '\\'+lcDir
            llUNC = .F.
            Mkdir (m.lcDir)

To use this is something like this:

Local lcFolder
lcDir = 'c:\one\two\three\ sample \with. space'
If !Directory(m.lcFolder,1)

Or for a UNC path, pass .T. to the second parameter

Local lcFolder
lcDir = '\\shornsrvr\fcms\one\two\three\ sample \with. space'
If !Directory(m.lcFolder,1)


Wednesday, September 11, 2013

Conflicting Softwares

Here is a joke I grabbed just from the net:

Girlfriend 1.0 software

Last year, my friend upgraded his GirlFriend 3.1 to GirlFriendPlus1.0 (marketing name: Fiancee1.0).

Recently he upgraded Fiancee1.0 to Wife1.0, and it's a memory hogger! It has taken all his space; and Wife1.0 must be running before he can do anything. Although he didn't ask for them, Wife1.0 came with Plug-Ins such as MotherInLaw and BrotherInLaw. These too slow down the system and cause a slow drain on the resources and well-being of the computer.

Some features I'd like to see in the upcoming GirlFriend4.0:

1. A "Don't remind me again" button.

2. Minimize button.

3. Shutdown feature - An install shield feature so that Girlfriend4.0 can be completely uninstalled if so desired (so you don't lose cache and other objects).

I tried running Girlfriend 2.0 with Girlfriend 1.0 still installed; they tried using the same I/O port and conflicted. Then I tried to uninstall Girlfriend 1.0, but it didn't have an uninstall program. I tried to uninstall it by hand, but it put files in my system directory.

Another thing that sucks--in all versions of Girlfriend that I've used is that it is totally "object orientated" and only supports hardware with gold plated contacts.

Bug warning
Wife 1.0 has an undocumented bug. If you try to install Mistress 1.1 before uninstalling Wife 1.0, Wife 1.0 will delete MSMoney files before doing the uninstall itself. Then Mistress 1.1 will refuse to install, claiming insufficient resources.


Just for laughs! :)

Grid Dynamics' Power!!!

What is Dynamic?

(of a process or system) Characterized by constant change, activity, or progress.
A force that stimulates change or progress within a system or process.

So Dynamic can change.  It is the opposite of being Static or Fixed.

In VFP Grid, there is only one real row and the rest are just mirrors of the first one manipulated by VFP to show different values. It means that conditions on objects (textbox, combobox, checkbox, etc) on a column are static.  What condition and formatting you applied to an object of a cell applies to the rest of the cells belonging to that column.

But since there definitely is a need for us to reflect on a cell certain values based on several conditions, then that is where Dynamic Properties of a grid is needed (see VFP help on available Dynamic Properties).  A very powerful feature of grid that makes me prefer it over to listbox.

Yesterday inside Foxite, I finally understood the need of a fellow member with the sample he provided which is allowing a combobox inside a column to change values or sort of being filtered based on a combination of values of two fields (or column1 and Column5).  And I showed him how to attain that by employing DynamicCurrentControl Property of the grid.

What is DynamicCurrentControl?

Please just refer to my early posting in Weblogs about this:

Tuesday, July 30, 2013

How to make an Ugly App

Being away from my wife for more than a month doing admin works again, this time in Port Moresby, I have time to play with my form's appearances during the night.  With her besides me, of course I cannot do that as that will mean war!  LOL!  And honestly, I should not do that as well because there should be a fine line between being a developer/designer and a loving husband.

Anyway, being alone here on my room at night and not still into coding mood these days, I work instead on finding out how to make my forms look better by creating what I hope are stunning but not too comical forms.  So I play with mixing colors, creating some effects for my forms' appearances, plus some new tricks on some menu/button effects for further eye candies. While this post won't and can't help anyone on coding matters, I hope this will at least give you ideas on how to make your forms uglier.... err... prettier.   Here are some pointers:

a.  Use Photoshop.  This is the best tool I have known so far where I can design stunning effects to serve as form's background.  Play with layers, Layer Styles, Filters, Opacity and Fill.

b.  Transparent Pageframes.  Well I shared this before here but if this is ignored, I cannot blame them.  The sample I gave there is very simple and does not leave much to imagination.  But take a look at the effect when used in my real forms.

Friday, July 26, 2013

Insert Words, Combine/Merge RTF Files

This came from a question inside foxite forum when a member tried to merge two RTF files into one via FILETOSTR() and STRTOFILE() and the member cannot see the second set of words added at the end of the rtf document, and wonder why.  So here is the explanation.

An RTF file starts with {\rtf1 and ends with corresponding }. So if you combine two or more rtf documents via a FILETOSTR() then later STRTOFILE(), each of those will have their own opening and closing RTF codes.  And an RTF document will just read whatever is within its opening and closing codes that whatever is added after the closing bracket will be ignored.

Here is a test for you to see better.  Copy these codes and paste to a notepad, save with an RTF extension, quit  and open the file in wordpad or msWord:

{\rtf1\Ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fnil\fcharset0 Arial;}}
\viewkind4\uc1\pard\f0\fs20 This is sample\f1\fs18
\par }

Now, we will simulate FILETOSTR() and STRTOFILE() with additive clause at the end.  Imagine if we copy the same set of codes and paste it twice inside, on notepad, it will look like this:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fnil\fcharset0 Arial;}}
\viewkind4\uc1\pard\f0\fs20 This is sample\f1\fs18
\par }
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fnil\fcharset0 Arial;}}
\viewkind4\uc1\pard\f0\fs20 This is sample\f1\fs18
\par }

Save it, close and open in msWord or Wordpad.  Surprise!!! There is still one line of word "This is a sample"  instead of two.  Again because an RTF ignores anything that is after the closing } bracket.

So we cannot blame FILETOSTR() and later STRTOFILE() as those are doing properly what they are designed for.  Either you clean up the RTF codes yourself or better use Word Automation so it will clean the RTF codes for you.

Here is a sample of word automation:
Set Safety Off
Declare Integer ShellExecute In shell32.Dll ;
      INTEGER hndWin, ;
      STRING cAction, ;
      STRING cFileName, ;
      STRING cParams, ;
      STRING cDir, ;
      INTEGER nShowWin
#Define wdStory           6
#Define wdPasteDefault    0

Local lcSource, lcTarget
lcTarget = Addbs(Getenv("TMP"))+"Target.rtf"
lcSource = Getfile("rtf")
If !Empty(m.lcSource)
      Create Cursor junk (myMemo M)
      Insert Into junk Values (Filetostr(m.lcSource))

      * Let us create the RTF file

      * Now we will make two copies of the content in a single RTF file
      Local loRTF As Word.Application
      loRTF = Createobject("Word.Application")
      With loRTF
            .DisplayAlerts = .F.
            * Copy everything, paste as a new set, save and quit
      * Check using wordpad
      Messagebox('You aborted!')

I hope this helps you on your needs!

Tuesday, July 16, 2013

How Uglier can a VFP app get?

Been gone for quite a while now doing admin and other managerial jobs lately and I felt I am loosing my grip on developing but every time I think of doing it, my mind sorts of auto shuts down, LOL!  I guess that is what normally happens when you have plenty other things to think of.

Anyway, I looked for something that can entice me and lure me back into developing and GUI designing and I found it in my Assets Masterfile module which image I have posted before under Various Images on a Grid blog.  Now, I wanted to change that grid into an HTML Browser instead for smoother scrolling effects.  That is the start and then I decided to make it more looking like a website maybe?

Monday, May 27, 2013

ssDropCalc class in a Grid, How To?

When I shared ssClasses library, I gave a sample form on most of the classes and among it is ssDropCalc (Dropdown Calculator class) showing how to run it on a default value or formula mode plus how to use it inside a grid if you wanted to.  The sample runs good, but I believe this is the second time I was asked about how to use it in a grid where my usual response is "Please check the sample form I shared for that".

But since I just got asked again about that, I decided to test myself why despite my sample, they are still

Tuesday, May 21, 2013

ComboBox in a Grid - Combobox Trick # 2

I have promised last time I will show another combobox trick but totally forgot about it.  Then yesterday another member asked about a combobox inside a grid saying while it is working on his end, whatever is selected on the active combobox does not appear.  It appears only when the combobox on the current record looses focus.

While working directly with grids do not appeal to me, I played with his requirement and indeed it does not show the combobox' DisplayValue.  So I got curious because if I recall properly, I fixed that problem on my end before but in the end working directly on a Grid does not really appeal to me that I discarded the entire concept and went back to Add To Table approach.

Anyway, here is a working sample of that if you need one, and on the bottom note the reason why:

Saturday, May 18, 2013

Removing Ghost Devices from your unit

This is actually asked inside the forum and I said, hey this is likewise a good topic to add here in my blog, so...

What are Ghost Devices?

Well we can simply say this.  A ghost is believed to be an entity that is there but cannot be seen.  So a Ghost Device is on your unit but is hidden.  Also a ghost is a remnant of your physical being.  Ghost Devices likewise are remnants of your previous device installations like a scanner or printer that is no longer plugged into your machine, a mass storage device, a mobile phone, etc.  And even a single device can have several Ghost Entries on a single unit based on which port you plug that device to.

A ghost device is also sometimes referred to as a Phantom device.

How to manually clean Ghost Devices?

I will simply refer you instead to this Microsoft article:

Is there a way to prevent Ghosting?

Thursday, May 16, 2013

Grid Dynamic Property via a Method way

Usage of Dynamic Properties of a Grid seems to still baffles others because the sample that we can gleam in case of DynamicBackColor when using the Grid Builder using Ledger Style is via the IIF() condition.

Something like this:

This.Grid1.Column1.DynamicBackColor = ;

And so by looking at that sample, we can create some more conditions like this:

This.Grid1.Column1.DynamicBackColor = ;
      'IIF(fld1= 1,RGB(255,255,255),RGB(192,220,192))'

So the natural instinct of some developers is that when the need is based on more than two conditions, they would expand above conditions with additional IIF()

This.Grid1.Column1.DynamicBackColor = ;
      'Iif(fld1= 1,Rgb(255,255,255),Iif(fld2 = 2,Rgb(255,255,0),;

Or in case of higher VFP versions that support this, an ICASE() condition:

Wednesday, May 15, 2013

Choosing the Fastest Internet Connection Setting near you!

Normally your Internet Service Provider (ISP) controls the settings you can use to connect to internet.   They also have their own Domain Name System (DNS).  But accidentally I found out that while that is the normal way, we can still improve its speed.  And the trick lies in not relying blindly onto the DNS used and provided by our ISP.

What is DNS anyway?

An often-used analogy to explain the Domain Name System is that it serves as the phone book for the Internet by translating human-friendly computer hostnames into IP addresses. For example, the domain name translates to the addresses (IPv4) and 2001:500:88:200::10 (IPv6). Unlike a phone book, the DNS can be quickly updated, allowing a service's location on the network to change without affecting the end users, who continue to use the same host name. Users take advantage of this when they use meaningful Uniform Resource Locators (URLs) and e-mail addresses without having to know how the computer actually locates the services   - Wikipedia

It simply says that because we as humans remember names better than number combinations, then DNS is responsible in translating for instance into its corresponding IP Address.   Imagine if we don't have DNS, then instead of saying "google it", you would end up saying " it!".  LOL!

So how does choosing the best DNS affects our browsing speed?  Well the better and more complete the phone book is, the better result we can get.

Monday, May 6, 2013

ActiveX DTPicker (MSComCtl2.DTPicker.2) on a grid, how to...

I created a post in Weblogs in 2009 on how to use the ActiveX DateTime Picker (MSComCtl2.DTPicker.2) on a grid where in addition to the instructions, I shared a sample form to show how it can be done.  But that sample form was now lost in Weblogs and while the instructions there are clear, I failed to include some more steps on the further adjustments I did the day after said blog was posted.  And so when a foxite forum member sought assistance in "taming" that elusive ActiveX DTPicker inside the grid and I pointed to my Weblogs article on that, there are missing steps.

Worse, I myself forgot exactly how I have done that last time because I forgot to save a copy of the sample form I shared before.  Not to mention I actually do not use that activex DTPicker and only has done that blog last time out of curiosity.

Anyway, since I became curious again on how I did that last time plus maybe some may need it again, I experimented again on that problem and got it working again, LOL.  So I am recreating the steps needed to make it work in a grid in this blog.

Instructions on creating a sample form:

Create an empty form, on its load event, paste these:

Friday, April 12, 2013

Conditional Sub-Total on Report (repost)

Most of Foxite forum members are aware that I have been blogging in Weblogs way before I decided to blog here in blogspot.  However, I have a lot of new visitors here who might not be aware of that so I decided to repost this knowing it may also help others.

This trick is on removing sub-total when there is only one item on native VFP report.  Take a look at the image I grabbed from said Weblogs posting below:

If you are interested in knowing the trick, I will simply redirect you to my old post:  


Tuesday, March 12, 2013

ssUltimate/ssClasses Sample Video

For the first time, I decided to show by way of video how one of my apps look like.  This one is a very small app I called Easy ID Creator which is what I develop to be used here on our end in creating  IDs on-the-ply.  I plan to later  enhance this to be used in Daily Time Recording by scanning the IDs (that is why the barcode) and thereby calculating the employee time; to replace the old Bundy Clock.

I would like to show how it really looks like but I am forced to convert said video from .avi to .wmv format which has lower resolution as uploading of the .avi takes time due to size.  Here though is how it looks near, near because this is likewise a jpeg resized image so it still do not actually show the real appearance.

Tuesday, March 5, 2013

Dynamic Detailed Summary in Report?

Need something like this? At the bottom of the report, a detailed summary based on the entries on the report? 

Surprisingly, this is very easy to do if you know the knobs to twist.   The process and tricks involved is in creating a cursor for your report, generating another cursor out of the first cursor to hold the summary, and finally seeding those back to the original cursor.

Another is by employing grouping to break presentation of the data.  Study the sample data:

Thursday, February 28, 2013

LockScreen Woes! - Beware!

Being a proponent of Clipper during my DOS xBase days, I massively use ScreenLock where it will lock the screen (do not show things as they happen) and where I can start creating boxes, labels, buttons (in the DOS style sense) and a whole lot of codes and suddenly when ScreenLock is released, pooop it suddenly appears as if it is like our form in VFP these days.  That is very useful because if you don't lock the screen, you will see each line created slowly in front of your eyes (we have slower machines back then).  That also speeds up drastically my exe back then.

So I was happy that when I jumped to VFP, they created a sort of the same thing, i.e., LockScreen property.  So what does that Lockscreen do?  VFP Help says these:

Saturday, February 16, 2013

Sandstorm's Quick Search Tool

Here is another tool to help you search for files in your unit.  You can search multiple types by using asterisk (*) and you can search on multiple locations by either typing the paths straight in the box for Target Folder and/or clicking on the dotted button on the right.

This uses filer.dll that is shipped along with VFP (Home(6)).  For you to be able to use said dll on other machines though, you need to register it first using an admin account.

regsvr32 filer.dll

And here are the codes:

Sunday, February 10, 2013

Grid Showing Fonts' Name and Appearance

Here is another one that again comes from reading a need of a member inside foxite forum which is to show the list of fonts on the current computer unit in any object possible with an added minor twist, i.e., that aside from the name Arial, the font name should be displayed as well on how the font looks.

Wednesday, February 6, 2013

ssClasses issue on cCleaner

A subscriber has been repeatedly requesting me for a major update on how ssClasses works just because one (or some) of his clients have cCleaner on their machines and said cCleaner is beating the crap out of ssClasses because most users are likewise ticking the temp folder to be among those it will clean.  And temp folder is where I decided to send images needed by ssClasses for two reasons:
  1. It is "never" restricted to the current user
  2. It is a place to store 'craps'.  You can think of the images of ssClasses as crap if you wish
But due to that constant cleaning done by users of cCleaner, then in some cases with the current design of the library, needed images for some of the classes like buttons, switches, etc.; might not appear properly on first run of your app.  Succeeding runs will have no problem.

Monday, February 4, 2013

Setting Focus to an Object via its TabIndex Value

MK has been repeatedly requesting from me if I can make ssOptSwitch totally loose focus and moves to the next control when user presses TAB and I said that unless someone showed me a way to do that via tabindex, then it can't be done.  No one showed me so it stays that way.

That default attitude of the class is not surprising considering ssOptSwitch actually is just a container comprised of several ssSwitch so it is just natural that when one switch looses focus via Enter or Tab keys, then the next switch based on tab index will receive it.  And I really cannot imagine yet how to do something like:


I was sitting in front of  my laptop Sunday afternoon as I am in the mood going through the minor bugs on Alpha 3.0 as mentioned by MK fixing those one by one until I came to his ssOptSwitch Tab request.  Suddenly I realized I have been saying all along the solution to that and that the above command can actually be translated into something like this:

Thursday, January 17, 2013

ssPolyClock on Alpha 3.0

What's New:
  1. Created clockimgs custom class.  This now handles the themes and images
  2. Added Theme No. 3 (Metal Skins) created by Dayll Bautista.   
  3. Removed all previous skins I created before.  I changed this now into New Classic Theme (Theme 1)
  4. Changed Skins Extraction to be based only on the currently selected theme.  
  5. Will extract a skin only when is not there.  
  6. Cleaner and smaller images.  All images are now in PNG format
  7. To make things uniform, every theme now only has 7 skins
Before the class automatically overwrites a skin file on every form run.  The decision to make it like that is because I do not want someone bugging me about why their clock still looks the same despite an update has been downloaded where I have to explain that that  is because the specific skin's name is found and so extracting is skipped.

Now though, I decided to extract only when a skin file is not there.  So if you have encountered a problem of still getting the old looks, then go to local user's temp folder, look for clocks folder and delete all skins (.skz).  As simple as that!

Here is Metal Skins (Theme 3) - New!!!

Wednesday, January 16, 2013

ssThrobber on Alpha 3.0

What's New:

a.  Changed look. It is now Snoopy sliding around instead of a simple throbber
b.  Bigger fonts WordWrapped
c.  Ability to change caption
d.  The ability to specify positions

Since the original ssThrobber can change caption and positions, I decided to do the same with this one.  But while I use the word "Caption" here, it is really not the Caption property I touched but "Comment".  Don't bother yourself much about that one though because ssThrobber will handle those things by itself.  Here is a sample usage:

Tuesday, January 8, 2013

Thor, a must have Tool!

Thor is a tool developed and shared to us by Jim Nelson to manage add-on "other" tools in VFP IDE.  Tools such as ssClasses library, IntellisenseX, GoFish, FoxCodePlus, PEM Editor; to name a few.  Among the features of Thor is it acts as a repository of the abovementioned (and not mentioned) tools.

How does having Thor Tool in your unit advantageous to you?

Saturday, January 5, 2013

ssSwitch & ssOptSwitch - New Skins

February 1:

  • Changed theme 18 so we can have a cool looking checkbox style.  As ssOptSwitch uses ssSwitch, then you now can have a cool looking checkbox style
  • Added lNoMarker parameter.  This marker was originally requested by a subscriber but personally I do not like this so I now made it optional.  Default is True though so as not to affect said subscriber's project

January post:
  • Cleaner Codes
  • Faster Switching
  • Better looks
  • Switched to PNG format for better appearances
  • Changed font from Tahoma 8 to Tahoma 10
When I first created most of my classes, all I wanted is to have some uniquely looking objects I can use to spice up the look of my app.  And I have said that ssClasses will terraform our VFP apps, because that is what I have in mind back then.  The ability to change appearances of our form that an onlooker (or even developers of other PLs) will initially wonder what PL we have used to create our apps.

And I do not want ssClasses to be tied up with existing looks seen on the net because my perception is that those current trends we see out there normally don't last long that when something new is shown, users will say that 'hey your app looks old' just because they have seen that look before and also saw it being replaced by another trend.