01.Blogs :
EmersonReed  
Nova versão do ThemedControls (3.1.0)
Thursday, March 27, 2008 2:22 PM

Hoje eu postei uma nova versão do ThemedControls (3.1.0) no site do VFPX.

Você pode baixa-la aqui.

Mudanças nesta versão:

  • OutlookNavBar
    - Implementadas várias sugestões;
    - Agora funciona em barras de ferramentas (toolbars).

  • ToolBox (Novo controle)
    - Similar à nova ToolBox do VFP;
    - Compatível com os temas do Outlook (igualzinho ao OutlookNavBar);
    - Permite navegação através do teclado.

  • ZoomNavBar
    - Implementadas várias sugestões;
    - Agora funciona em barras de ferramentas (toolbars);
    - Adicionado o efeito de reflexo;
    - Adicionado um balão para exibir a descrição do botão;
    - Adicionada a capacidade de exibir um menu quando o botão é clicado.

Atualmente estou criando um help para esta nova versão. Assim que possível, irei posta-lo. Fique ligado!

Se você tiver dúvidas, sugestões ou quiser relatar algum erro, por favor, entre em contato comigo.

Algumas implementações nesta versão não poderiam ter sido desenvolvidas sem a ajuda e as grandes idéias de alguns amigos: Bernard Bout, César Chalom e Carlos Alloatti.

Obrigado amigos!

Veja alguns screenshots...

  

0 Comments | Post a Comment |

posted  by  EmersonReed  with 

Outlook2003Bar Versão 1.0.1, um projeto VFPX
Thursday, October 26, 2006 3:27 PM

Disponibilizei uma nova versão do controle Outlook2003Bar no VFPX.
Baixe aqui.

Esta versão contém correções de pequenos erros e algumas e algumas alterações na ajuda.

Leia o arquivo de ajuda na pasta Outlook2003Bar\VCX para saber como utilizar o controle.

Por favor, comentem, enviem sugestões ou solicitem correções de erros.

VFP rocks!


Este controle é parte do VFPX, um esforço da Comunidade Visual FoxPro em criar add-ons de código aberto para o Visual FoxPro 9.0.

 

0 Comments | Post a Comment |

posted  by  EmersonReed  with 

O controle Outlook2003Bar agora faz parte do VFPX!
Thursday, October 05, 2006 3:26 PM
Como todos puderam acompanhar nos meus posts anteriores, em julho eu comecei a desenvolver um controle (totalmente em VFP) que tem as mesmas funcionalidades e aparência da barra de atalhos do Microsoft Outlook 2003.
Após alguns dias de desenvolvimento, disponibilizei uma versão beta do controle, esperando um retorno da comunidade VFP.
Como o retorno foi positivo, me empenhei em melhora-lo e, um mês depois (em agosto), o controle estava pronto.
Novamente, disponibilizei-o e fiz a divulgação em um conhecido site sobre VFP.
A repercussão foi tanta, que o controle já foi baixado mais de 3.000 vezes!
A intenção, desde o início, foi contribuir com a comunidade VFP, comunidade esta que sempre me ajudou.
Foi então que, para dar ainda mais visibilidade e para que todos tivessem acesso aos fontes, submeti o projeto aos administradores do VFPX.
O VFPX é uma iniciativa de alguns membros da comunidade VFP (citada inclusive numa das cartas do responsável pela equipe de desenvolvimento do VFP) em criar "add-ins" de código aberto, complementando os esforços da Microsoft juntamente com o projeto de codinome Sedna, para estender as funcionalidades do VFP9.
O projeto foi aprovado e recebeu muitos elogios dos administradores do VFPX (membros reconhecidos na comunidade: Craig Boyd, Doug Hennig e Rick Schummer) pela sua facilidade de uso e legibilidade do código fonte.
Agora, o controle Outlook2003Bar é parte integrante do VFPX e qualquer membro da comunidade pode dar sugestões, testar, solicitar correção de erros ou até mesmo participar do desenvolvimento!
 
Depoimentos:
 
Thanks for doing such a fine job on the Outlook 2003-styled Listbar.
It's very polished and it is simple to use (given your use of pageframe and pages with just a few simple properties to set).
I look forward to seeing more of your work.
I am quite impressed.

Craig Boyd (CEO da SweetPotato Software, Inc. e Administrador do VFPX)
 
We think you and your team will do some really great things with this project, and provide a great deal of value for the Visual FoxPro Community.
Rick Schummer (Administrador do VFPX)
 
O projeto "Outlook2003Bar" do nosso colega Emerson Santon Reed acaba de ser aprovado e incluído ao VFP-X.
Isso confirma a excelente idéia e ótima qualidade na execução do projeto que o Emerson lidera, ratificando todos os elogios que a classe tem recebido.
Estando no VFP-X, garante visibilidade ao projeto, abrindo-o para receber a contribuição da comunidade.
Parabéns Emerson !

César Chalom (membro da equipe de desenvolvedores VFPX e do Grupo FoxBrasil)
 
Links:
 
VFPX
A Visual FoxPro Community effort to create open source add-ons for Visual FoxPro 9.0. The code, classes, and libraries made available here will complement Microsoft's continuing efforts to improve and extend Visual FoxPro with the code named Sedna project which is outlined at http://msdn.com/vfoxpro/roadmap
 
Foxite
Home of the Visual FoxPro Experts
 
Universal Thread
Worldwide Developers Community
 

0 Comments | Post a Comment |

posted  by  EmersonReed  with 

Um exemplo de como adicionar funcionalidades ao Report Listener
Thursday, September 14, 2006 9:56 AM

O VFP 9 introduziu uma nova engrenagem de relatórios baseada em listeners (saída assistida por objeto).

Os listeners podem ser customizados de várias formas e há muitas coisas espetaculares que você pode fazer com eles.

Combinando o poder da GDI+ com listeners customizados você pode aumentar bastante a capacidade dos relatórios.

Mostrarei como você pode customizar o Report Listener para criar uma marca d'água em todas as páginas do relatório e como você pode customizar o Report Preview para mudar o texto dos botões da barra de ferramentas da janela de visualização de relatórios e como exibi-la maximizada.

Set Classlib To (Addbs(Home()) + "FFC\_GDIPlus.vcx") Additive

* Cria um objeto Report Listener
Local loReportListener
loReportListener = Newobject("MyReportListener")
With loReportListener
   .ListenerType = 1 && Visualizar
   * Configura as propriedades da marca d'água: texto, fonte e estilo
   .cWatermark = "Watermark demo"
   .cFontName = "Verdana"
   .nFontStyle = 1 && Negrito
Endwith

* Cria um cursor que será utilizado como fonte de dados do relatório e insere alguns registros
Create Cursor curTest (field1 c(100))
Local i
For i=1 To 640
   Insert Into curTest Values (Str(i)+" test, test, test, test, test, test, test, test, test, test, test, test, test")
Endfor
Select curTest
Go Top

* Cria um relatório
Create Report Test From curTest

* Executa o relatório usando a nova engrenagem de relatório (saída assistida por objeto)
Report Form Test Object loReportListener

* Fecha o cursor e exclui o relatório
Use In curTest
Delete File Test.fr?
Return

* Cria uma classe derivada da classe base _ReportListener e adiciona algumas funcionalidades
Define Class MyReportListener As _ReportListener Of Addbs(Home()) + "FFC\_ReportListener.VCX"
   * Propriedades internas de uso da classe
   Hidden nAngle, oBrush, oColor, oFont, oGDIGraphics, oRect, oStringFormat
   Hidden ResourceStatus
   nAngle = 0
   oBrush = Null
   oColor = Null
   oFont = Null
   oGDIGraphics = Null
   oRect = Null
   oStringFormat = Null
   cResourceStatus = Set("Resource")
   * Propriedades públicas
   cWatermark = ""
   cFontName = ""
   nFontStyle = 0
   *
   Procedure Init
      Lparameters cWatermark, cFontName, cFontStyle
      Set Resource Off
      With This
         .cWatermark = Evl(cWatermark,"")
         .cFontName = Evl(cFontName,"")
         .nFontStyle = Evl(cFontStyle,0)
      Endwith
      DoDefault()
   Endproc
   *
   Procedure Destroy
      Local lcResourceStatus
      lcResourceStatus = This.cResourceStatus
      Set Resource &lcResourceStatus
      DoDefault()
   Endproc
   *
   Procedure LoadReport
      DoDefault()
      With This
         If .ListenerType==1 And Not Vartype(.PreviewContainer)=="O"
            .ExtendPreviewContainer()
         Endif
      Endwith
   Endproc
   *
   Procedure BeforeReport
      DoDefault()
      With This
         If Not Empty(.cWatermark)
            .oGDIGraphics = Createobject('GPGraphics')
            .SetWatermarkFontSize()
         Endif
      Endwith
   Endproc
   *
   Procedure AfterBand(nBandObjCode, nFRXRecNo)
      If nBandObjCode==7 && Rodapé da página
         With This
            If Not Empty(.cWatermark)
               .AddWatermark()
            Endif
         Endwith
      Endif
      DoDefault(nBandObjCode, nFRXRecNo)
   Endproc
   *
   Function SetWatermarkFontSize
      With This
         .SetoGDIGraphicsHandle()

         * Cria uma cor cinza semi transparente
         .oColor = Createobject('gpColor',128,128,128,127)

         * Cria um pincel sólido com a cor criada acima
         .oBrush = Createobject("gpSolidBrush", .oColor)

         * Cria uma string de formato
         #Define StringAlignmentNear 0
         #Define StringAlignmentCenter 1
         #Define StringAlignmentFar  2
         .oStringFormat = Createobject('gpStringFormat')
         With .oStringFormat
            .Create()
            .Alignment = StringAlignmentCenter
            .LineAlignment = StringAlignmentCenter
         Endwith

         * Cria uma fonte
         Local loFont
         loFont = Createobject("GpFont")

         Local lnFactor, lnMaxWidth
         lnFactor = 0.80
         lnMaxWidth = (Sqrt((.SharedPageHeight ^ 2) + (.SharedPageWidth ^ 2))) * lnFactor

         * Para contornar um bug na função MeasureString da GDI+ e obter o tamanho correto
         Local loStringFormat As 'GpStringFormat' Of Home() + 'FFC\_gdiplus.vcx'
         loStringFormat = Newobject('GpStringFormat',Home() + 'FFC\_gdiplus.vcx')
         loStringFormat.Create()
         loStringFormat.GetGenericTypographic()

         Local loSize, lnSize, lnCharsFitted, lnLinesFilled, lnPerc
         lnSize = 1500

         loFont.Create(.cFontName,lnSize,.nFontStyle,2)
         lnCharsFitted = 0
         lnLinesFilled = 0
         loSize = .oGDIGraphics.MeasureStringA(.cWatermark,loFont, ,;
            loStringFormat, @lnCharsFitted, @lnLinesFilled)

         If Vartype(loSize)=="O"
            If loSize.W > lnMaxWidth
               lnPerc = loSize.W / lnMaxWidth
               lnSize = Int(lnSize / lnPerc)
            Endif
         Endif

         loFont.Create(.cFontName,lnSize,.nFontStyle,2)
         .oFont = loFont

         * Calcula o ângulo de rotação
         .nAngle = Rtod(Atan(.SharedPageHeight / .SharedPageWidth ))

         * cria um retângulo com dimensões especiais
         .oRect = Createobject("gpRectangle", ;
            -.SharedPageWidth/2, -.SharedPageHeight/2, ;
            .SharedPageWidth*2, .SharedPageHeight*2)
      Endwith
   Endfunc
   *
   Function AddWatermark
      With This
         .SetoGDIGraphicsHandle()

         * Prepara a transformação
         .oGDIGraphics.TranslateTransform(.SharedPageWidth/2, ;
            .SharedPageHeight/2)
         .oGDIGraphics.RotateTransform(-.nAngle)
         .oGDIGraphics.TranslateTransform(-.SharedPageWidth/2, ;
            -.SharedPageHeight/2)

         * Insere o texto da marca d'água
         .oGDIGraphics.DrawStringA(.cWatermark, .oFont, .oRect, .oStringFormat, .oBrush)

         * Desfaz a rotação
         .oGDIGraphics.ResetTransform()
      Endwith
   Endfunc
   *
   Function SetoGDIGraphicsHandle
      With This
         If Not .IsSuccessor
            .SharedGDIPlusGraphics = .GDIPlusGraphics
         Endif
         .oGDIGraphics.SetHandle(.SharedGDIPlusGraphics)
         .oGDIGraphics.TextRenderingHint = 3 && AntiAlias
      Endwith
   Endfunc
   *
   Function ExtendPreviewContainer
      Local loPreviewContainer
      loPreviewContainer = Null
      Do (_ReportPreview) With loPreviewContainer
      loPreviewContainer.SetExtensionHandler(Newobject("MyExtensionHandler"))
      This.PreviewContainer = loPreviewContainer
   Endfunc
Enddefine

* Cria uma classe que extende o Report Preview
Define Class MyExtensionHandler As Custom
   *
   Procedure Show(iStyle)
      With This.PreviewForm
         With .Toolbar
            * Traduz os botões da barra de ferramentas para o português
            .cboZoom.ToolTipText = "Zoom"
            .cmdClose.ToolTipText = "Fechar a visualização"
            .cmdGoToPage.ToolTipText = "Ir para a página"
            .cmdPrint.ToolTipText = "Imprimir"
            With .cntNext
               .cmdBottom.ToolTipText = "Última página"
               .cmdForward.ToolTipText = "Próxima página"
            Endwith
            With .cntPrev
               .cmdBack.ToolTipText = "Página anterior"
               .cmdTop.ToolTipText = "Primeira página"
            Endwith
            With .opgPageCount
               .opt1.ToolTipText = "Uma página"
               .opt2.ToolTipText = "Duas páginas"
               .opt3.ToolTipText = "Quatro páginas"
            Endwith
            *
         Endwith
         .WindowState = 2 && Maximiza a janela de visualização de relatórios
      Endwith
      DoDefault(iStyle)
   Endproc
   *
Enddefine

Para saber mais sobre a nova engrenagem de relatórios do VFP, eu recomendo:

  • ler os tópicos do help do VFP 9: Understanding Visual FoxPro Object-Assisted Reporting e Using GDI+ in Reports;
  • visitar o site VFPX e procurar pela classe GDIPlusX que extende a capacidade da GDI+;
  • visitar o blog do César Chalom. Ele faz parte da equipe do VFPX que trabalha no projeto da classe GDIPlusX. No blog existem bons exemplos de utilização da GDI+.

Mais uma vez, obrigado ao César Chalom por desenvolver o código fonte da marca d'água. Parabéns pelo seu grande trabalho!