Access Avançado
Formatação Avançada de Textos
com Access
Artigo para Access XP
Pré-requisitos: Conhecimentos de Access e VBA
Paulo Sergio Sarraino *
Você já precisou formatar textos no Access como se estivesse no
Word? Conseguiu imprimi-los e exibi-los na internet? A que custo?
Independente da versão do Access, os campos de texto e memorando nunca permitiram trabalhar com textos mais elaborados visualmente, como negritos, sublinhados, cores e tantas outras opções que o Word, por exemplo, nos possibilita. Até que o estudo
de outras ferramentas mostrou-me um caminho que poderia ajudar o Access atingir esse objetivo.
UM POUCO DE ESTÓRIA
Minha pesquisa sobre esse assunto se iniciou quando o tema foi
abordado na revista nº 40 de Nov/Dez 2000. Naquela época, o controle utilizado (Microsoft Rich Textbox Control) permitia alguns
recursos de formatação, mas só era possível trabalhar com formulários, já que o Access não entendia a estrutura do controle
para disponibilizar relatórios com seus recursos. A formatação
gerada era toda gravada em sintaxe RTF (Rich Text Format) que,
por ser semelhante ao HTML (estrutura de tags), era aconselhável
guardá-la em campos Memorando devido à sua grande capacidade de armazenamento. De qualquer forma, fiquei impressionado
com as facilidades e possibilidades que poderiam ser acrescentadas ao Access.
Trabalhei numa empresa (e presto consultoria ainda hoje) que atua
como head-hunting de outras empresas, a Eigenheer & Associados – www.eigenheer.com.br - e lá desenvolvemos um complexo
sistema de captação, disponibilização e gerenciamento de currículos, as avaliações e processos da empresa, e ainda seu banco
de talentos totalmente em Access, conhecidos como EigPRO,
EigNet e EigFast. Alguns relatórios gerados para seus clientes incluem o currículo de seus candidatos e, como essa informação é
guardada normalmente com campos Memorando, não era possível realçar nenhuma parte do conteúdo disponibilizado. Eles também buscavam, há tempos, melhorias para essa tecnologia com o
Access.
Pois bem, se de um lado eu tinha campos Memorando com currículos gravados e nenhuma possibilidade de personalização, de
outro tinha uma estrutura de formatação de textos em RTF, também usando campos Memorando, mas sem possibilidade de impressão. Meu desafio era pesquisar um meio de juntar esses dois
ambientes e ainda mais, precisava disponibilizar relatórios, pesquisas e gerar um código HTML compatível para exibir esses dados no site da empresa que trabalhava.
A BUSCA
Na Internet, estudei algumas possibilidades. Uma delas é o “Total
DISPONÍVEL PARA DOWNLOAD
FATA.EXE (ACCESS XP, RTF2 1.8, RTF2HTML 3.03)
Disponível para download em www.forumaccess.com.br
20
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
Access Memo” da FMS (www.fmsinc.com), mas é pago (a partir
de US$ 200,00) e não me geraria o código HTML que precisava.
Continuando a pesquisa, achei no site do Lebans
(www.lebans.com) um ActiveX muito interessante, o RTF2 1.8 (disponível para o Access 97 ou superior) que, além de gratuito, há
muitas informações no site, algumas demos e me parecia ser de
fácil adaptação. Ele também não gera o código HTML que precisava, mas, enquanto pensava nisso, localizei o site de Brady Hegberg
(http://www2.bitstream.net/~bradyh/downloads/)
que
disponibiliza, gratuitamente, um código relativamente simples, o
RTF2HTML 3.03 (arquivo rtf2html3.zip), de conversão do padrão
RTF para o HTML (há mais informações e um demo na página
rtf2htmlrm.html).
Antes que me aprofunde mais, deixe-me explicar algumas situações que ocorreram nesta busca: procurando por ajuda (inclusive
no GD da FórumAccess) recebi algumas sugestões para meu problema, como automatizar essa a tarefa com o Word e formatar o
texto lá, porém essa alternativa era inviável. O currículo dos candidatos, por ser um campo memorando, estava inserido dentro de
alguns relatórios do Access com outros campos do sistema e há
ainda módulos de pesquisa e geração de conteúdo automático,
por isso, ele deveria continuar dentro do sistema. Mesmo que eu
utilizasse um controle acoplado de um objeto do Word, como controlaria as quebras de páginas desse controle dentro de um relatório do Access que também possui suas quebras de página? Também pensei em usar algum controle HTML para formatar os dados, mas, apesar de simplificar o processo eliminando a conversão de RTF para HTML, não conseguia disponibilizar a impressão.
Identifiquei muitos problemas para algo que deveria ser tão simples quanto formatar um texto no Word.
O PROJETO
Bom, de posse do ActiveX RTF2 do Lebans, do código RTF2HTML
do Brady e de mais alguns elementos que descreverei durante a
matéria, consegui desenvolver um projeto para formatação e conversão de campos memorando usando os padrões RTF e HTML,
juntando diversas tecnologias no Access XP (formato 2002 - não
testei com o Access 2000). Com base no sistema do meu cliente,
criei um sistema mais simples para a ilustração dessas tecnologias
nesta matéria. A primeira coisa a fazer é baixar do site do Lebans,
instalar o controle RTF2 e adicionar sua referência no arquivo MDB
do sistema. Para isso, crie um módulo novo qualquer, selecione o
menu Ferramentas / Referências e localize o “RTF2 ActiveX Control
module”; senão estiver na lista, clique em Procurar, indique arquivos do tipo Controle ActiveX (*.ocx) e localize o arquivo RTF2.ocx,
conforme a pasta que foi instalada o controle. Acrescente referências também para a “Microsoft Internet Controls” (para a
visualização de página Web) e a “Microsoft Office 10.0 Object
Library” (para a construção da barra de ferramentas de formatação
personalizada). No final, sua tela de Referências deve ficar como a
figura 1.
WWW.FORUMACCESS.COM.BR
Access Avançado
Figura 1 – Tela de Referências
Feche a tela do Editor do VBA e passemos ao projeto. Criei uma tabela
(tbl_Candidatos) para o cadastramento dos candidatos com os campos abaixo:
Campo
Código
Nome
Endereço
Bairro
Cidade
Estado
CEP
Telefone
Celular
Email
DataNascimento
Currículo
Selecione o campo Currículo na propriedade Origem do Controle do ActiveX
RTF2. Não se esqueça de inserir o controle dentro da página “Currículo
formatado” do controle guia.
Na segunda página (Código RTF), insira uma caixa de texto comum vinculada
ao campo Currículo da tabela tbl_Candidatos. Defina sua propriedade Bloqueado como Verdadeiro para evitar alteração do seu conteúdo por esse caminho.
Na terceira página (Código HTML), insira outra caixa de texto, porém nãovinculada à base, defina sua propriedade Bloqueado como Verdadeiro e ela
terá, na sua propriedade Origem do Controle, a expressão
“=rtf2html3(Currículo)”. Essa função encontra-se no módulo
bas_RTF2HTML, que possui também diversas sub-rotinas para a conversão
do código RTF para HTML (fiz algumas adaptações e correções a partir do
arquivo disponível no site do Brady Hegberg conforme testava diversas opções de formatação). Devido à extensão do código desse módulo, ele não
será transcrito na matéria. Por favor, analise-o diretamente no arquivo disponível no site da revista.
Criei também, com o Assistente do Access, botões para a navegação de
registros, acesso ao relatório e fechamento do formulário. Dimensione os
controles de cada página e do formulário em geral de acordo a figura 3.
Tipo/Tamanho
Autonumeração (chave primária)
Texto (50)
Texto (255)
Texto (50)
Texto (20)
Texto (2)
Texto (9)
Texto (14)
Texto (14)
Texto (50)
Data
Memorando
Tabela 1 – Tbl_candidatos
As outras propriedades dos campos da tabela foram assumidas como
o padrão do Access.
Construí um formulário (frm_Candidatos) para consulta e manutenção desses dados. Além dos campos da tabela tbl_Candidatos, criei
uma guia com 3 páginas para ilustrar como ocorre o processo de
formatação para o campo de Currículo.
Na primeira página (Currículo formatado) da guia, temos o controle
RTF2. Para inseri-lo, selecione-o a partir do menu Inserir / Controle
ActiveX, conforme figura 2.
Figura 3 - Dimensionando os controles de cada página e do formulário em geral
Há um pequeno truque nesse formulário. O label Contato está na vertical,
porém ele não é um label e sim uma imagem, já que construí essa legenda
com o Paint do Windows. Apesar do Access apresentar uma propriedade
chamada Vertical para as legendas e caixas de texto, na verdade essa propriedade rotaciona o texto 90º apenas no sentido horário.
Na parte de código desse formulário, encontraremos diversas rotinas para
controlar a navegação de registros, acesso ao relatório e um evento especial
para o controle RTF2, o Change que, embora não apareça na estrutura do
controle, é permitido na área de programação. Utilizamos esse evento para
transmitir a barra de ferramentas personalizada “RTF Formatação”, os tipos
de formatação aplicada ao texto, conforme se navega nos caracteres contidos no controle (Figura 4).
Figura 2 -Inserindo Controle ActiveX
Figura 4 – Controle Change
FÓRUMACCESS
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
21
Access
Avançado
Access
Avançado
Para a formatação dos textos, segui a mesma idéia do Word, criando
uma barra de ferramentas personalizada com as funções de formatação
disponíveis. Baseei-me em um dos exemplos no site do Lebans
(A2KRTF2Sample.zip), fiz alguns ajustes e acrescentei as combos para
listar as fontes do sistema e os tamanhos possíveis. Para as combos
iniciarem a indicação dos parâmetros de fonte e tamanho é necessário
programar também o evento Load e Open do formulário
frm_Candidatos.
Private Sub Form_Load()
Cada botão possui uma rotina própria registrada no módulo
bas_RTF2ToolBar. Para as combos de nome e tamanho das fontes, fiz
algo mais elaborado utilizando a matéria sobre barras de ferramentas
personalizadas no Excel, citada no nº 66 de Mar/Abr 2005, e uma rotina para classificação de matrizes sem uso de tabelas temporárias (localizada em algum fórum através da pesquisa do Google), que está no
módulo bas_ListaFontes.
Segue os códigos dos botões da bas_RTF2ToolBar:
Option Compare Database
Option Explicit
Me.ctlRTF.SetFocus
SendKeys "{right}{left}"
Public Function cbAlign(align As Integer)
End Sub
'botões de Alinhamentos
'align = 1 (left), 2 (right), 3 (center), 4 (justify)
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.SelAlignment = Choose(align, rtfLeft, rtfRight,
rtfCenter, rtfJustify)
Set ctl = Nothing
Private Sub Form_Open(Cancel As Integer)
ctlRTF_Change
DoCmd.ShowToolbar "RTF Formatação", acToolbarYes
RTFCombosFonte
End Sub
End Function
Para iniciar a construção da barra de ferramentas, selecione o menu Exibir / Barra de Ferramentas / Personalizar... Clique no botão “Nova...”,
defina um nome e crie os botões necessários ou importe do arquivo
desta matéria disponível no site da revista. As imagens dos botões foram obtidas com outro aplicativo, o V-Tools 1.66 da Skrol
(www.skrol29.com) que, além de um vasto banco de imagens para botões, possui diversos outros recursos para um banco de dados Access.
Public Function cbBold()
'botão de Negrito
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.FontBold = True
Set ctl = Nothing
End Function
Figura 5 – RTF Formatação
Public Function cbItalic()
Temos rotinas para os botões de Recortar, Copiar, Colar, Desfazer, Cor
de Fonte, Cor de Fundo, Superscrito e Subescrito, Listas Numeradas e
de Marcadores, Espaçamento Entre Linhas, Tabulações, Página Web,
Limpeza de Formatações, Nome de Fontes, Tamanho de Fonte, Negrito,
Itálico, Sublinhado e Alinhamentos de Texto.
Veja um exemplo de configuração de um dos botões da barra de ferramentas (Figura 6).
'botão de Itálico
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.FontItalic = True
Set ctl = Nothing
End Function
Public Function cbUnderline()
'botão de Sublinhado
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.FontUnderline = True
Set ctl = Nothing
End Function
Public Function cbCut()
Figura 6 - Configuração de um dos botões da barra de ferramentas
22
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
'botão de Cortar
On Error Resume Next
WWW.FORUMACCESS.COM.BR
Access Avançado
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.Cut
Set ctl = Nothing
End Function
Public Function cbCopy()
'botão de Copiar
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.Copy
Set ctl = Nothing
End Function
Public Function cbPaste()
'botão de Colar
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.Paste
Set ctl = Nothing
End Function
Public Function cbFont()
'combo de Fontes
On Error Resume Next
Dim ctl As Object, obj As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then
Set obj = ctl.SelFont
Set obj = Nothing
End If
Set ctl = Nothing
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then
Set obj = ctl.SelFontForeColor
Set obj = Nothing
End If
Set ctl = Nothing
End Function
Public Function cbLineSpacing(space As Integer)
'botões de Espaçamento de Linha
'space = 0 (single), 1 (1.5), 2 (duplo)
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.ParagraphLineSpacing = Choose(space + 1,
LineSpacingSingle, LineSpacingOneAndAHalf, LineSpacingDouble)
Set ctl = Nothing
End Function
Public Function cbSubscript()
'botão de Subescrito
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.SelFontSubscript = True
Set ctl = Nothing
End Function
Public Function cbSuperscript()
'botão de Superescrito
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.SelFontSuperscript = True
Set ctl = Nothing
End Function
End Function
Public Function cbFontBackColor()
Public Function cbUndo()
'botão de Cor de Fundo
On Error Resume Next
Dim ctl As Object, obj As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then
Set obj = ctl.SelFontBackColor
Set obj = Nothing
End If
Set ctl = Nothing
End Function
Public Function cbFontForeColor()
'botão de Cor da Fonte
On Error Resume Next
Dim ctl As Object, obj As Object
'botão de Desfazer
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.Undo
Set ctl = Nothing
End Function
Public Function cbClearFormat()
'botão de Limpar Formatação
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.PlainText = ctl.PlainText
FÓRUMACCESS
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
23
Access
Avançado
Access
Avançado
hDC = GetDC(Application.hWndAccessApp)
Set ctl = Nothing
EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, vFontes
ReleaseDC Application.hWndAccessApp, hDC
End Function
Public Function cbTabs(ntab As Long)
ReDim f(vFontes.Count)
For i = 1 To vFontes.Count
f(i) = vFontes(i)
'combo de Tabulações
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.TabIncrementalValue = ntab
Set ctl = Nothing
Next
ArraySort f() 'reclassifica a matriz
'para criar a combo de Nome das Fontes
'Set cboFonte = CommandBars("RTF
Formatação").Controls.Add(msoControlComboBox)
End Function
'para atualizar a combo de Nome das Fontes
Set cboFonte = CommandBars("RTF Formatação").Controls("RTFFontName")
Public Function cbWeb()
'botão de Página Web
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
DoCmd.RunCommand acCmdSaveRecord
If Not ctl Is Nothing Then DoCmd.OpenForm "frm_Web", , , , , ,
rtf2html3(Nz(ctl, ""))
Set ctl = Nothing
With cboFonte
.Clear
.Caption = "RTFFontName"
.Style = msoComboNormal
.TooltipText = "Fonte"
.Width = 200
.DropDownLines = 8
.OnAction = "=cbFontName()"
End Function
For i = 1 To UBound(f)
.AddItem f(i)
Public Function cbFontName()
Next
End With
'combo de Nomes das Fontes
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.SelFontName =
CommandBars.ActionControl.Text
Set ctl = Nothing
'para criar a combo de Tamanho das Fontes
'Set cboTamanho = CommandBars("RTF
Formatação").Controls.Add(msoControlComboBox)
'para atualizar a combo de Tamanho das Fontes
Set cboTamanho = CommandBars("RTF
Formatação").Controls("RTFFontSize")
End Function
With cboTamanho
Public Function cbFontSize()
'combo de Tamanhos das Fontes
On Error Resume Next
Dim ctl As Object
Set ctl = Screen.ActiveControl
If Not ctl Is Nothing Then ctl.SelFontSize = CommandBars.ActionControl.Text
Set ctl = Nothing
.Clear
.Caption = "RTFFontSize"
.Style = msoComboNormal
.TooltipText = "Tamanho da Fonte"
.Width = 50
.DropDownLines = 8
.DropDownWidth = 0
.OnAction = "=cbFontSize()"
End Function
Public Function RTFCombosFonte()
'construção das combos de Nome e Tamanho de Fontes
Dim cboFonte As CommandBarComboBox
Dim cboTamanho As CommandBarComboBox
Dim hDC As Long
Dim vFontes As Variant
Dim i As Integer
Dim f() As String
Set vFontes = New Collection
24
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
.AddItem "8"
.AddItem "9"
.AddItem "10"
.AddItem "11"
.AddItem "12"
.AddItem "14"
.AddItem "16"
.AddItem "18"
.AddItem "20"
.AddItem "22"
.AddItem "24"
.AddItem "26"
WWW.FORUMACCESS.COM.BR
Access Avançado
.AddItem "28"
.AddItem "36"
.AddItem "48"
.AddItem "72"
'Sinalizadores do campo ntmFlags
Public Const NTM_REGULAR = &H40&
Public Const NTM_BOLD = &H20&
End With
Public Const NTM_ITALIC = &H1&
End Function
'Sinalizadores de tmPitchAndFamily
Segue o código da bas_ListaFontes, que disponibiliza as fontes instaladas no micro classificadas alfabeticamente:
Public Const TMPF_FIXED_PITCH = &H1
Public Const TMPF_VECTOR = &H2
Public Const TMPF_DEVICE = &H8
Public Const TMPF_TRUETYPE = &H4
Option Compare Database
Option Explicit
Public Const ELF_VERSION = 0
Public Const ELF_CULTURE_LATIN = 0
'Tipos de enumeração de fonte
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64
Type LOGFONT
'Máscaras de EnumFonts
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4
lfHeight As Long
lfWidth As Long
lfEscapement As Long
Declare Function EnumFontFamilies Lib "gdi32" Alias "EnumFontFamiliesA"
(ByVal hDC As Long, ByVal lpszFamily As String, ByVal lpEnumFontFamProc As
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
Long, LParam As Any) As Long
Declare Function GetDC Lib "User32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "User32" (ByVal hWnd As Long, ByVal hDC
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
As Long) As Long
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
ByVal FontType As Long, vFontes As Variant) As Long
lfPitchAndFamily As Byte
lfFaceName(LF_FACESIZE) As Byte
End Type
Type NEWTEXTMETRIC
tmHeight As Long
tmAscent As Long
tmDescent As Long
tmInternalLeading As Long
tmExternalLeading As Long
tmAveCharWidth As Long
tmMaxCharWidth As Long
Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC,
Dim FaceName As String
Dim FullName As String
FaceName = StrConv(lpNLF.lfFaceName, vbUnicode)
vFontes.Add Left$(FaceName, InStr(FaceName, vbNullChar) - 1)
EnumFontFamProc = 1
End Function
Function ListaFontes() As String
Dim hDC As Long
Dim vFontes As Variant
tmWeight As Long
tmOverhang As Long
tmDigitizedAspectX As Long
Dim i As Integer
Dim strFontes As String, f() As String
tmDigitizedAspectY As Long
tmFirstChar As Byte
tmLastChar As Byte
Set vFontes = New Collection
hDC = GetDC(Application.hWndAccessApp)
EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, vFontes
tmDefaultChar As Byte
tmBreakChar As Byte
tmItalic As Byte
ReleaseDC Application.hWndAccessApp, hDC
ReDim f(vFontes.Count)
tmUnderlined As Byte
tmStruckOut As Byte
tmPitchAndFamily As Byte
For i = 1 To vFontes.Count
f(i) = vFontes(i)
Next
tmCharSet As Byte
ntmFlags As Long
ntmSizeEM As Long
ArraySort f()
For i = 1 To UBound(f)
ntmCellHeight As Long
ntmAveWidth As Long
End Type
strFontes = strFontes & f(i) & ";"
Next
ListaFontes = Left(strFontes, Len(strFontes) - 1)
FÓRUMACCESS
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
25
Access
Avançado
Access
Avançado
Para exibir uma página HTML no controle “Navegador Web da
Microsoft”, localizei uma rotina durante as minhas pesquisas que deve
ser usada no evento “Ao Carregar” do formulário frm_Web (lembre-se
que é através do OpenArgs que o controle sabe qual o conteúdo HTML
a exibir):
End Function
Sub ArraySort(vArray() As String)
Dim lLoop1 As Long
Dim lHold As Long
Option Compare Database
Dim lHValue As Long
Dim lTemp As String
Dim lUBound As Long, lLBound As Long
Option Explicit
Public strHTML As String
lUBound = UBound(vArray)
lLBound = LBound(vArray)
Private Sub Form_Load()
lHValue = lLBound
strHTML = ""
Do
Dim s As String
lHValue = 3 * lHValue + 1
Loop Until lHValue > lUBound
Me.ctlWBrowser.Object.Navigate "about:blank"
Do While Me.ctlWBrowser.Object.ReadyState <> READYSTATE_COMPLETE '
Do
lHValue = lHValue / 3
For lLoop1 = lHValue + lLBound To lUBound
loaded
DoEvents
Loop
lTemp = vArray(lLoop1)
lHold = lLoop1
Do While vArray(lHold - lHValue) > lTemp
Me.ctlWBrowser.Object.Document.designMode = "On"
Me.ctlWBrowser.Object.Document.execCommand "AbsolutePosition", False,
vArray(lHold) = vArray(lHold - lHValue)
lHold = lHold - lHValue
If lHold < lHValue Then Exit Do
True
Me.ctlWBrowser.Object.Document.execCommand "2D-Position", False, True
Loop
vArray(lHold) = lTemp
Next lLoop1
Do While Me.ctlWBrowser.Object.ReadyState <> READYSTATE_COMPLETE '
loaded
Loop Until lHValue = LBound(vArray)
DoEvents
Loop
End Sub
Dim blTemp As Boolean
Para verificar se o código HTML gerado será compatível com o browser,
fiz ainda um formulário (frm_Web) com o ActiveX “Navegador Web da
Microsoft”, disponível na janela Inserir Controle ActiveX do Access,
para visualizar os currículos convertidos em HTML antes de enviar meu
banco de dados para o provedor. O botão “Página Web” da barra de
ferramentas chama esse formulário informando qual currículo estamos
visualizando, através do parâmetro OpenArgs do formulário.
Veja como ficaram os formulários criados com a barra de ferramentas
(figura 7).
blTemp = IsNull(Me.OpenArgs)
If blTemp Then
' Use loaded About:Blank Document
Exit Sub
End If
s = Me.OpenArgs
' Write the HTML to our Browser
Me.ctlWBrowser.Object.Document.body.innerHTML = s
Do While Me.ctlWBrowser.Object.ReadyState <> READYSTATE_COMPLETE '
loaded
DoEvents
Loop
End Sub
INTERNET
Figura 7 - Formulários criados com a barra de ferramentas
26
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
Como dito antes, estes currículos em RTF não podem ser
visualizados no browser. Como temos as rotinas necessárias para a
conversão desse código para HTML, utilizei a função rtf2html3()
numa consulta para preparar os dados. A consulta qry_CV_html
demonstra como realizei a conversão. Semelhante ao formulário
frm_Web, uma página ASP que leia os currículos em formato HTML
exibirá as formatações criadas no Access da melhor forma possível
(figura 8).
WWW.FORUMACCESS.COM.BR
Access Avançado
Veja um exemplo na figura 11.
Figura 8 – qry_CV_html
Veja uma página ASP como referência na figura 9.
Figura 11 – Relatório de Currículos
A MIGRAÇÃO
No projeto original, quando essa solução ficou pronta, o banco de
dados de currículos já era bem grande e estava num campo Memorando como texto simples. Não dava para pedir ao meu cliente a
conversão do campo para a estrutura RTF em cada registro manualmente.
Então, além dessa solução, fiz também um processo para realizar a
leitura de toda a tabela, converter o currículo (copiando-o para um
controle RTF2) e gravar o conteúdo convertido no banco de dados.
Apenas como estatística, o sistema converteu 18.000 registros em 5
minutos aproximadamente.
Figura 9 - Página ASP como referência
CONCLUSÃO
O RELATÓRIO
O controle RTF2 do Lebans também pode ser usado em relatórios. Criei
o relatório rpt_Candidatos para ilustrar sua capacidade de impressão
com a formatação aplicada ao campo (figura 10). Como ele não possui a
propriedade “Pode Ampliar”, que utilizamos em controles e seções nos
relatórios do Access, devemos ajustar a altura do controle, conforme o
conteúdo carregado através do evento Ao Formatar da seção Detalhe, e
definir a propriedade “Pode Ampliar” da seção como Sim.
Private Sub Detalhe_Format(Cancel As Integer, FormatCount As Integer)
Disponibilizei essa solução em Abril/2005 e desde então meu cliente ficou muito satisfeito. Sabemos que não há 100% dos recursos
de formatação, até porque isso não é o Microsoft Word, mas, para
quem não conseguia fazer nem negritos, até que caprichamos bem.
O desafio motivou a pesquisa que permitiu a construção dessa ferramenta com diversos componentes compartilhados.
Espero que esta matéria motive também sua pesquisa para aprimorar seus projetos na busca de soluções para desafios aparentemente impossíveis. Fiquem à vontade para mandar idéias, sugestões e
críticas.
Bom estudo a todos!
Me.ctlRTF.Height = Me.ctlRTF.RTFheight
Para se aprofundar
End Sub
Site do Lebans (www.lebans.com)
Site do Brady Hegberg (www2.bitstream.net/~bradyh/downloads/)
* Paulo Sergio Sarraino ([email protected]) é sócio da Sarraino Systems.
Possui graduação de Tecnologia em Processamento de Dados pela FASP (1997)
e pós-graduação em Análise de Sistemas c/ Ênfase em Gerência de Projetos pela
FIAP (2000). Atua como consultor em Análise e Desenvolvimento de Sistemas
em ambiente MS Office e Internet (especialista em Access, VBA e ASP) há 10
anos. Acesse www.sarraino.com.br.
Figura 10 – Criando rpt_Candidatos
FÓRUMACCESS
SETEMBRO/OUTUBRO 2005 - REVISTA Nº 69
27
Download

Formatação Avançada de Textos com Access