Porque meus browse não podem ser mais bonitos que os outros?
Porque é necessários garimpar entre os métodos e propriedades das classes de 5Win para descobrir alguns segredinhos.
E Nesta aula irei reforçar a aula anterior melhorando em muito o aspecto do browse de nossa aplicação.
O resultado deverã ser igual ao da figura abaixo:
Figura 08
Digite o código abaixo em um arquivo e de-lhe o nome de AULA08.PRG e compiLe utilizando o BUILD.BAT:
C:\>BUILD AULA08
#include "fivewin.ch"
function main()
local oWnd
DEFINE WINDOW oWnd TITLE "Janela principal" ;
FROM 5, 5 TO 24, 64 ;
MENU Menu() ;
MDI
DEFINE BUTTONBAR oBar OF oWnd
DEFINE BUTTON OF oBar FILE "exit.bmp" ;
ACTION oWnd:end() ;
MESSAGE "Fecha este aplicativo..." ;
TOOLTIP "Fecha este aplicativo."
DEFINE BUTTON OF oBar GROUP FILE "Open.bmp" ;
ACTION MDIChild( oWnd ) ;
MESSAGE "Abre um browse normal..." ;
TOOLTIP "Abre um browse normal."
DEFINE BUTTON OF oBar FILE "cut.bmp" ;
ACTION MDIChild2( oWnd ) ;
MESSAGE "Abre um browse com botões..." ;
TOOLTIP "Abre um browse com botões."
SET MESSAGE OF oWnd TO "Forum Clipper-On-Line" KEYBOARD DATE CLOCK
ACTIVATE WINDOW oWnd
return nil
FUNCTION Menu()
local oMenu, oMenu1, oMenu2
local oSub1,oSub2,oSub3
MENU oMenu
MENUITEM oMenu1 PROMPT "Opcao &1"
MENU
MENUITEM "&Clientes"
MENU
MENUITEM "Incluir" ACTION MDIChild()
MENUITEM "Excluir" ACTION MDIChild()
SEPARATOR
MENUITEM "Consultar" ACTION MDIChild()
ENDMENU
MENUITEM "&Fornecedores"
MENU
MENUITEM "Incluir" ACTION MDIChild2()
MENUITEM "Excluir" ACTION MDIChild2()
SEPARATOR
MENUITEM "Consultar" ACTION MDIChild2()
ENDMENU
ENDMENU
MENUITEM oMenu2 PROMPT "Opcao &2" DISABLED
MENU
MENUITEM "Item 1" DISABLED ACTION MDIChild()
MENUITEM "Item 2" DISABLED ACTION MDIChild()
ENDMENU
ENDMENU
return oMenu
function MDIChild()
local oWnd1, oBrw
USE AULA07 NEW SHARED
DEFINE WINDOW oWnd1 TITLE "Janela Normal" MDICHILD ;
FROM 1, 1 TO 10, 30
@ 0,0 LISTBOX oBrw FIELDS OF oWnd1 SIZE 225,115
ACTIVATE WINDOW oWnd1
return nil
function MDIChild2( oWnd )
local oWnd1, oBrw
USE AULA07 NEW SHARED ALIAS AULA072
DEFINE WINDOW oWnd1 TITLE "Janela MDI" MDICHILD ;
FROM 1, 1 TO 10, 30
DEFINE BUTTONBAR oBar1 OF oWnd1
DEFINE BUTTON OF oBar1 FILE "exit.bmp" ;
ACTION MsgInfo( "Coloque uma chamada a uma rotina" ) ;
MESSAGE "Coloque aqui uma mensagem..." ;
TOOLTIP "Sou uma dica rapida para este controle."
DEFINE BUTTON OF oBar1 FILE "Open.bmp" ;
ACTION MsgInfo( "Coloque uma chamada a uma rotina" ) ;
MESSAGE "Coloque aqui uma mensagem..." ;
TOOLTIP "Sou uma dica rapida para este controle."
@ 2,0 LISTBOX oBrw FIELDS OF oWnd1 SIZE oWnd:nWidth()-5,oWnd:nHeight()-125
oBrw:nLineHeight*= 1
oBrw:nHeaderHeight*= 1.5
oBrw:bRClicked := { | nRow, nCol | PopupReg( nRow, nCol, oBrw, oWnd1 ) }
oBrw:bLdblClicked := {|| oBrw:disable(), MsgStop("Duplo Clique - Abrir um Dialog ou executar uma rotina"), oBrw:enable() }
oBrw:bBKColor := { |nRow,nCol,nStyle| if( nStyle==0 .and. nCol==5, nRGB(255,255,255), ) }
oBrw:nFreeze := 2
oBrw:nClrPane := { || IIF( ( oBrw:cAlias)->(Recno()) %2 == 1, nRGB(187,254,138),nRGB(226,255,196))}
oBrw:lAdjLastCol := .F.
oBrw:nLineStyle := 2
ACTIVATE WINDOW oWnd1 MAXIMIZED
return nil
static function PopupReg( nRow, nCol, oLbx, oWnd )
local oPopup
MENU oPopup POPUP
MENUITEM "&Inserir registro " ACTION MsgStop( "Abrir um Dialog, efetuar uma operacao ou rotina" )
MENUITEM "E&xcluir registro " ACTION MsgStop( "Abrir um Dialog, efetuar uma operacao ou rotina" )
MENUITEM "&Alterar registro " ACTION MsgStop( "Abrir um Dialog, efetuar uma operacao ou rotina" )
SEPARATOR
MENUITEM "&Desbloquear registro" ACTION MsgStop( "Abrir um Dialog, efetuar uma operacao ou rotina" )
SEPARATOR
MENUITEM "&Sair" ACTION oLbx:oWnd:End()
ENDMENU
ACTIVATE POPUP oPopup AT nRow, nCol OF oLbx
return nil
Serão necessários também os DBFs apresentados abaixo:
Aula07.dbf.zip (renomeie e retire o .zip)
Explicando o que foi modificado:
A função MDIChild já inicia recebendo como parâmetro o objeto oWnd, que é nossa janela principal, a que irá nos fornecer suas medidas.
function MDIChild2( oWnd )
Com o objeto oWnd em mãos poderemos saber sua largura para dimensionar o LISTBOX:
@ 2,0 LISTBOX oBrw FIELDS OF oWnd1 SIZE oWnd:nWidth()-5,oWnd:nHeight()-125
Os valores 5 e 125 são os descontos dos controles SCROLLBAR e BUTTONBAR.
Quanto as propriedades de nosso objeto LISTBOX que foram alteradas vejam:
Altura de cada linha do browse, neste caso 1 linha.
oBrw:nLineHeight*= 1
Altura da linha de cabeçalho do browse, neste caso 1,5 linha.
oBrw:nHeaderHeight*= 1.5
Foi configurado o botão direito do mouse para abrir o menu de contexto.
oBrw:bRClicked := { | nRow, nCol | PopupReg( nRow, nCol, oBrw, oWnd1 ) }
Foi configurado o botão esquerdo do mouse para abrir um diálogo, executar uma rotina ou operação.
oBrw:bLdblClicked := {|| oBrw:disable(), MsgStop("Duplo Clique - Abrir um Dialog ou executar uma rotina"), oBrw:enable() }
Aqui foi definido que a coluna 5 tera cor branca.
oBrw:bBKColor := { |nRow,nCol,nStyle| if( nStyle==0 .and. nCol==5, nRGB(255,255,255), ) }
Aqui foi definido que as duas primeira colunas nunca se moverão ao usar setas direcionais.
oBrw:nFreeze := 2
Aqui foi definido o efeito zebrado. Usei Recno() para uma tabela sem indices. Para tabelas com indices é necessário utilizar uma função que devolva o valor exato da posição do registro que Clipper 5.3 existe a OrdKeyNO(), já em Clipper 5.2e não sei qual usar e talvez só exista uma similar a OrdKeyNo() se usarmos CDX.
oBrw:nClrPane := { || IIF( ( oBrw:cAlias)->(Recno()) %2 == 1, nRGB(187,254,138),nRGB(226,255,196))}
Libera o ajuste da ultima coluna do LISTBOX desligando-a do SCROLLBAR, pois ela tem um defeito de esticar quando vamos muito para direita e além da ultima coluna.
oBrw:lAdjLastCol := .F.
Tá ficando bom.
Até a próxima.