Palm Programming: The Developer's Guide by Neil Rhodes and Julie McKeehan This errata page lists errors outstanding in the most recent printing. If you have any error reports or technical questions, you can send them to booktech@oreilly.com. (Please specify the printing date of your copy.) This page was updated on January 06, 2003. Here's a key to the markup: [page-number]: serious technical mistake {page-number}: minor technical mistake : important language/formatting problem (page-number): language change or minor formatting problem ?page-number?: reader question or request for clarification Confirmed errors: {44} Change: Users can upgrade to the 3.0 OS (including IR support and 2MB of memory) for around $100 at the time of this writing. A user unwilling to spend that kind of money is probably unwilling to buy your software. to: Users were able to upgrade to the 3.0 OS (including IR support and 2MB of memory) for around $100 (although that upgrade is no longer available). A user who was unwilling to spend that kind of money is probably unwilling to buy your software. {102} About half way down the page; The statement: ControlPtr checkbox = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, TrueOrFalseCheckbox) ); does not compile in C++ due to a missing cast. The solution is to change it to: ControlPtr checkbox = (ControlPtr) FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, TrueOrFalseCheckbox)); {144-145}: DmResetRecordStates is dangerous to call Replace: If for some reason your code must close a database while you have locked or busy records, call DmResetRecordStates before calling DmCloseDatabase: err = DmResetRecordStates(gDB); err = DmCloseDatabase(gDB); The Data Manager doesn't do this resetting automatically from DmCloseDatabase because of the performance penalty. The philosophy is that you shouldn't penalize the vast majority of applications that have released and unlocked all their records. Instead, force the minority of applications to make the extra call and incur the speed penalty in these rare cases. with: Thus, make sure that you unlock and release all records before calling DmCloseDatabase. There is a call, DmResetRecordStates, which is advertised to reset locked and busy records. However, in most versions of the OS, it has a bug that causes a fatal system alert if your code calls it. The OS does reset the locked and busy records in the rare case where a system reset occurs while you have a database opens. It calls DmResetRecordStates to do this resetting, but the bug doesn't manifest itself when called by the OS in this case.