Wednesday, September 11, 2013

Grid Dynamics' Power!!!

What is Dynamic?

Adjective
(of a process or system) Characterized by constant change, activity, or progress.
Noun
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: http://weblogs.foxite.com/sandstorm36/2008/08/09/placing-various-images-on-a-grid/

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
      Strtofile(junk.myMemo,m.lcTarget)

      * 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.
            .Documents.Open(m.lcTarget)
            * Copy everything, paste as a new set, save and quit
            .Selection.WholeStory
            .Selection.Copy
            .Selection.EndKey(wdStory)
            .Selection.PasteAndFormat(wdPasteDefault)
            .ActiveDocument.SaveAs(m.lcTarget,6)
            .ActiveDocument.Close
            .Quit
      Endwith
      * Check using wordpad
      ShellExecute(0,"Open","wordpad.exe",m.lcTarget,"",1)
Else
      Messagebox('You aborted!')
Endif




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:  http://support.microsoft.com/kb/315539

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 = ;
      'IIF(MOD(RECNO(),2)=1,RGB(255,255,255),RGB(192,220,192))'

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),;
           Rgb(192,220,192)))'

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 www.example.com translates to the addresses 192.0.43.10 (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 sandstorm36.blogspot.com into its corresponding IP Address.   Imagine if we don't have DNS, then instead of saying "google it", you would end up saying "74.125.237.116 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

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:



The trick lies with a variable.  Create a variable, name it to whatever you like (mine is overall), with the following settings:

value to store = 0
initial value = 0

reset value based on a group

calculation type = count
then of course, tick the release after report checkbox.
Now, on anything that is in the group footer, double-click, click print when tab, tick remove if blank checkbox, then place this condition on print only when expression is true textbox: overall > 1
and that is it.  enjoy your report with conditional sub-total printing!

Cheers!

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:

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:

Thisform.Object(.tabindex).Setfocus

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.