`

调用Form

阅读更多

(一) open_form
open_form是一个受限的封装过程,他可以产生一个新的form但不代替原来的form,在新的form启动后可以不把控制移动到新的form里面,也可以将输入焦点移动到新的form里面,用户可以在两个form之间导航。
open_form的调用格式
open_form(form_name,activate_mode,session_mode,data_mode,paramlist_id)
具体意思:
1) form_name 文件名以及路径。
2) activate_mode选择activate是打开新的form并且把输入焦点移入该form,选择no_activate是不移动焦点,还在原来的form里面
3) session_mode是打开新的form的时候的会话方式,可选session和no_session,session创建新的数据库会话,no_session不产生新的会话,和原来的form享受一个session,这个时候原来form里面的commit,都有效果,该选项为默认值.
4) data_mode表示form 之间是否可以共享数据库(libraty data) 取值 no_share_library_data 不共享(默认) share_library_data  共享
5) paramlist_id是form中唯一的参数,次项可选
(二) call_form
call_form于open_form有较大的区别,call_form是一个非受限过程,启动一个新的form后,焦点立刻被转意到新的form里面,原form失去输入焦点,便的不可操作,只有等到新的form退出后在可以使用原来的form.
call_form调用格式  call_form(form_name,display,switch_nemu,query_mode,data_mode,paramlist_name)
具体意思:
1) display 打开新的form是否隐藏原form hide 隐藏,no_hide不隐藏
2) switch_nemu 打开新的form,是否用新的form的菜单代替原来的form菜单 取值o_replace ,no_replace
3) query_mode shi 表示是否仅以查询方式新的form,no_share_only,不是仅以查询方式打开form(默认),query_only,以查询方式启动form
4) data_mode 表示form之间是否可以共享数据库(library data)(同上)
5) paramlist_name 表示form 之间传递的参数,为可选项
(三) new_form
new_form:启动一个新的form,新的form将完全取代原form,但退出新的form时,输入焦点直接退出到原form的父级form或者其他启动原form的位置,在启动新的form之前,系统首先要从原form中退出,并且释放所占内存空间,然后加载新的form,如果原form数据有变化,则在启动新的form的时候终止原form的用户操作,提示用户提交数据,然后在启动新的form
  new_form的调用格式
new_form(form_name,rollback_mode,query_mode,data_mode,paramlist_name)
1) form_name 文件名以及路径
2) rollback_mode 取值to_savepoint,no_rollback,full_rollback
3) query_mode 表示是否仅以查询方式启动新的form
4) data_mode 表示form之间是否可以共享数据库(同上)
5) paramlist_name代表form之间传递的参数,此项为可选项目!

对应的包为:   app_form.call(app_shortname VARCHAR2,
      form_name   VARCHAR2,
      query_mode   NUMBER   DEFAULT NO_QUERY_ONLY,
      parameter_list PARAMLIST DEFAULT NULL_PARAMETER_LIST);
        app_form.open(app_shortname VARCHAR2,
      form_name VARCHAR2,
      query_mode NUMBER   DEFAULT NO_QUERY_ONLY,
      parameter_list PARAMLIST DEFAULT NULL_PARAMETER_LIST,
      session_mode NUMBER   DEFAULT SESSION);
方法1
PROCEDURE shot_plan_new IS
  fm_id FormModule;
BEGIN  
  fm_id := Find_Form('TVSNPMPSCRNMT');      
  if id_null(fm_id) then
    app_form.open('TVSN','TVSNPMPSCRNMT');
    --Application Name --Function Name
  else
go_form('TVSNPMPSCRNMT');
end if;
END;
  实现思路:首先检测是否已经打开了目标Form,是的话就是目标Form成为当前窗体,否的话就新打开一个目标Form。假如在目标Form需要随源Form自动查询出数据,须将代码写在when-window-actived trigger中。
  注意:go_form会引起源Form的when-window-deactived和目标form的when-window-actived trigger,when-window-actived trigger在form切换时都会被触发,因此目标form如果有弹出日历等调用新窗体的操作时,需要设置是否是第一次触发标识作判断,否则可能达不到设计的效果,在该trigger中不要写FND_MESSAGE.DEBUG等调用新窗体的信息,否则会引起死锁。另外此种go_form方法如需要传递参数的话,只能依靠:global.XXXXX,关闭窗体时需要在close-windows或WHEN-WINDOW-CLOSED事件中清除,否则可能导致不需要的后果。
方法2
declare pl_id ParamList;
  fm_id FormModule;
BEGIN
  pl_id := Get_Parameter_List('SCRNMTPL');
IF NOT Id_Null(pl_id) THEN
    Destroy_Parameter_List( pl_id );
  END IF;
pl_id := Create_Parameter_List('SCRNMTPL');
  Add_Parameter(pl_id,'SHOT_DATE',TEXT_PARAMETER,to_char(d_from,'YYYY-MM-DD'));
  Add_Parameter(pl_id,'CHANNEL_TYPE_ID', TEXT_PARAMETER,:CONTROL.CHANNEL_TYPE_ID);
  Add_Parameter(pl_id,'CHANNEL_TYPE_NAME', TEXT_PARAMETER,:CONTROL.CHANNEL_TYPE_NAME);
    fm_id := Find_Form('TVSNPMPSCRNMT');      
    if id_null(fm_id) then
    app_form.open('TVSN','TVSNPMPSCRNMT',NO_QUERY_ONLY,pl_id,NO_SESSION);
else
    go_form('TVSNPMPSCRNMT'); --估计只有通过全局变量传参数了
    end if;
END ;
以上两种方法都是FORM4.5的方法,方法2相对方法1的区别在于:定义了一个参数列表对象,可以添加参数后作为app_form.open的一个传入参数,打开一个新的Form。实际的效果是目标Form中与参数列表中的同名参数会被赋予传入的值,随后被其他程序引用。
方法3
自Oracle Form. 6之后,Oracle建议用发fnd_function.execute和app_navigate.execute来实现form间的相互调用,无论是从语法上还是在性能上,新方法都有所改善。
ORACLE推荐用FND_FUNCTION.EXECUTE取代OPEN_FORM、CALL_FORM
procedure FND_FUNCTION.EXECUTE
(function_name IN varchar2,
open_flag IN varchar2 default ’Y’,
session_flag IN varchar2 default ’SESSION’,
other_params IN varchar2 default NULL,
activate IN varchar2 default ’ACTIVATE’,
browser_target IN varchar2 default NULL);
Example
FND_FUNCTION.EXECUTE(FUNCTION_NAME=>’DEM_DEMXXEOR’,
OPEN_FLAG=>’Y’, SESSION_FLAG=>’Y’,
OTHER_PARAMS=>
’ORDER_ID=”’||param_to_pass1||
’” CUSTOMER_NAME=”’||param_to_pass2||’”’);
APP_NAVIGATE.EXECUTE(function_name =>'TVSN_ TVSNPMPSCRNMT',
                open_flag => 'Y',
                session_flag => 'Y',
                other_params =>
          'SHOT_DATE ="'||to_char(d_from,'YYYY-MM-DD')||
          '" CHANNEL_TYPE_ID="'||:CONTROL.CHANNEL_TYPE_ID||
          '" CHANNEL_TYPE_NAME="'||:CONTROL.CHANNEL_TYPE_NAME||
          '" CALL_FORM="'||'Y'||
'"',
               activate_flag => 'ACTIVATE',
                pinned =>FALSE);
procedure APP_NAVIGATE.EXECUTE(
function_name in varchar2,
open_flag in varchar2 default ’Y’,
session_flag in varchar2 default ’SESSION’,
other_params in varchar2 default NULL,
activate_flag in varchar2 default ’ACTIVATE’,
pinned in boolean default FALSE);
注意:
1当前用户具有对目标Form的访问权限;
2在目标和源窗体的WHEN–NEW–FORM–INSTANCE和WHEN–FORM–NAVIGATE triggers中需要添加APP_STANDARD.EVENT代码;
3使用APP_NAVIGATE.EXECUTE是需要在目标窗体的RESTART trigger添加处理重启的窗体的代码。
APP_NAVIGATE.EXECUTE和FND_FUNCTION.EXECUTE会将源window的位置、大小信息存储在下面4个全局变量中,以供目标窗体使用
? global.fnd_launch_win_x_pos
? global.fnd_launch_win_y_pos
? global.fnd_launch_win_width
? global.fnd_launch_win_height
APP_NAVIGATE.EXECUTE和FND_FUNCTION.EXECUTE区别在于:
FND_FUNCTION.EXECUTE
每次调用FND_FUNCTION.EXECUTE都会打开一个新的Form. instance,调用了几次,界面上就会出现几个目标窗体,执行查询的代码应写在WHEN–NEW–FORM–INSTANCE triggers中。
APP_NAVIGATE.EXECUTE
调用APP_NAVIGATE.EXECUTE会在目标窗体中引发下列事件:
(1) do_key(’clear_form’),捕获目标窗体中的为保存修改,提示用户;
(2)步骤1成功后,将传入的参数值赋给目标窗体
(3)执行trigger RESTART代码
在调用时,通常将查询代码写在RESTART trigger中,第一次调用不会触发目标Form中RESTART trigger代码,因此ORACLE建议可在在WHEN–NEW–FORM–INSTANCE triggers中添加第一次调用需执行代码;第二次以后调用,系统不会重新创建一个新的Form. instance,而是继续使用老的Form. instance,因此将不再触发目标窗体pre-form、when–new–form–instance triggers,也就是说无论该函数被调用了多少次,界面上只会有一个目标窗体。

分享到:
评论

相关推荐

    Form1调用Form2 ,From2回传值或调用Form1内的方法。

    这在开发GUI应用程序时尤为常见,例如一个窗体(Form1)打开另一个窗体(Form2),然后Form2执行某些操作并返回结果给Form1,或者调用Form1中的方法。这个过程可以通过多种方式实现,其中一种常见且灵活的方法是使用...

    Form2调用Form1控件的解决方案

    ### Form2调用Form1控件的解决方案 #### 背景与问题描述 在Windows Forms应用程序开发过程中,经常会遇到需要在不同的窗体之间进行交互的情况。例如,当用户在`Form1`上的一个按钮(假设为`Button1`)被点击时,会...

    form调用form

    在C#编程中,"form调用form"指的是在一个窗体(Form)中启动或与另一个窗体进行交互的操作。这种技术通常用于构建多窗体应用程序,其中不同的窗体负责不同的功能区域。以下是对这个主题的详细解释: 1. **窗体间的...

    jsp页面js调用form表单的值的方法

    ### JSP 页面中 JS 调用 Form 表单的值的方法 在 Web 开发中,JSP(Java Server Pages)是一种广泛使用的服务器端技术,它允许开发者将动态内容嵌入到静态 HTML 页面中。本篇文章主要介绍如何在 JSP 页面中通过 ...

    C#创建windows服务+Form+Web调用服务

    本项目"创建windows服务+Form+Web调用服务"结合了三种技术,旨在实现一个可以被用户界面(Form)和Web应用调用的后台服务。 1. **C# 创建 Windows 服务**: 在C#中,我们通常使用`System.ServiceProcess`命名空间...

    C# form1 ,form2 互相传值

    在C#编程中,Form1和Form2之间的数据传递是一个常见的需求,特别是在开发Windows桌面应用程序时。本主题将深入探讨如何在两个独立的窗体之间有效地传递数据,以实现Form1的TextBox控件值传递到Form2,以及Form2的...

    c#跨线程跨类调用窗体控件

    标题提到的“c#跨线程跨类调用窗体控件”是指在一个线程(非UI线程)中,通过另一个类来操作属于UI线程的窗体控件,比如`Form1`中的`ListBox1`。以下将详细阐述这个主题。 首先,理解C#中的线程概念是至关重要的。...

    Form窗体调用 C#

    2. **在Form1中调用Form2**: 在Form1中,我们可以创建一个按钮(Button),双击按钮以生成点击事件处理程序。在代码编辑器中,添加以下代码: ```csharp private void button1_Click(object sender, EventArgs e) {...

    ORACLE ebs FORM开发中form个性化处理

    在Oracle E-Business Suite (EBS) 中,Form开发是一个核心部分,用于构建企业级的业务应用程序。在实际应用中,往往需要根据不同用户或部门的需求进行定制化,以提高工作效率和用户体验。"ORACLE ebs FORM开发中form...

    c#在多线程中访问Form中控件的多种解决方案

    - 每次访问控件都需要判断当前线程是否为 UI 线程,并通过 `Invoke` 方法进行调用,可能会影响性能。 #### 解决方案三:使用 BackgroundWorker 组件 `BackgroundWorker` 是 .NET Framework 提供的一个用于执行后台...

    vb三个窗口操作相互调用

    例如,如果要从Form1调用Form2,可以在Form1的某个事件处理程序中写入`Form2.Show`,这样当触发该事件时,Form2将被显示出来。 - **Hide方法:** 当需要隐藏当前窗口并返回到上一个窗口时,可以使用`Form.Hide`方法...

    PB12.5 POST方式提交JSON或FORM-DATA到HTTP API

    Power Builder 12.5,使用ole MSXML2.ServerXMLHTTP方式,对接WEB API,以选用JSON和x-www-form-urlencoded方式提交数据,POST/GET方式均可。

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    浅谈C#跨线程调用窗体控件引发的线程安全问题 C#跨线程调用窗体控件时可能会引发线程安全问题,例如当多个线程操作同一个控件时,该控件可能会进入不一致的状态,出现争用情况和死锁等问题。因此,确保以线程安全...

    DELPHI 动态链接库封装窗体与调用的例子

    DELPHI 动态链接库封装窗体与调用的例子,可供学习DELPHI入门者使用,非常简单而实用。

    jQuery的ajax发送FormData的方式

    form id="form"> <input type="text" name="username"> <input type="file" name="file"> <input type="button" id="btn" value="提交"> </form> [removed][removed] [removed] ...

    用Delphi制作以浏览器为界面的应用程序—动态调用showform函数

    ### 使用 Delphi 开发基于浏览器的应用程序:动态调用 `ShowForm` 函数 #### 一、引言 随着互联网技术的发展,越来越多的应用程序倾向于采用Web界面的形式进行展示与交互,这种方式不仅便于用户访问,也简化了软件...

    Delphi 调用DLL文件中的FORM

    当DLL中包含有FORM(窗体)时,调用DLL文件中的FORM可以让应用程序在运行时加载并显示这部分界面。下面我们将详细探讨如何在Delphi中实现这个过程。 首先,理解DLL的基本概念。DLL是一种共享库,它包含可由多个程序...

    form调用

    在C#编程环境中,"form调用"是指创建和管理Windows Forms的应用程序。Windows Forms(简称WinForms)是.NET Framework提供的一种用户界面开发工具,它允许开发者构建具有丰富图形界面的桌面应用程序。在这个主题中,...

    C#调用Matlab画图,实现图形嵌入form的panel中

    C#调用Matlab画图,实现图形嵌入form的panel中 C#调用Matlab画图,实现图形嵌入form的panel中 C#调用Matlab画图,实现图形嵌入form的panel中 C#调用Matlab画图,实现图形嵌入form的panel中 C#调用Matlab画图,实现...

    从Oracle的FORM中调用REPORT.rar

    在Oracle的FORM应用开发中,调用REPORT是一个常见的任务,特别是在构建企业级应用程序时,报表功能对于数据的展示和分析至关重要。本知识点将详细讲解如何在Oracle Forms中集成和调用Oracle Reports,以便用户能够从...

Global site tag (gtag.js) - Google Analytics