[Dica] Porque criar Proc(button_proc), pck(DLL e Toolbar)?

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Hahu
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 147
Registrado em: Qui, 16 Mar 2006 11:26 am
Localização: São Paulo
O mundo gira muito!!

bom dia Amigos,

estou utilizando 4 pacotes e 2 procedimentos default:

vou deixar anexado abaixo, para ajudar nosso amigos do forum:

-- Procedure Button_proc

Selecionar tudo


-- if there are buttons called EXECUTE_QUERY and CANCEL_QUERY, this function shows
-- them, when the ENTER_QUERY button is pressed and hides them, when EXECUTE_- or 
-- CANCEL_QUERY ispressed. No error should be returned, if these buttons do not exist.
-- To make naming of the buttons easier, EXIT, QUIT and EXIT_FORM all perform exit_form,
-- even if the form is in ENTER-QUERY mode !!!!!!!
-- A CANCEL_QUERY button-name cancels a currently "open" query.

PROCEDURE button_proc IS
  action varchar(80);

  -- hide a button (for ENTER_-, EXECUTE_- or CANCEL_QUERY)
  PROCEDURE show_off(item_name VARCHAR2) IS
  BEGIN
    IF NOT Id_Null(Find_Item(item_name)) THEN
      Set_Item_Property(item_name, DISPLAYED,PROPERTY_FALSE);
    END IF;
  END;

  -- try to show a button (for the two query-states. If there is no button to show,
  -- return FALSE to the calling procedure.
  FUNCTION show_on(item_name VARCHAR2) RETURN BOOLEAN IS
  BEGIN
    IF NOT Id_Null(Find_Item(item_name)) THEN
      Set_Item_Property(item_name,DISPLAYED,PROPERTY_TRUE);
      Set_Item_Property(item_name,ENABLED,PROPERTY_TRUE);
      RETURN TRUE;
    ELSE
      RETURN FALSE;
    END IF;
  RETURN NULL; END;

BEGIN    
  action := Get_Item_Property(NAME_IN('SYSTEM.TRIGGER_ITEM'),ITEM_NAME);
  IF action = 'ENTER_QUERY' THEN
    -- only hide the ENTER_QUERY button, if there are EXECUTE_QUERY and (!!) CANCEL_QUERY
    -- buttons. Otherwise an existing EXECUTE_QUERY button will be shown.
    IF show_on('EXECUTE_QUERY') AND show_on('CANCEL_QUERY') THEN
      show_off('ENTER_QUERY');
    END IF;
  END IF;
  IF action IN ('EXIT_FORM', 'EXIT','QUIT') THEN
    action := 'EXIT_FORM';
    IF NAME_IN('SYSTEM.MODE')='ENTER-QUERY' THEN
      Do_Key('EXIT_FORM');
    END IF;
  END IF;
  IF action = 'CANCEL_QUERY' THEN 
    action := 'EXIT_FORM';
  END IF;
  Do_Key(action);
  IF NAME_IN('SYSTEM.MODE') != 'ENTER-QUERY' THEN
    IF show_on('ENTER_QUERY') THEN
      show_off('EXECUTE_QUERY');
      show_off('CANCEL_QUERY');
    END IF;
  END IF;
END;
-- DLL especificação

Selecionar tudo


PACKAGE dll IS
  FUNCTION tblen(str IN VARCHAR2) RETURN PLS_INTEGER;
END;

-- DLL corpo

Selecionar tudo

PACKAGE BODY DLL IS

  l_user Ora_Ffi.LibHandleType;
  l_gdi  Ora_Ffi.LibHandleType;
  f_getdc  Ora_Ffi.FuncHandleType;
  f_reldc  Ora_Ffi.FuncHandleType;
  f_setmap Ora_Ffi.FuncHandleType;
  f_gte    Ora_Ffi.FuncHandleType;

  FUNCTION icd_GetDC(f_getdc IN Ora_Ffi.FuncHandleType,
                     hwnd IN PLS_INTEGER)
    RETURN PLS_INTEGER;
  PRAGMA INTERFACE(C, icd_GetDC, 11265);

  FUNCTION icd_ReleaseDC(f_reldc IN Ora_Ffi.FuncHandleType,
                         hwnd IN PLS_INTEGER,
                         hdc IN PLS_INTEGER)
    RETURN PLS_INTEGER;
  PRAGMA INTERFACE(C, icd_ReleaseDC, 11265);

  FUNCTION icd_SetMapMode(f_setmap IN Ora_Ffi.FuncHandleType,
                          hdc IN PLS_INTEGER,
                          mm  IN PLS_INTEGER)
    RETURN PLS_INTEGER;
  PRAGMA INTERFACE(C, icd_SetMapMode, 11265);

  FUNCTION icd_GetTextExtent(f_gte IN Ora_Ffi.FuncHandleType,
                             hdc IN PLS_INTEGER,
                             str IN OUT VARCHAR2,
                             len IN PLS_INTEGER)
    RETURN PLS_INTEGER;
  PRAGMA INTERFACE(C, icd_GetTextExtent, 11265);

  FUNCTION tblen(str IN VARCHAR2) RETURN PLS_INTEGER IS
    hwnd    PLS_INTEGER := Get_Window_Property('Window0',Window_Handle);
    hdc     PLS_INTEGER := 0;
    buf     PLS_INTEGER;
    len     PLS_INTEGER   := NVL(length(str), 0);
    oldmap  PLS_INTEGER;
    dummy   PLS_INTEGER;
    s VARCHAR2(255) := rpad(str,255);
    s_width PLS_INTEGER;
  BEGIN
    hdc     := icd_GetDC(f_getdc,hwnd);			-- Get device context.
    oldmap  := icd_SetMapMode(f_setmap, hdc, 6);	-- Change mapping to MM_TWIPS (~inch) 
							-- Set to 1 for MM_TEXT (~pixel) and
							-- change scaling in TOOLBAR package
							-- if forms module runs in REAL PIXEL
    s_width := icd_GetTextExtent(f_gte, hdc, s, len);	-- retrieve width of text from GDI
    dummy   := icd_SetMapMode(f_setmap, hdc, oldmap);	-- reset mapping mode
    dummy   := icd_ReleaseDC(f_reldc, hwnd, hdc);	-- release deviec context
    return(s_width);
  END;

BEGIN
break;
  l_user  := Ora_Ffi.Register_Library('c:\windows\system\','USER.EXE');
  l_gdi   := Ora_Ffi.Register_Library('c:\windows\system\','GDI.EXE');

  f_getdc := Ora_Ffi.Register_Function(l_user,'GetDC', ORA_FFI.PASCAL_STD);
  f_reldc := Ora_Ffi.Register_Function(l_user,'ReleaseDC', ORA_FFI.PASCAL_STD);

  f_setmap := Ora_Ffi.Register_Function(l_gdi,'SetMapMode',ORA_FFI.PASCAL_STD);
  f_gte    := Ora_Ffi.Register_Function(l_gdi,'GetTextExtent', ORA_FFI.PASCAL_STD);

  Ora_Ffi.Register_Return(f_getdc, ORA_FFI.C_INT);
  Ora_Ffi.Register_Parameter(f_getdc, ORA_FFI.C_INT);

  Ora_Ffi.Register_Return(f_reldc, ORA_FFI.C_INT);
  Ora_Ffi.Register_Parameter(f_reldc, ORA_FFI.C_INT);
  Ora_Ffi.Register_Parameter(f_reldc, ORA_FFI.C_INT);

  Ora_Ffi.Register_Return(f_setmap, ORA_FFI.C_INT);
  Ora_Ffi.Register_Parameter(f_setmap, ORA_FFI.C_INT);
  Ora_Ffi.Register_Parameter(f_setmap, ORA_FFI.C_INT);

  Ora_Ffi.Register_Return(f_gte, ORA_FFI.C_INT);
  Ora_Ffi.Register_Parameter(f_gte, ORA_FFI.C_INT);
  Ora_Ffi.Register_Parameter(f_gte, ORA_FFI.C_CHAR_PTR);
  Ora_Ffi.Register_Parameter(f_gte, ORA_FFI.C_INT);
END;
-- Toolbar especificação

Selecionar tudo


PACKAGE toolbar IS

  tbscale NUMBER := 43;		-- good for 1024x768 (SVGA)
--  tbscale NUMBER := 40;	-- good for 640x480 (VGA)
  item_name VARCHAR2(80);
  PROCEDURE hide_function;
  PROCEDURE set_timer;
  PROCEDURE show_function;

END;

-- Toolbar corpo

Selecionar tudo

PACKAGE BODY TOOLBAR IS

  cs VARCHAR2(20);
  csscale NUMBER;

  PROCEDURE hide_function IS
  BEGIN
    Set_Item_Property('TOOLBAR.TEXT',DISPLAYED,PROPERTY_OFF);
    Clear_Message;
    IF NOT Id_Null(Find_Timer('ENTER_TOOLBAR')) THEN
      Delete_Timer('ENTER_TOOLBAR');
    END IF;
  END; /* hide_function */

  PROCEDURE set_timer IS
    t Timer;
  BEGIN
    toolbar.item_name := :SYSTEM.MOUSE_ITEM;
    IF NOT Id_Null(Find_Timer('ENTER_TOOLBAR')) THEN
      Delete_Timer('ENTER_TOOLBAR');
    END IF;
    t := Create_Timer('ENTER_TOOLBAR',250,NO_REPEAT);
  END; /* set_timer */

  PROCEDURE show_function IS
    w_base number := 20/4;
    w NUMBER;
    msg varchar2(200);
  BEGIN
    :TOOLBAR.Text := Get_Item_Property(item_name, LABEL);
    msg := Get_Item_Property(item_name,HINT_TEXT);
    w := trunc(w_base * NVL(length(:toolbar.text), 0) - (25 * (NVL(length(:toolbar.text), 0)/20)));
--    w := dll.tblen(:toolbar.text)*tbscale/100000*csscale;
    Set_Item_Property('TOOLBAR.TEXT',WIDTH,w);
    Set_Item_Property('TOOLBAR.TEXT',POSITION,
                       to_number(Get_Item_Property(item_name,X_POS)),
                       to_number(Get_Item_Property(item_name,Y_POS)) +
                       to_number(Get_Item_Property(item_name,HEIGHT)));
    Set_Item_Property('TOOLBAR.TEXT',DISPLAYED,PROPERTY_ON);
    Message(msg);
  END; /* show_function */

BEGIN
  cs := Get_Form_Property(Get_Application_Property(CURRENT_FORM_NAME),COORDINATE_SYSTEM);
  IF    cs = 'INCHES'      THEN csscale := 1;
  ELSIF cs = 'PIXELS'      THEN csscale := 120;
  ELSIF cs = 'POINTS'      THEN csscale := 72;
  ELSIF cs = 'CENTIMETERS' THEN csscale := 2.56;
  ELSIF cs = 'CHARACTER_CELL' THEN
    csscale := Get_Form_Property(Get_Application_Property(CURRENT_FORM_NAME),CHARACTER_CELL_WIDTH);
    csscale := 140/csscale;
  END IF;
END;
-- l_mensagem

Selecionar tudo


PROCEDURE l_mensagem(as_mensagem VARCHAR2) IS
	ls_dummy	VARCHAR2(002) ;
BEGIN
	SET_ALERT_PROPERTY('MENSAGEM', ALERT_MESSAGE_TEXT, as_mensagem) ;
	ls_dummy := SHOW_ALERT('MENSAGEM') ;
END;

*** Isto ajuda a criar o forms e facilita na montagens de elaborar mensagems

Abs Hahu

Que Deus abençõe a todos! :)
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 15 visitantes