Clipper On Line • Ver Tópico - DIFICIL APRENDIZADO - Aula 08

DIFICIL APRENDIZADO - Aula 08

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

 

DIFICIL APRENDIZADO - Aula 08

Mensagempor rochinha » 14 Nov 2004 21:10

Amiguinhos

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:

Imagem
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.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Difícil Aprendizado-Aula08

Mensagempor JBPEDROSA » 22 Jul 2010 17:19

Meu bom amigo Rochinha, boa tarde!

Venho aqui de novo a pedir sua generosa ajuda. Estou tentando compilar (e aprender) os exemplos das suas ótimas aulas. Foi tudo muito bem até a aula07, mas a seguinte, aula08, está dando erro. O código dela foi simplesmente copiado e colado no Notepad. Procurando por algum engano nesse código, observo que algumas chamadas as funções Mdichild não estão com o parâmetro (oWnd), base para o tamanho de todas as janelas da aplicação.

Se o amigo concluir que o código não tem erros ou enganos, creio que terei que mudar de compilador/link (Clipper3 / Blinker 7). O Blinker 7, onde o encontro? Agradeço muito sua colaboração, que é um trabalho muito bom para todos que querem aprender FiveWin. Um abraço do amigo João Batista.
JBPEDROSA
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 22
Data de registro: 04 Dez 2008 19:01
Cidade/Estado: RIO DE JANEIRO, RJ
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: DIFICIL APRENDIZADO - Aula 08

Mensagempor Euclides » 23 Jul 2010 20:13

João Batista,
Mostre os erros que V. está encontrando...
Compilei a AULA08 normalmente.
no aguardo...
Euclides
Euclides
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 154
Data de registro: 12 Mai 2007 14:07
Cidade/Estado: São Paulo, Capital
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Re: DIFICIL APRENDIZADO - Aula 08

Mensagempor rochinha » 24 Jul 2010 21:33

Amiguinho,

Fiz pequenas alterações no código de forma que se apresente melhor nas visualizações em telas com dimensões diferentes e de quebra apresento como fazer uso desta caracteristica.

A primeira alterações foi abrir os arquivos no inicio da aula para não ocasionar erros enquanto forem procedidas varias aberturas.
   USE AULA07 NEW SHARED
   USE AULA07 NEW SHARED ALIAS AULA072


Segunda providencia PUBLICar a variavel oWnd para navegar o objeto pela aplicação:
   public oWnd


Terceira providencia, ajustar a propriedade de duplo clique do browse para uso com TWBrowse. O Fivewin usa oBrw:bLDblClicked enquanto o TWBrowse usa oBrw:bLDblClick:
   oBrw:bLDblClick    := {|| oBrw:disable(), MsgStop("Duplo Clique - Abrir um Dialog ou executar uma rotina"), oBrw:enable() }


Quarta providencia, modificar o ajuste do browse em relação ao tamanho da janela principal:
   ACTIVATE WINDOW oWnd1 MAXIMIZED ON RESIZE oBrw:SetSize( oWnd1:nWidth - 5, oWnd1:nHeight - 55 )

Os numeros 5 e 55 são a diferença entre as bordas e a barra de status para apresentar o browse dentro da área de trabalho da janela.

Codigo completo:
#include "fivewin.ch"

function main()
   public oWnd
   USE AULA07 NEW SHARED
   USE AULA07 NEW SHARED ALIAS AULA072
   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( oWnd )
                  MENUITEM "Excluir"   ACTION MDIChild2( oWnd )
                  SEPARATOR
                  MENUITEM "Consultar" ACTION MDIChild2( oWnd )
               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
   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
   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 100,100 // oWnd:nWidth()-5,oWnd:nHeight()-125

   oBrw:nLineHeight*= 1                                                 
   oBrw:nHeaderHeight*= 1.5
   oBrw:bRClicked     := { | nRow, nCol | PopupReg( nRow, nCol, oBrw, oWnd1 ) }
   oBrw:bLDblClick    := {|| 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   := .t.                                                           
   oBrw:nLineStyle    := 2

   ACTIVATE WINDOW oWnd1 MAXIMIZED ON RESIZE oBrw:SetSize( oWnd1:nWidth - 5, oWnd1:nHeight - 55 )
   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
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Re: DIFICIL APRENDIZADO - Aula 08

Mensagempor JBPEDROSA » 26 Jul 2010 17:34

Meu bom amigo Euclides, boa tarde! Muito grato por sua atenção!

Acabo de compilar novamente o AULA08 do Rochinha, já com todas as modificações que ele postou acima. A compilação foi rápida e não acusou erros. Executando, aabre-se a janela principal, mas qualquer tentativa de abrir outra janela trava o programa com uma janela de erros do Clipper.
Cara, não sei mais o que fazer!... Estou enviando anexo o Arquivo Error.log para dar a você a dimensão do problema.

Como o amigo disse que compilou normalmente o Aula08, pergunto se a execução do programa também foi normal. Será que estou omitindo algum pré-requesito ou trabalhando com vrsões incompativeis de compilador e linker? Fico na expectativa de algum HELP!

JBPEDROSA - Notebook Positivo Mobile - Win XP SP3 - Clipper52e / Blinker55 - Vriáveis de Ambiente e de Usuário setadas para o Clipper(Lib, Bin, Include)
Anexos
Error.txt
(3.96 KiB) Baixado 151 vezes
JBPEDROSA
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 22
Data de registro: 04 Dez 2008 19:01
Cidade/Estado: RIO DE JANEIRO, RJ
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Re: DIFICIL APRENDIZADO - Aula 08

Mensagempor Euclides » 27 Jul 2010 08:42

...é Sr. JBPEDROSA... bemvindo ao mundo FIVEWIN :-))
O amiguinho Rochinha está utilizando um TWBrowse modificado, e os comandos:
oBrw:nLineHeight*= 1
oBrw:nHeaderHeight*= 1.5
não são suportados na versão normal do FiveWin.
Basta eliminá-los que será utilizado a altura padrão para as linhas.
Coloque os próximos erros que encontrar...
Boa sorte!
Euclides
Euclides
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 154
Data de registro: 12 Mai 2007 14:07
Cidade/Estado: São Paulo, Capital
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Re: DIFICIL APRENDIZADO - Aula 08

Mensagempor rochinha » 27 Jul 2010 09:33

Amiguinho,

A indicação no arquivo de erros da WOWEXEC indica que voce esta usando a versão 16bits e portanto uma versão na qual o TWbrwose ainda não tenha recebido novos recursos.

Como prática, ao se adaptar um código é possivel desabilitar algumas linhas e ir testando, portanto, desabilite as linhas:
...
oBrw:nLineHeight*= 1                                                 
   oBrw:nHeaderHeight*= 1.5
   oBrw:bRClicked     := { | nRow, nCol | PopupReg( nRow, nCol, oBrw, oWnd1 ) }
   oBrw:bLDblClick    := {|| 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   := .t.                                                           
   oBrw:nLineStyle    := 2
...


Habilite uma a uma e verifique quais são reconhecidas e deixe-as ativas.

Caso sua versão de Fivewin seja mesmo 16bits agregue esta biblioteca ao .BAT de compilação para dar suporte aos parametros acima.

twbrw16.lib (retire o .ZIP)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes




Retornar para FiveWin

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro