Palm OS开发常见问题和技巧

简介:

1. 判断当前focus是否为field

index=FrmGetFocus(form);
if(index= =noFocus)
return(false);
field=FrmGetObjectPtr(form,index);

2. FrmDoDialog()使用方法:

FrmInitForm
FrmDrawForm
set form controls
FrmDoDialog
read form controls
FrmDeleteForm 

注意:FrmDoDialog()无法获得frmOpenEvent。

3. 测试控件类型:

switch (FrmGetObjectType(pForm, index)) { 
   case frmControlObj: 
     
   case frmFieldObj: 
     
   case frmScrollBarObj: 
     
   default:
     
}

4. 在程序里使用标准的edit menu:

If your form has a menubar that consists of just the "Edit" menu, you can specify menu ID 10000 at form creation time. If your form has a menubar with several menus, you should specify your Edit menu like this, using PilRC notation:

PULLDOWN "Edit"
BEGIN
    MENUITEM "Undo" ID 10000 "U"
    MENUITEM "Cut" ID 10001 "X"
    MENUITEM "Copy" ID 10002 "C"
    MENUITEM "Paste" ID 10003 "U"
    MENUITEM "Select All" ID 10004 "S"
    MENUITEM "-" ID 10005
    MENUITEM "Keyboard" ID 10006 "K"
    MENUITEM "Grafitti Help" ID 10007 "G"
END

If you're using Constructor, just create an Edit menu with ID 10000, and the IDs for the items will be provided for you. http://www.palmoswerks.com/2001/11/16

5. Push button的使用

GroupID若为0则与普通button一样,若GroupID不为0则同组内保证只有一个被选中。 FrmSetControlGroupSelection给push button赋值。

6. 关于PrefGetAppPreferences

PrefGetAppPreferences要判断返回结果是否为noPreferenceFound

7. 给文本框(Field)赋值

static void SetFieldText(FormType *form, FieldType *field, Char* value){
    MemHandle newTextH;
    MemHandle oldTextH;
    Char *text;
    newTextH = MemHandleNew(20);
    text = MemHandleLock(newTextH);
    StrCopy(text, value);
    MemHandleUnlock(newTextH);
    oldTextH = FldGetTextHandle(field);
    FldSetTextHandle(field, newTextH);
    if (oldTextH)  
        MemHandleFree(oldTextH);
    if(FrmVisible(form))
        FldDrawField(field);
}

8. 关于CtlGetLabel()

如果需要CtlGetLabel(),则在CtlSetLabel()时不应立即释放Char*参数,否则CtlGetLabel()得到的将是乱内容。 “This function stores the newLabel pointer in the control's data structure. It doesn't make a copy of the string that is passed in. Therefore, if you use CtlSetLabel, you must manage the string yourself. You must ensure that it persists for as long as it is being displayed (that is, for as long as the control is displayed or until you call CtlSetLabel with a new string), and you must free the string after it is no longer in use (typically after the form containing the control is freed). If you never use CtlSetLabel, you do not need to worry about freeing a control's label. ”

9. 关于HideState()

HideState()返回代码之一是statXXX而非sysXXX,Palm SDK参考有误。

10. 最好不要使用全局变量,用Feature代替之。

11. Simulator没有截屏的快捷键,用Alt+PrintScr代替之。

12. 让modal dialog全屏的方法

FormType* pOriForm = FrmGetActiveForm();
pForm = FrmInitForm(KeyboardForm);
FrmSetActiveForm(pForm);//Must
FrmSetEventHandler(pForm, KeyboardFormHandleEvent);

formWinH = FrmGetWindowHandle(pForm);
WinSetConstraintsSize(formWinH, 160, 160, 160, 240, 240, 240);
FrmSetDIAPolicyAttr(pForm, frmDIAPolicyCustom);
PINSetInputTriggerState(pinInputTriggerDisabled);
PINSetInputAreaState(pinInputAreaClosed);
SysSetOrientation(sysOrientationLandscape);
StatHide();

13. 关于RepeatingButton

RepeatingButton响应CtlRepeatEvent而非CtlSelectEvent

14. Palm simulator与电脑同步

可参考这个网址:http://duchaoqian.blogbus.com/logs/538520.html,注意电话号码用"00"

15. 多行文本框

Multi-line的text改变内容后要FldRecalculateField(textField, false);否则换行可能不正确。

16. 关于下拉列表

要产生popSelectEvent,在ctlSelectEvent里一定让handled=false

17. 关于debug

遇到不知原因的死机等错误,最有效的解决办法是排除法,用if(false){...}不断缩小范围直到找到导致错误的代码。 按下按钮后,若模拟器不是崩溃而是没有反应,很可能是程序陷入了死循环。

18. JPilotDB的使用方法

JPilotDB提供的lib文件太大,有4M多(因为包含了很多UI和相关lib),如果只是用于在Java里处理.pdb文件完全不需要它的全部内容,精简后的大小为96K,点击下载

代码范例:创建一个.pdb文件

try {
  //Construct the database
    PilotDBSchema schema = new PilotDBSchema();
    PilotDBDatabase database = new PilotDBDatabase("DB Name", "TypeID", "Creator", schema);
    for (int i = 0; i < 10; i++) {
        PilotDBRecord record = database.createRecord();
      record.setRecordData(new byte[]{});//set contents of the record
    }
    //Write to file
    FileOutputStream fos = new FileOutputStream("c:/test.pdb");
    database.write(fos);
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
} catch (PalmDbException e) {
    e.printStackTrace();
}

代码范例:读取一个.pdb文件

try {
    //Read database from file
    FileInputStream fis = new FileInputStream("c:/test.pdb");
    PilotDBDatabase database = new PilotDBDatabase(fis);
    fis.close();
    //Read records of the database
    int recCount = database.getRecordCount();
    for (int i = 0; i < recCount; i++) {
        Record record = database.getRecord(i);
        byte[] bytes = record.getRecordData();
        //deal with the record
    }
} catch (IOException e) {
    e.printStackTrace();
} catch (PalmDbException e) {
    e.printStackTrace();
}

 19. 用程序控制退出当前运行的程序

EvtEnqueueKey (vchrLaunch, 0, commandKeyMask);

20. Simulator里使用五维方向键(5-Way Navigator):

  • [Alt] + [Enter] = Select 
  • [Alt] + [Left Arrow] = Left
  • [Alt] + [Right Arrow] = Right 
  • [Alt] + [Up Arrow] = Up 
  • [Alt] + [Down Arrow] = Down

21. 关于Gadget。帮助文档里的例子可能比较旧了,回调(Callback)函数里的第一个参数FormGadgetType*类型应改为FormGadgetTypeInCallback*类型。此外,第三个void*类型的参数不能直接paramP->eType,要先转换为确定类型才能使用,例如在formGadgetHandleEventCmd里要先EventType* pToEvent = (EventType*) paramP;,然后才可以用pToEvent->eType来判断事件类型。

22. 在PODS里使用Palm OS Glue Library,除了在.c文件头部加上“#include <PalmOSGlue.h>;”外,还要设置这个project的linker配置,否则会提示"Undefined reference"。配置的方法祥见这里。摘抄如下:“For managed make 68K projects, go to the project properties, and in the C/C++ Build panel, choose PRC-Tools Palm OS 68K Linker/General. Click the "New..." button in the Additional Libraries area, and enter this text into the dialog: -lPalmOSGlue; For a standard make 68K project based on the PalmSource template, in the file "makefile", modify the line for ADDITIONAL_LINK_LIBRARIES to read: ADDITIONAL_LINK_LIBRARIES = -lPalmOSGlue

23. 判断Form里的对象是否可见:用FrmGlueGetObjectUsable()方法,注意要先加载Glue库。

24. 根据新闻组里的言论以及自己的试验,FrmReturnToFrom(0)在Debug ROM里很可能有bug,会导致Simulator因内存问题崩溃。

25. 若两个数据库的TypeID和CreatorID都相同,Palm将视其为同一数据库的两个版本,因此若要枚举出它们,DmGetNextDatabaseByTypeCreator()的第五个参数必须为false(有些应用可能恰恰不需要枚举出每个版本,而只需要最新版本,则应使用true)。

26. 虽然数据库都是在内存里,但打开一个数据库的开销还是不能忽视,DmOpenDatabase()执行50次的时间大约有0.1秒。

27. Palm SDK没有提供画圆的函数,可以用画圆角矩形的方法代替,让圆角的半径等于矩形边长一半即可。

28. 关于使用表格控件的方法,这篇文章介绍的很详细,建议参考:http://www.mit.jyu.fi/~mweber/teaching/docs/palmos/book/ch08.htm

本文转自博客园八进制的博客,原文链接:Palm OS开发常见问题和技巧,如需转载请自行联系原博主。

相关文章
|
9月前
|
人工智能 搜索推荐 API
🚀 2小时极速开发!基于DeepSeek+智体OS的AI社交「头榜」震撼上线!
基于DeepSeek大模型与DTNS协议的革命性AI社交平台「头榜」震撼上线!仅需2小时极速开发,即可构建完整社交功能模块。平台具备智能社交网络、AI Agent生态、Prompt市场、AIGC创作等六大核心优势,支持低代码部署与个性化定制。开发者可快速接入DeepSeek API,体验去中心化架构与数据自主权。官网:[dtns.top](https://dtns.top),立即开启你的AI社交帝国!#AI社交 #DeepSeek #DTNS协议
290 4
|
12月前
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS三
本文介绍了ArkTS的基础语法,包括常量、命名规则、数组及其常用函数,以及函数的定义与使用,涵盖匿名函数和箭头函数的区别。通过具体示例,帮助读者快速掌握ArkTS编程技巧,踏上Harmony OS开发之旅。君志所向,一往无前!
683 1
Harmony OS开发-ArkTS三
|
安全 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统优化策略####
当今数字化时代,移动应用已成为日常生活不可或缺的一部分,而移动操作系统则是支撑这些应用运行的基石。本文旨在探讨当前移动应用开发的最新趋势,分析主流移动操作系统的特点及优化策略,为开发者提供有价值的参考。通过深入剖析技术创新、市场动态与用户需求变化,本文力求揭示移动应用与系统协同发展的内在逻辑,助力行业持续进步。 ####
271 9
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
592 47
Harmony OS开发-ArkTS语言速成二
|
12月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
781 11
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
12月前
|
前端开发 JavaScript 开发工具
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
790 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
12月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
576 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
12月前
|
JavaScript 编译器 开发工具
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
627 2
【02】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-准备工具安装-编译器DevEco Studio安装-arkts编程语言认识-编译器devco-鸿蒙SDK安装-模拟器环境调试-hyper虚拟化开启-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
开发框架 JavaScript 前端开发
Harmony OS开发-ArkT语言速成一
本文介绍ArkTS语言,它是鸿蒙生态的应用开发语言,基于TypeScript,具有静态类型检查、声明式UI、组件化架构、响应式编程等特性,支持跨平台开发和高效性能优化。ArkTS通过强化静态检查和分析,提升代码健壮性和运行性能,适用于Web、移动端和桌面端应用开发。关注我,带你轻松掌握HarmonyOS开发。
615 5
Harmony OS开发-ArkT语言速成一
|
人工智能 5G 开发工具
移动应用与系统的未来趋势:开发、操作系统创新及挑战###
本文探讨了移动应用开发和移动操作系统的最新发展趋势,包括人工智能的集成、跨平台开发工具的兴起以及5G技术对移动生态的影响。同时,还分析了开发者面临的主要挑战,如安全性问题、性能优化和用户体验提升等。通过具体案例和技术解析,本文旨在为开发者提供前瞻性指导,帮助他们在快速变化的移动科技领域保持竞争力。 ###

推荐镜像

更多