[Palm]关于 Modal Dialogs(Modal Form) 的三种编程方法

原创 2004年06月16日 15:21:00

关于 Modal Dialogs(Modal Form) 的三种编程方法

translated and modified by Carol

原文:http://www.palmos.com/dev/support/docs/recipes/modal_dialogs.html

在 tompda 上有更多讨论: http://www.tompda.com/bbs/display.asp?luntan=2&forumID=1660213

由简至繁,依次为:
1) 使用 FrmDoDialog, 不需要自己写事件处理程序(event handler)
这种方法最简单,但是灵活性比较差

2) 使用 FrmDoDialog, 自己要写一部分的事件处理程序

3) 使用 FrmPopupForm, 自己写独立的事件处理程序,事件循环函数

根据 form/dialog 不同复杂度,选择不同的方式来处理,事半功倍

上述三种编程方法虽然不同,但是它们的资源文件是没有什么差别的,都是选用 modal form 来建造的
假设我们要做的是在 MainForm 上按 "Details", 驱动打开 DetailsForm

Option 1: 不需要写事件驱动的 FrmDoDialog

在 MainFormHandleEvent 里面加上这一段:

    if (eventP->data.ctlSelect.controlID == MainDetailsButton) {
       frmP = FrmInitForm(DetailsForm);

       /* initialize your controls on the form here */
       在这里加上form的控件初始化

       // open the dialog, and wait until a button is pressed to close it.
       // 这一句 FrmDoDialog 打开了 DetailsForm,form 会在你按了上面的 button 以后退出来,       // 返回的值 whichButton 告诉你按的是哪个 button.
       whichButton = FrmDoDialog(frmP);

       if (whichButton == DetailsOKButton) {
          /* get data from controls on the form to save/apply changes */
          // 根据不同的返回值,获取处理DetailsForm里的改变
       }
       FrmDeleteForm(frmP);
       handled=true;
    }

Option 2: 带事件处理的 FrmDoDialog
 
这种方式的 modal form,可以使开发者依赖FrmDoDialog处理大部分工作,同时处理一些自己比较关心的事件。这种方法使用和 option 1 一样的代码,只是在 FrmDoDialog 调用前再加上下面这句:

FrmSetEventHandler(frmP,  DetailsPartialEventHandler);

FrmDoDialog 会在处理事件之前,调用DetailsPartialEventHandler来处理你定义的事件

static Boolean DetailsPartialEventHandler(EventPtr eventP)
    {
       Boolean handled = false;

       if ((eventP->eType == ctlSelectEvent) &&
           (eventP->data.ctlSelect.controlID == DetailsOKButton)) {
          if (ValidationFailsOnTheInput()) {
             FrmAlert(PleaseFixYourInputAlert);
             // tell FrmDoDialog we handled this event, so it
             // shouldn't do anything
             handled=true;
          }
       }
       return handled;
    }

注意,如果在这个form里要进行通讯,或为处理某些后台事件而要延迟, 就不要是用 FrmDoDialog.
FrmDoDialog 的好处就是你可以少写代码,而这些代码都集中在程序的一处。(还是看英文原文比较好:FrmDoDialog runs in its own event loop instead of yours, giving you slightly less control over event handling than you normally have. If you are doing communications or are using event timeouts for some background processing or updating, FrmDoDialog is not a good implementation for your dialog. The benefit of FrmDoDialog is that you need to write less code and that code is located in only one place in your application. )

Option 3: 使用完整独立的事件处理

这种方法具有最大程度的灵活性也最复杂,可以把它当作一个通常的 form 来处理。
建立事件处理函数:

static Boolean DetailsHandleEvent(EventPtr eventP)
    {
       Boolean handled = false;
       FormPtr frmP;

       switch (eventP->eType)  {   
          case frmOpenEvent:
             frmP = FrmGetActiveForm();
             /* initialize UI objects here */
             // 我还在这里加了个函数, 进行初始化的处理,就像 MainFormInit() 那样。
             FrmDrawForm(frmP);
             handled = true;
             break;

          case ctlSelectEvent:
             if (eventP->data.ctlSelect.controlID == DetailsOKButton) {
                /* save or apply the changes now */
                FrmReturnToForm(0);
                handled = true;
                break;
             }
             else if (eventP->data.ctlSelect.controlID == DetailsCancelButton) {
                /* don't save changes, just return. */
                FrmReturnToForm(0);
                handled = true;
                break;
             }

          default:
             break;
       }

       return handled;
    }

注意点:要使用 FrmReturnToForm() 来关闭这个form, 并返回到之前的活动form, 因此保存数据等工作也记得在这个 handleEvent 里一并完成(而不是在 main form 的代码里)。

上面这个函数,是在 AppHandleEvent 里面被调用的:

   case DetailsForm:
       FrmSetEventHandler(frmP, DetailsHandleEvent);
       break;

把它加在和 case MainForm: 并列的位置上。

最后,要显示这个 form, 在处理 button 事件时,要使用 FrmPopupForm,而不是 FrmDoDialog
FrmPopupForm 会产生 loadEvent 和 openEvent 两个事件。

   if (eventP->data.ctlSelect.controlID == MainDetailsButton) {
       MenuEraseStatus(0);  // in case the status is still active
       // Some apps might want to save the current focus here.
       FrmPopupForm(DetailsForm);
       handled=true;
    }

Bootstrap的一些笔记——modal

modal是Bootstrap提供的一个“窗口组件”,可以配合js实现弹出窗口的效果。 modal的class是“modal”,其中必须包含三个div部分,属性分别问modal-header,mod...
  • friskit
  • friskit
  • 2012年02月12日 10:53
  • 42225

Ant Design Modal 中嵌入Form表单后,initValue,不能动态获取最新值得问题

场景描述: 如下图所示,当我点击某个盒子的时候,我需要得到该盒子的数据, 问题:当我第一次点击的时候得到了当前的数据值,但是在点击其他的盒子的时候数据form中的数据还是上次的数据,并未更新。刷新...
  • Meditate_MasterYi
  • Meditate_MasterYi
  • 2018年01月06日 19:42
  • 276

关于实现在阿里的Antd的Modal上实现动态表的一种思路

关于实现在阿里的Antd的Modal上实现动态表的一种思路问题描述有一种业务场景,就是我们需要在一个Modal中实现动态添加表单项。并且在该Modal期间会触发状态树的更改,比如你在Modal上填写了...
  • nianhua120
  • nianhua120
  • 2017年08月02日 11:07
  • 1450

Modal dialogs with Win32 API

Modal dialogs with Win32 API? I have been charged with the task of making a DLL in VB6 that can disp...
  • winehero
  • winehero
  • 2005年12月27日 09:30
  • 2411

Ant Design of React Modal显示数据错乱问题

需求 写一个Modal,来展示或者录入用户的数据。 问题 当修改一个用户的Modal后,再打开另一个用户的Modal,后一个用户显示的数据为前一个用户的数据,造成数据错乱的问题。 这是在Ant Des...
  • hbkc5
  • hbkc5
  • 2017年04月13日 14:18
  • 1001

在Bootstrap的Modal form里面添加PartialView

@using (Html.BeginForm("DisplaySites", "DisplayDSP", FormMethod.Post)) { @(H...
  • clear_zero
  • clear_zero
  • 2016年03月21日 19:00
  • 1442

Bootstrap简单认识之Modal组件

Modal(模态框)组件一、简介 不支持多个模态框同时存在 一般作为文档body元素的直接子元素存在(不要受到其他元素的影响,假如把模态框元素放在一个具有 transform 属性的父元素里,模态框的...
  • u012062760
  • u012062760
  • 2017年03月02日 20:05
  • 1658

Bootstrap使用模态框modal实现表单提交弹出框

模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。 如果您想要单独引用该插件的功能,那么您需要引用...
  • LuoJun_
  • LuoJun_
  • 2018年01月17日 16:29
  • 290

自定义modal动画

modal界面跳转在IOS中,相比大家都不陌生,除了导航控制器中的经常使用的push以外,我们也经常使用从下而上跳转的控制器效果,这也就是modal效果。modal跳转使用对于使用storyBoard...
  • ZJJeffery
  • ZJJeffery
  • 2015年05月17日 23:32
  • 1062

vuex - modal的实现 =>从入门到放弃(二)

vuex - modal的实现 =>从入门到放弃(二)
  • Zhooson
  • Zhooson
  • 2017年07月19日 14:37
  • 600
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Palm]关于 Modal Dialogs(Modal Form) 的三种编程方法
举报原因:
原因补充:

(最多只允许输入30个字)