E-mail: Chris Antos
Disclaimer: By using HandyShopper, you agree that in no way can I be held
responsible for anything bad (or good) that happens as a result of using (or
abusing) HandyShopper. When you use it, you do so at your own risk. It works
great for me, but your mileage may vary.
What is HandyShopper?
HandyShopper helps keep track of your shopping list(s) for you.
You can add into HandyShopper all the things you commonly shop for, and just
check off which ones you need to buy, then go shopping and check them off your
list as you buy them. Couldn't be simpler!
Quick Start: How to Shop with HandyShopper
Here are some quick directions to get you started shopping with HandyShopper.
First, make sure the "Need" tab at the top is highlighted in black.
Tap the New button to add new items to your list. You'll notice a
checkbox appears on the left, with a dotted underline next to it (this is
where you enter a description of the item, for instance "Batteries - AAA").
Add as many items as you wish. When you go shopping, HandyShopper shows your
list of items you need (notice the tab at the top which says Need; this
tab should be selected, or black).
As you purchase items on your list, check them off. They will disappear from
your list. The item is not necessarily deleted from your list, though; if an
item is marked as One Time Only then it is deleted when you check it off,
otherwise it is merely filtered from the Need view, since it is no
Next time you need to go shopping, select the All tab and the items
you've gone shopping for before will be listed. Just mark which items you need
this time (tap the box to the left of the item so it gets a checkmark in it).
Now select the Need tab to show your shopping list, and you're ready to
For more information, and to make use of HandyShopper's other useful features,
see HandyShopper's Features and How to Use Them.
For instance, you can have up to 15 stores, and mark an item as being
available in any or all of those stores. As you might expect, you can see your
entire shopping list, or you can limit it to one store at a time. You can
categorize items, too (for instance, I have a Wife Gift Ideas category,
and a Groceries category). Just like the PalmPilot's To Do List and
Memo List, you can see all items at once, or just one category at a time. And
To change various settings (such as which columns are displayed, and other
settings) you can tap the Menu circle next to the graffiti area, and choose
Options and then Preferences.
The Shopping List
The first time you start HandyShopper, you'll see a screen that looks like Figure 1. Let's step through what each control can be used for, starting from the top left corner.
"i" You can tap the "i" in the top left corner to display some quick reminders on how to use HandyShopper.
All / Need / C These three tabs filter which items are displayed.
When All is selected, all items are listed.
When Need is selected, only items that are marked as needed are displayed (this is your list of needed items that you intend to purchase).
When C is selected, only items that are needed and for which you have coupons are listed.
To mark down that you need to buy a particular item, select All and find the item in the list (you can use the lookup feature, described below).
Once you've found the item, check the box to the left of the item.
This puts the item on your shopping list.
When the Need tab is selected and you use the New button (described below) to add a new item to the list, the new item is automatically marked as needed.
Categories in the top right corner is a dropdown list where you can select a category to show.
This works just like the category dropdown in the PalmPilot's built-in Address Book, Memo Pad, and To Do List.
Stores Just below the All/Need/C tabs is the Stores dropdown.
Many items on a shopping list may be available at more than one store.
HandyShopper therefore allows you to have up to 15 stores, and you can check off the stores at which each item is available.
To see all the items on your shopping list, select All Stores from the Stores dropdown.
Or, you can select a specific store; then only the items which are available at that store are listed.
If a store has one or more items which you currently need, the store's name is shown in bold in the list of stores.
Any store which doesn't have items you need is shown in normal type.
The Columns There are several optional columns that can be
displayed (you can turn them on or off by choosing Options/Preferences from
the menu). Figure 2 shows all seven columns turned on. From left to
right, the columns are Need, Name, Quantity,
Coupon, Aisle, Category, and Price.
- Need checkbox when the All tab is selected, this
box can be checked to put it on your list of needed items. When the
Need or C tabs are selected, checking this box indicates you
have purchased the item and the item is removed from the list (the item is
still in the All list, in case you need it again later - note: if
you mark the item as One Time Only then it really does get deleted from
- Name field here you can enter a description of the item
(for example, "Batteries").
- Quantity tap here to note how many of this item you need
(for an 8-pack of AAA batteries you would set the quantity to "1". If you
need two packs, you would set the quantity to "2").
- Coupon checkbox check this box if you have a coupon for
the item. You can select the C tab to list the items you need buy
and have coupons for.
- Aisle tap here to note the aisle where this item can be
found. You can sort your list by aisle number to help make your shopping
trip take less time.
- Category tap here to set the category for the item.
- Price field here you can enter the price for one item
(for instance, an 8-pack of batteries is one item and probably costs
$5.99). When you tap the $ button, HandyShopper will multiply the
quantity and price and show you the total cost of the items on your list.
New Tap the New button to add items to your list.
When the All tab is selected, new items are added to your master list, but are not marked as currently needed (this is the best way to enter a store's stock into HandyShopper for future use).
When the All tab is selected, you can put an item on your "current shopping list" by checking the box to the its left.
When the Need or C tab is selected, new items are automatically marked as needed (the checkbox to the left will be empty when the Need tab is selected; check the box when you've purchased the item and the item will disappear from the list).
Details This button pops up the Details dialog, where you can
mark at which stores the item is available, set the category, and mark the
item as One Time Only, or Private.
Lookup (L: ...........) Tap here and enter text to look up. The
first item that matches what you enter here will be highlighted.
Setting up Stores You can have up to 15 stores. The list of
stores can be customized by choosing Options/Edit Stores from the menu.
Other Preferences The other settings for HandyShopper can be
changed by choosing Options/Preferences from the menu.
- Show Quantity, Coupon, Aisle, Category, Price check or uncheck
these to control which columns are shown in the views.
- New items are "One Time Only" this controls whether new
items default to being "one time only". An item that is "one time only"
automatically gets deleted when you check it off in the Need view. Normally
items disappear from the view, but do not get deleted (they can be seen again
by changing to the All view).
- Automatically reset quantities when this is checked,
HandyShopper will reset the quantity field to 0 when an item is checked off in
the Need view, or will set the quantity to 1 when an item is checked in the
- Round prices to whole numbers when prices are displayed in
the view, this option will round them to the nearest whole dollar amount. The
prices are stored as the exact amount, but are rounded in the display.
- Font this lets you select which font to use in the views.
This option only appears on devices with PalmOS 3.0 or higher.
- Reset button this resets the boldfacing of the store names
in the view. In the Stores dropdown, any store with Needed items is supposed
to be shown in boldface. If the stores do not appear to be correctly
boldfaced, tap this Reset button to recalculate which stores should be
Importing and Exporting
Exporting to MemoPad:
You can export the current view in HandyShopper to a MemoPad memo:
When exporting, HandyShopper creates a new MemoPad memo in the Unfiled
category, and makes it the first memo.
- Tap the Menu area next to the graffiti area.
- Select "Options", then "Export to MemoPad..."
- Check the optional fields that you wish to include in the exported list.
- Tap the "Export" button.
Importing from MemoPad:
You can import a list from a MemoPad memo. The list is imported into the
current category and current store.
When importing, the new items are placed in the current category (or Unfiled
if "All" is the current category). If you are in the "Need" view, then the
new items are also marked as needed items. The items are also associated with
the currently selected store (if "All Stores" is selected, then the new items
are not associated with any stores).
- Tap the Menu area next to the graffiti area.
- Select "Options", then "Import from MemoPad..."
- Select the memo from which to import the list.
- Tap the "Import" button.
Memo Format for Importing
HandyShopper currently support two different basic formats for the list that
can be imported.
Format 1: Bullet Marks
This is the format that HandyShopper uses when it exports a list to the
- Each item begins with a bullet mark, which is either a dash ('-') or
the bullet character (the graffiti stroke is backslash, dot), followed by a
- Next comes the Quantity, which is a number followed by '@'. (This field is
optional; if you omit it, the quantity is set to 0).
- Next is the Price, which may or may not begin with a '$'. (This field is
optional; if you omit it, the price is set to $0).
- Next is the Aisle, which must be 'a:' followed by a number (for instance,
'a:3' means aisle 3). (This field is optional; if you omit it, the aisle is
set to 1).
- Anything following the above fields is put into the Name field. Line
breaks are considered to be part of the Name field, unless they are
immediately followed by a bullet character (or dash).
My shopping list:
- 2@ 1.49 Pringles
- 5.99 batteries
- a:27 sci-fi books
- 4@ .99 2-Liter bottles of pop
- 3@ a:4 cookies for party
party is at Greg's house
(this is 3rd line of party item)
- 14.99 box of logs for fire
Format 2: No Bullet Marks
If you do not use bullet marks, then line breaks are used to determine when to
start a new item. Other than that, this format is the same as Format 1.
$5 cat food
1@ $5.99 AAA batteries
2@ $1.89 a:3 soup
- If you export a list, make some changes, and import it again, the imported
items are ADDED to your list. This means that you will now have duplicate
copies of each item that you exported and then imported. You can use the
"Purge for Import..." command to delete all the items from the current view,
and then import the list. Note, the "current view" is filtered to show only
All, Needed, or Coupon items from the current store and current category.
- You can put bullet characters in the description of an item. But if you
export the list, and then import it again, the bullet characters may be
interpreted as new items instead of as part of the description. To avoid
this, make sure that the bullet character does not immediately follow a line
- Not all fields can be exported. Only the Quantity, Price, Aisle, and
Description can be exported. There is currently no way to export which stores
an item is associated with.
v2.0 - Info on Next Version
I have lots of ideas for v2.0, and the more postcards I get, the faster v2.0
will come. If you are interested, remember to send me a postcard.
Update on Progress of v2.0 [Updated 06/30/99]
v2 is coming along slowly but surely. I am definitely going to release a v2,
but please be patient because it will take several months. I've signed up a
team of beta testers, and things are going great so far.
Here's an incomplete list of several features I have planned for v2 (there are
more that I haven't listed). Also, I've gotten several requests to keep HS
simple to use. That has been my intent from the beginning, and has not
changed. I am also making it as efficient as possible, in speed, in database
size, and in code size. For instance, many users have requested prices and
aisles to be recorded per store. This would make the database significantly
larger. Many other users have requested that the database be kept very small
and efficient, because they don't care about prices or aisles. So, I have
carefully designed the database format to be flexible. For instance, if you
choose to use the per-store price feature, your database will get bigger. But
those who don't want that feature will not be wasting memory.
Features Already Finished:
- Allows up to 100 stores.
- If one or more stores are defined and you create a new item that is not
associated with any stores, then HandyShopper will warn you.
- Multiple lists (Find works across all the lists, too).
- Attach a Note to an item.
- Taxable checkbox, user-definable sales tax rate.
- Show both total price of items purchased so far, and estimated total cost
of all items in the current list.
- Due dates.
- Supports aisles 0 through 200.
- Record date of purchase.
- Automatic sorting (the list will stay sorted instead of needing resorted
whenever you add items).
- Sort by up to three fields, in ascending or descending order.
- Allow decimal quantities.
- Allow user-defineable "units" (e.g., Description = "meat", Quantity = 0.5,
Unit = "kg", Price = 3.99, so the actual price of what you'll purchase is 3.99
- User-definable currency symbol.
- In number fields, automatically popup a 4-function numeric
keypad/calculator with memory.
- Redesigned database format.
- Import/Export to MemoPad.
- Choose font.
- Optionally alerts you if you create a new item and neglect to associate it
with any stores.
- A "Best Buy" wizard that lets you enter the price and quantity of two
products, and calculates the per-unit prices and says which is cheaper. For
instance, if you see a box of 6 microwave popcorn packets for $3.59, and a box
of 10 for $5.29, which is cheaper? Answer: product A is $0.5983 per packet,
product B is $0.529 per packet, so product B is cheaper.
- and more that I forget...
Features Planned or In Progress:
Note, not all of these will necessarily be in v2. Some may bein the next
version after that, or may end up being not feasible to implement.
- Keep track of aisle and price for each store (because this feature can
significantly increase the database size, and because I personally will not
use it, I am making this an optional feature which is OFF by default).
**NOTE** This feature is certainly possible to implement, but I'm facing some
difficult problems. For instance if you sort by aisle, then every time you
change stores the entire list must be resorted. That's not exactly speedy on
these handheld devices... There are ways around this, but they impact the user
experience and make it non-intuitive. I'll see what I can come up with.
- v2 is intended to be able to replace the ToDo app. Obviously it will not
work the same as the ToDo app, but it is a superset of ToDo's features. (this
is almost complete).
- I purchased CodeWarrior, so I will probably write a Win32 Conduit to
allowing importing and exporting CSV files. (CW was $369 - HS is freeware I
write as a hobby, so talk about an expensive hobby...!). Either that, or I
will write some other kind of converter program to support CSV files, and
allow easy data entry on the PC.
- Undo -- it's too easy to accidentally check off the wrong item, or
double-tap and accidentally check off two items. The Undo command will
probably allow you to undo checking off the most recent 2 or 3 items.
- Import/Export from MemoPad, ToDo, or other HandyShopper databases (yes,
you will be able to import your existing HandyShopper 1.x database -- and I've
carefully designed the new database format so future versions won't need an
importer to upgrade the database).
- Impulse Date to curb impulse purchases, for years I have written
down the date that I see something and how much it costs. I wait a week or
two, and if I still want it and I think it's still worth it and I really can
afford it, then I buy it.
- Named aisles (maybe optionally set up aisle order per store).
- Recurring items.
- Copy items from one list to another. Have "master" lists, and copy items
from master lists into other lists.
- IR beaming. (This is especially important to me; my wife and I want to be
able to share a shopping list and synchronize with each via IR).
- IR printing.
- and more...
Features NOT Planned:
- Show a flat list with a separator for each store. There is no reasonable
way to do this given the fact that a given item may be associated with
multiple stores. Sure, I could write this feature, but it would be so
S...L...O...W that noone would use it anyway.
I am no longer including the source code for HandyShopper. However, it is
still freely available. If you want it, just e-mail me
and ask for it (I will e-mail you a .ZIP file containing the full source,
which may or may not compile for you depending on what tools you have
When I was starting to program for the PalmPilot, it seemed the big question
on the newsgroups was "how do I program tables?". It's very hard to find good
source code for programming tables. I've done lots of interesting stuff with
tables, and my code is not entirely uncommented, so maybe you'll find it
HandyShopper was originally created using the Win32 GCC 0.50 PalmPilot SDK
(but its makefile is intended for use with the NMake from Microsoft Visual C++
5.0 or higher). I now use CodeWarrior R5 to compile it, but I still use PilRC
to compile the resources, and I use the RCPalm post-linker (which I
wrote) to link the resources into the .PRC file.
If you find the source code helpful, I'd like to know! Please mail me a postcard.
Alternatively you can email me, but remember to send that postcard!
Where to Find the Latest Version
The latest version of HandyShopper can always be found on PilotGear HQ. Or follow this link
to PilotGear HQ's information page on HandyShopper: