Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343235
  • 博文数量: 25
  • 博客积分: 3011
  • 博客等级: 中校
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-28 13:22
个人简介

生命在于折腾

文章分类

全部博文(25)

文章存档

2015年(1)

2011年(3)

2010年(4)

2009年(17)

我的朋友

分类: 敏捷开发

2009-09-18 13:26:06

曾于无意之中发现,SAP系统中有个名为CL_GUI_TIMER的类,测试下来发现还是挺好用的,比网上那些自动刷新的例子直观多了。这里我们就做个演示实例。
先做好准备工作:建立程序z04_gui_timer及其屏幕0100,屏幕上画个CUSTOM CONTAINER作为ALV的容器。顺便可以画个退出按钮用于退出界面,这样就省得SET PF-STATUS了。
 
下面就是我们的程序代码了,其实还是挺简单的:
 
REPORT  z04_gui_timer.
 
CLASS lcl_event_handler DEFINITION DEFERRED.
 
DATA: ok_code LIKE sy-ucomm,
      go_timer TYPE REF TO cl_gui_timer,
      go_evt_hndl TYPE REF TO lcl_event_handler.
DATA: gt_spfli TYPE TABLE OF spfli,
      go_grid TYPE REF TO cl_gui_alv_grid,
      go_container TYPE REF TO cl_gui_custom_container.
 
START-OF-SELECTION.
  CALL SCREEN 0100.
 
****** Module  status_9000  OUTPUT
MODULE status_0100 OUTPUT.
  DATA: g_init TYPE flag.
  CLEAR ok_code.
  IF g_init IS INITIAL.
    g_init = 'X'.
    PERFORM init_0100.
  ENDIF.
ENDMODULE.                 " status_0100  OUTPUT
 
****** Module user_command_0100 INPUT
MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.                 " user_command_0100  INPUT
 
****** CLASS lcl_event_handler DEFINITION
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS:
      handle_timer FOR EVENT finished OF cl_gui_timer.
ENDCLASS.                    "lcl_event_handler DEFINITION
 
****** CLASS lcl_event_handler IMPLEMENTATION
CLASS lcl_event_handler IMPLEMENTATION.
  METHOD handle_timer.
    DELETE gt_spfli INDEX 1.
    CALL METHOD go_grid->refresh_table_display.
*   CALL METHOD go_timer->cancel
*     EXCEPTIONS
*       OTHERS = 9.
    CALL METHOD go_timer->run "必须重新激活定时器
      EXCEPTIONS
        OTHERS = 9.
  ENDMETHOD.                    "handle_timer
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION
 
****** Form  init_0100
FORM init_0100.
  SELECT * INTO TABLE gt_spfli
    FROM spfli UP TO 30 ROWS.
  CREATE OBJECT go_container
    EXPORTING
      container_name = 'CC_ALV'.
  CREATE OBJECT go_grid
    EXPORTING
      i_parent = go_container.
  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      i_structure_name = 'SPFLI'
    CHANGING
      it_outtab        = gt_spfli.
 
  CREATE OBJECT go_evt_hndl.
  CREATE OBJECT go_timer
    EXCEPTIONS
      OTHERS = 9.
  SET HANDLER go_evt_hndl->handle_timer FOR go_timer.
  go_timer->interval = 3. "设置间隔为3秒
  CALL METHOD go_timer->run
    EXCEPTIONS
      OTHERS = 9.
ENDFORM.                  " init_0100
 
说明:
(1) lcl_event_handler是自定义的类,用于处理cl_gui_timer的EVENT ‘finished’;
(2) 定时器的用法与VC、DELPHI有所不同,上次定时事件处理完毕后,必须CALL METHOD go_timer->run重新激活,如此循环;
(3) 定时器并不会自动触发PAI事件,如有必要则可以在handle_timer中CALL METHOD cl_gui_cfw=>set_new_ok_code来触发;
(4) 虽然我们的例子是基于screen的,但是基于List也是完全可行的。
阅读(6910) | 评论(10) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2011-08-25 18:01:35

N久之后才发现你写的这东西有一定实用价值,顶晚了. 认识的,嘿嘿

chinaunix网友2010-07-27 09:58:44

哈哈,正是我需要的

chinaunix网友2010-05-04 14:43:55

好像很难控制刷新间隔。我设置成INTERVAL = 1 但是实际效果却是间隔3,4秒更新一次。 是不是网速的关系?

chinaunix网友2009-09-25 11:40:22

请注明版本.46c是不行的

chinaunix网友2009-09-19 13:36:18

受教了,sap的定时器每次处理完重新激活这种做法比较适合大负载的工作,不用担心浪费系统资源