by Christopher Antos, Copyright © 1998-2011 and 2003-2010, All Rights Reserved.
Visit the HandyShopper User Group hosted by Yahoo.
Please visit the User Group rather than emailing me for help.
What is HandyShopper?
HandyShopper User Group
Download HandyShopper -- Updated February 22, 2011: Palm v3.1.3, WM v3.2
Ideas for Creative Use of HandyShopper
Information for Developers -- Updated February 28, 2010
What is HandyShopper?
HandyShopper works on any Pocket PC device that uses Windows Mobile™ 2003 or higher, and on
any device that uses Palm OS 2.0 through OS 5.x. If you want to know whether HandyShopper runs on a
specific device, ask in the User Group.
HandyShopper is a tool for managing your shopping lists. It helps you build a shopping database
that remembers everything you've purchased before, so that you can find them in your "All" list
(master list) and mark them as needed so they appear in your "Need" list. When you go shopping, you
check off items from your list as you put them in your cart, then after you pay for them you use the
"Checkout" command to move the checked-off items back to the "All" list (items that aren't checked
off yet stay in the "Need" list). Even though HandyShopper is designed for shopping lists, you can
use it for other kinds of lists, too.
Here are a few of the many features of HandyShopper:
- Create as many databases as you wish (shopping lists or other lists).
- Mark items in your database (list) as Needed, and once you finish shopping, the items are remembered so you can quickly reuse them later.
- You can keep track of how many of each item you need, what the price is, the aisle where the item is located, whether the item is taxable, and more.
- Tap an item and hold the stylus down for half a second to pop up a context menu with some common actions.
- A special one-handed mode lets you mark off items with one hand, without having to pull out the stylus.
- The Total command adds up the total amount for the items you have marked as Needed, and the total amount of the items you've put in your cart.
- Notes can be attached to items.
- Each database can be sorted by any of the fields (up to 3 fields at a time).
- Keep track of up to 100 stores per database, and which items are available at which stores.
- Stores that have needed items show up in bold in the Stores dropdown list.
- Organize items in up to 100 categories per database.
- The column widths in the list view can be resized by dragging the column header divider bars.
- Optionally keep track of prices and aisles for an item on a per-store basis.
- Copy an item to another database, including which stores the item is available at.
You can also compare features between the Palm OS and Windows Mobile
versions of HandyShopper.
FreeWare and DonationWare - HandyShopper is free of charge for anyone to use. But if you
like it, then I encourage anyone who recognizes the value of the adage "give a man a fish, feed him
for a day; teach a man to fish, feed him for a lifetime" to take a look at what Heifer International is about, and see if you'd like to
contribute and/or be involved. If for some reason you don't believe this is a cause worth
supporting, please consider giving to a charitable organization involved in community service or
Disclaimer - This software is FREE and I cannot be responsible or liable for lost data or any
other problems. If this is not acceptable to you, do not use this software!
Support - I wrote HandyShopper as a hobby project. I have a "real job" during the day. I am
not able to provide technical support for HandyShopper. If you have questions or suggestions, or if
you want to share databases you've created, then visit the HandyShopper User Group. When reporting
problems, please give detailed
steps for how to reproduce the problem.
Not Open Source - Although the HandyShopper software is free of charge, it is NOT free in the
open source sense. The open source meaning of "free" is that anyone can modify the software, and
can also charge money for the software (even if they haven't modified it). I'm not interested in
that, and I don't release the source code to HandyShopper. However, if anyone else is willing to
create their own HandyShopper-like program, by all means do so, and I hope you have as much fun
creating yours as I've had creating mine. The one exception is that I released the source code to
the database internals into the Public Domain (which is even more open and
free than so-called "open source"), and anyone is welcome to use that code to enable their program
to use HandyShopper databases.
Distribution - You have permission to distribute HandyShopper with other applications as long
as (1) you include the full HandyShopper package, (2) you do not modify any of the files in the
HandyShopper package, (3) you do not charge for HandyShopper (you can charge for book or disk
materials, download bandwidth, other software, etc).
HandyShopper User Group
Visit the HandyShopper User Group. The
group was started on October 21, 2000 by enthusiastic users of HandyShopper. Here are just some of
the things you can do when visiting the user group:
- Ask questions (or answer questions).
- Download databases that other users have shared.
- Post databases you've created, and share them.
- Benefit from other users' ideas, hints, and tips on how to get the most
out of HandyShopper -- and share your own ideas, too.
Installation is different on Windows Mobile and Palm OS. Be sure to use the appropriate steps for
your device. If you have a Palm branded device, be aware that some Palm branded devices use Windows
Mobile, and some Palm branded devices use Palm OS. You need to find out which operating system your
device uses, and download the appropriate version.
If your Windows Mobile device doesn't connect to a Windows desktop computer, download the Windows
Mobile zip file below and follow the directions inside.
Visit the testing page for more information about beta test versions.
In general, working with HandyShopper follows a pattern like this:
- Add items to database (or, go the All view and find items from previous shopping trips,
that you need this time).
- Select the Need view.
- Go shopping at one store.
- Check off items as you put them in your cart.
- Pay for the items.
- Use the Checkout command (on the menu) to reset the list for the next store (this tells
HandyShopper you purchased the items you checked off, otherwise they'll still appear in the
Total at the next store). Note, the Checkout command also deletes any completed items
that are marked as Auto-delete.
- Go shopping at another store, and go back to step 4.
Coupons: Check the 'Coupon' checkbox in the item's Details screen. Copy the item, using the
'Copy Item' command (on the context menu when you tap and hold the stylus on an item), and assign a
negative price to the new copy. For instance if you have an item "Coke, 2ltr" and a coupon for 50
cents off, you could copy the item to make a coupon item, and assign $-.50 as the price in the
Documentation: HandyShopper comes with very little documentation, but hopefully it doesn't
need much. It does have some built in help, though. On Windows Mobile you can use the
Start->Help command, or on Palm OS you can tap the (i) buttons in the upper right
corner of the screen. For questions on how to use HandyShopper visit the HandyShopper User Group.
Ideas for Creative Use of HandyShopper
Included here are some example ideas contributed by users - share your ideas and databases at the HandyShopper User Group.
Aromatherapy - submitted by Claire Appleby
- I use HandyShopper to record different blends of aromatherapy oils for different uses. My
items are individual oils and I use the stores to represent different uses such as relaxation,
alertness, fatigue, headache etc. I have the database set to record per-store prices and
aisles, and I use the aisles to record the number of drops of each oil needed when making up a
blend for a particular purpose. This means when I select a particular use from the stores list,
HandyShopper shows which oils I need with the number of drops for each oil.
Book List - submitted by Craig Lawson
- I mix together books that I want to buy with those I want to check out from a library. If I
discover someone has checked out the book from the library, I make note of the call number so I
can quickly locate it again either there or at another library.
[editor's note: and the Custom Text field is great for storing the author's name, too!]
Collections - submitted by Gretchen Cawthon
- HandyShopper is excellent for keeping track of collections. Use the quantity field to keep
track of amounts, and the price field for current values. Also, the 'stores' and 'category'
fields are great for easy sorting.
Furniture Shopping - submitted Janet Hilsmier
- We loaded Rooms into the Categories. It was much easier to walk around the store, plug in
each table, couch or chair that we liked, the dimensions and the price. When we finally decided
which ones we "needed", it was easier to make sure the sales agent charged us correctly. Later,
we added our downpayment and interim payments as negative numbers, so that we knew what was owed
by final delivery.
Gift Idea/Shopping List - submitted by Gretchen Cawthon
- Set up your categories as to the type of gift (Christmas, Birthday, Baby Shower). Use the
person's name in the 'store' field. As your friends and family hint at what they want for their
special occasion, add it to the list and then check it off as you purchase it. I also input the
price so I can add up what I have spent for each person. It is also great to have that list
handy when you can't find an item they ask for at Christmas. Then after Christmas you can use
the list for potential birthday gifts, just change the category for the item.
Home Chores List - submitted by Janet Hilsmier
- We loaded all of the mundane dusting, mopping, vacuuming tasks and rooms, plus the
semi-annual and annual tasks like changing batteries.
Home Improvement Projects
- Each month of the year is a store. Categories included "Indoor", "Outdoor" and "Painting".
Then, each project was loaded. We assigned the projects to months to help us schedule
everything we want to do, within reason. (It is impossible to paint, till, stain, mulch, build
and plant in one weekend!) It also helps us to keep focused on getting to some of those
"someday I'd like..." projects.
Impulse Purchases - submitted by Chris Antos
- If you find yourself buying things you later realize you don't need, try this. Create a
dated list called "Impulse", and make the Price and Date columns visible. Whenever you see
something new you want to buy, add it to the Impulse list and mark down how much it costs and
when you saw it. Then walk away and don't buy the item - wait about 3 weeks. Every few weeks,
look through your Impulse list and see if you still really think you need the items. If you
still think those $199 fold-up sunglasses will make a significant difference in your life, then
by all means go back and buy them. <wink> This technique has saved me more than $1000
the first year I started using it, and over the years has grown to be second nature for me.
Another great thing about the Impulse list is you can actually see how much money you've
prevented yourself from wasting.
Inventory - submitted by Chris Antos
- HandyShopper is NOT designed for inventory! Inventory and Shopping are opposite concepts.
Extremely simple inventories can be done with HandyShopper, but in general HandyShopper does not
work well for inventory. Some inventory programs do exist for the Palm devices, so I recommend
searching web sites to find them.
Karate Training - submitted by Philip Wright
- After three years of training, I reached the higher ranks at my karate school. But I still
didn't have a good way to keep track of all my combat techniques. HandyShopper solved that
problem. I created a checklist, and assigned the karate session (Jan-Feb, Mar-Apr, etc) to the
Stores field, and the level (Beginning, Intermediate, Advanced) to the Categories field. Now
all I have to do is put the title of each technique in the task list, and put the instructions
for each technique in the Notes field of the tasks. Now it only takes me two seconds to find a
technique, and one tap of the stylus to see the complete directions for the technique. And one
of the coolest things is that when I'm preparing to test for my next belt, I can check off each
technique as I master it, so that I know which ones I still need to practice.
Movies - submitted by Chris Antos
- When you see a trailer for a movie you'd like to see, add it to your Movies database, along
with the its upcoming release date. You can use the categories for "Theater", "Rent", "Buy
VHS", "Buy DVD", etc. Attach a note to the item, with a description of the movie, in case you
forget what the movie's about or who's playing in it.
Orders - submitted by Gilly Rosenthol
- When I order something, I record the item and the date ordered. That way I can keep track
of what packages I'm expecting and see how long it's been.
Packing List - submitted by Gretchen Cawthon
- This one is obvious but can be fun to experiment with. I set mine up with categories first
(clothing, toiletries, food, accessories, etc). Then I put everyone in my family in the
'stores' field. As I added the items to pack, I assigned them to the proper person. For
example, my husband and I both wear contacts, so I assigned 'contacts' to both of us. For items
like socks and shoes, I assigned them to everyone. Now, if only my husband will be traveling, I
change the store to his name and he then has a customized list of things he needs to pack.
Project task lists - submitted by Claire Appleby
- As a freelance lecturer, a lot of my work involves going through a specific sequence of
tasks in relation to a particular project. For example, if I'm planning a new course for a
particular college I have certain tasks such as planning the overall content, then planning the
individual sessions, delivering each session, marking assignments and so on. I use a store for
each project. The items are the tasks. I use the aisle number to record the sequence that the
tasks have to be carried out in, and I sort the database by aisle. I use price to record the
number of hours that each task usually takes, and quantity to record the number of times it has
to be repeated (for example, assignments might take half an hour each to mark, but I might have
60 of them). At the start of each project, I can go through and select the tasks I need
(usually all of them, but not always). I can also enter the number of assignments etc where
relevant. I can then use the Total command, and HandyShopper tells me the total hours needed to
complete the project, and how many hours work I have done so far.
Reading List with Calculated Priorities - submitted by Claire Appleby
- I read somewhere that if you have to get through an awful lot of reading, you can prioritise
this as follows. You estimate the importance of the article or book by deciding how much you
would be prepared to pay to read it. However, if you would pay the same to read a 20-page paper
and a 200-page book, then your time is better spent reading the paper. So you calculate your
priorities by dividing the price your willing to pay by the length of the book or paper.
HandyShopper does this very nicely as follows. The items are the books or articles. I use
quantity to record the number of pages and aisle to record how much I would pay (in GBP) to read
the book. The built-in calculator is invaluable for calculating value (aisle) divided by length
(quantity), and I use the price column to store this value. The list is sorted in descending
order on price so that the highest priority item comes out on top. I use the categories to
distinguish between reading for work and for pleasure, and I use the stores to record books I've
finished reading and books I've started but not finished (because I tend to have several things
on the go at the same time).
Recipe Database - submitted by Gretchen Cawthon
- This is extremely easy to build. Use the 'stores' list to create categories, such as meat
dishes, pastas, seafood, sauces, appetizers, etc. Then use the actual categories function to
make a more detailed sort - like crockpot, holiday, favorites, etc. Add the title of the recipe
in the description field and attach a note with the recipe instructions. This is quite handy
for keeping track of recipes found on the net (copy/paste from memopad) and also helpful for
jotting down recipes on the go.
Remodelling a House - submitted by Maria Popoli
- I'm using it to remodel our house!! The categories are rooms, exterior elements,
substructures. The stores are subcontractors, our own elbow grease, or particular stores for
required purchases. We redecorated our son's room in a weekend because we had everything ready
to go like a kit - no trips to the hardware store. I've got another database for the
landscaping, categories are: nursery for purchases, existing design, gardening chores pending,
failures, and growers. Stores are locations within my yard. No wasted money at the nursery and
a beautiful garden.
Restaurants - submitted by David Jacobs
- I have created a restaurant list using the "Stores" filed for "Style" of food (Asian,
Vegetarian, Seafood, etc). This allows restaurants to be categorised by multiple "Styles". The
categories field could be used to denote locations and the priority field for quality rating.
The price field could be used to give an average cost for a meal.
Shopping - submitted by Gretchen Cawthon
- Some tips on setting up shopping lists...
Unit prices are important in getting the best value. Some items, like laundry detergent, come
in various sizes. If you buy 100-oz laundry detergent at K-mart for $3.99 and 200-oz at the
Dollar store for $4.99, the best price will show up as $3.99@K-Mart. That may be the low price,
but not the best value. All you needed to know is that the best unit price was $.03/oz.
Instead of having 10 different entries for the various sizes of laundry detergent, try one of
these two methods:
Now when you tap details to see the best price, you will see what a good unit price is for
- Create on entry for laundry detergent and make the unit field 'oz'. Then attach a note to
the field and insert the unit price info there (I created a shortcut that will add the
appropriate text and I just fill in the price).
- Another way is to create a 'store' called "Unit Price". For this store, insert the unit
price for the item.
Software List - submitted by Rosemary Lewis
- Under categories, I use Accessories - Software. Under Stores, I use Author, (Seller names
I use), Demos, Freeware, In ROM, Not Purchased, Purchased, Removed Permanently and Shareware.
Of course each product can appear in a number of "stores" but this gives me the ability to keep
track of every program I have ever tried out. What happened to it, my comments on each in
Notes, see cost as Demos move to Purchased and of course, the total amount of $$ spent on this
project. I am VERY happy with this effort!
Training - submitted by Bruce Chappell
- I thought you might be interested in how I use your HandyShopper program. I am a Emergency
Medical Technician (EMT) (Part Time), and am responsible for training other EMTs in a hospital.
Because of the dynamics of Emergency Medicine, I can't always start teaching a, then b, then c,
etc. So I use Aisles to group things, such as Heart Monitors Aisle 5, then list the various
things I have to cover, Alarm Volume, How to alter preset limits, etc.
Before HandyShopper it was a miracle if I covered everything I was supposed to. I never could
remember if I taught this shift to this person, or another shift to another person. Now I can
guaranty that everything is covered before I sign somebody off as having completed their
orientation. Thanks for a Great Program.
Wine Database - submitted by David Jacobs
- Create different "classes" of wines (Red, White, Fortified, Sparkling, etc) using the
"Stores" field and categories of wines (Shiraz, Chardonay, etc) and assigning "ratings" using
the "Priority" field and using the "Notes" field for comments.
...And many more creative possibilites exist!
Information for Developers
The source code for accessing a HandyShopper database is now available
(including full source to the Hs3Convert tool) and is released to the Public
Domain. If you use the source code, please give an acknowledgement in your
application and document.
IMPORTANT: Do not try to extend the database format to
add your own new capabilities in the database itself! Doing so will cause
incompatibilities with HandyShopper (and other applications that read HS
databases). If you want to use the HS database source code as a starting
point for your own database format, then you must change the creator ID
(AppType in globalhs2.h) and type ID (DBType in globalhs2.h) so
that HandyShopper will know not to open your application's databases. But
even if you choose other IDs you must also register them with Palm (if you
already develop for the Palm OS then you know all about this -- if you don't
already develop for the Palm OS then you'll need to either go learn about
this, or change the filename extension from .PDB to something else).
The sources should compile for any platform with little or no massaging. By
default they compile as UNICODE, but if you cannot compile for UNICODE then
refer to the makefile for instructions on turning off UNICODE (note that
testing has only been done for UNICODE; if you disable UNICODE it should
compile but it may or may not work).
The central header for the database access APIs is dbopen.h.
- SysError MakeNewDatabaseFileName( LPCTSTR pszDir, LPCTSTR pszName, DbFormatType format, StrT* psFile ) — Given the specified directory and database display name, fills psFile with a corresponding filename for the database (escapes invalid characters, etc).
- SysError NewDatabase( LPCTSTR pszFile, LPCTSTR pszDisplayName, DbOpen** ppdb ) — Creates a new database and returns the interface pointer in ppdb.
- SysError OpenDatabase( LPCTSTR pszFile, DbOpen** ppdb ) — Opens an existing database and returns the interface pointer in ppdb.
- DbOpenSimple* SimpleOpenDatabase( LPCTSTR pszFile ) — Opens an existing database as readonly with limited access and returns the interface pointer (or NULL on failure). HandyShopper itself uses this for searching through databases.
- DbQuickOpen* QuickOpenDatabase( LPCTSTR pszFile ) — Retrieves quick statistics from an existing database and returns the interface pointer (or NULL on failure). HandyShopper itself uses this for retrieving the count of Needed items when showing the list of databases.
Review the DbOpen, DbOpenSimple, and DbQuickOpen
interfaces for the available APIs. Since you have the full sources, I'll
trust that you can learn how to use the APIs by reviewing the sources. In
particular, a good place to start is converter.cpp.
Download source code from here: HandyShopper Database Access API Source Code (updated February 28, 2010).
There are a lot of features on the wish list. Some of the higher profile ones are listed below.
- Localization support so users can translate HandyShopper to other languages and share their
- Programmable interface so other handheld applications can access/update HandyShopper data.
- Currently there are two predefined views (All and Need). I'd like to enable customizable views
(modify the predefined views and/or create your own custom views), but I'm still ironing out the
details of how that would work.