Você está na página 1de 153

Introduo

Ao
OpenOffice.orgBasic
por
Noelson Alves Duarte

CopyrightNoelsonAlvesDuarte
permitidaacpia,distribuioe/oumodificaodestedocumento,sobostermosdaGNU
Free Documentation License, Version 1.1 ou uma verso posterior publicada pela Free
SoftwareFoundation.Umacpiadalicenaacompanhaestedocumento.

Verso 2

ndice
1 Macros OpenOffice.org Basic............................................................................................................5
1.1 Introduo..................................................................................................................................5
1.2 Criando a Primeira Macro..........................................................................................................5
1.3 Executando a Primeira Macro....................................................................................................7
1.4 Compartilhando uma Macro......................................................................................................8
2 Dilogos Personalizados..................................................................................................................11
2.1 Introduo................................................................................................................................11
2.2 Criando um Dilogo ................................................................................................................11
2.3 Manipulando Eventos do Dilogo............................................................................................14
3 Pilotos Automticos.........................................................................................................................17
3.1 Introduo................................................................................................................................17
3.2 Criando um Piloto Automtico.................................................................................................17
3.3 Manipulando Eventos do Piloto Automtico...........................................................................19
4 Introduo a API do OpenOffice.org...............................................................................................21
4.1 Viso geral................................................................................................................................21
4.2 Objetos.....................................................................................................................................22
4.3 Definindo objetos.....................................................................................................................24
4.4 Criando um novo documento...................................................................................................26
5 Trabalhando com Documentos........................................................................................................28
5.1 Carregando Documentos..........................................................................................................28
5.2 Salvando Documentos..............................................................................................................30
5.3 Imprimindo Documentos..........................................................................................................31
5.4 Fechando Documentos.............................................................................................................33
5.5 Identificando os Documentos Abertos.....................................................................................34
6 Documentos do Writer.....................................................................................................................36
6.1 Introduo................................................................................................................................36
6.2 Editando texto..........................................................................................................................36
6.3 Movendo-se pelo texto............................................................................................................37
6.4 Formatando texto.....................................................................................................................41
6.5 Formatando com estilo ............................................................................................................43
6.6 Obtendo o objeto selecionado..................................................................................................47
6.7 Localizando objetos.................................................................................................................48
6.8 Busca e Substituio................................................................................................................50
6.9 Inserindo objetos......................................................................................................................52
6.10 Tabelas....................................................................................................................................53
6.11 Desenhos................................................................................................................................59
7 Documentos do Calc........................................................................................................................63
7.1 Introduo................................................................................................................................63
7.2 Planilhas...................................................................................................................................63
7.3 Editando...................................................................................................................................65
7.4 Navegando pelas Clulas..........................................................................................................67
7.5 Obtendo objetos selecionados..................................................................................................69
7.6 Formatando..............................................................................................................................70
Formatando Pargrafos e Caracteres........................................................................................70
Mesclando Clulas....................................................................................................................72
Inserindo Bordas......................................................................................................................72
Introduo ao OpenOffice.org Basic

Verso 2

Formatao Numrica..............................................................................................................73
Formatao Condicional...........................................................................................................74
7.7 Busca e Substituio................................................................................................................75
7.8 Ordenando................................................................................................................................77
7.9 Filtrando dados.........................................................................................................................78
7.10 Inserindo Subtotais.................................................................................................................80
7.11 Grficos..................................................................................................................................81
7.12 Seleo durante a execuo da macro....................................................................................85
7.13 Movimentando dados.............................................................................................................88
7.14 Dados de fontes externas.......................................................................................................89
Vnculos....................................................................................................................................89
Importando dados de um banco de dados................................................................................91
8 Banco de Dados...............................................................................................................................93
8.1 Introduo................................................................................................................................93
8.2 Fontes de Dados.......................................................................................................................93
8.3 Conexes..................................................................................................................................97
8.4 Estrutura do Banco de Dados..................................................................................................99
Tabelas......................................................................................................................................99
Chave Primria.......................................................................................................................104
ndices....................................................................................................................................105
Segurana...............................................................................................................................107
8.5 Registros................................................................................................................................108
Criando um RowSet...............................................................................................................108
Navegando pelos registros......................................................................................................110
Acessando os dados................................................................................................................111
Alterando os dados.................................................................................................................112
Obtendo Metadados do RowSet............................................................................................114
8.6 Consultas................................................................................................................................114
8.7 Comandos SQL......................................................................................................................117
8.8 Comandos SQL Preparados...................................................................................................119
8.9 Consultas Preparadas.............................................................................................................121
8.10 Vnculos...............................................................................................................................121
9 Apndice Linguagem Basic.........................................................................................................123
9.1 Primeiros Passos....................................................................................................................123
9.2 Elementos do Basic................................................................................................................125
Palavras reservadas.................................................................................................................125
Regras para nomes.................................................................................................................125
Comentrios...........................................................................................................................126
Tipos de dados internos..........................................................................................................126
Declarao de variveis..........................................................................................................127
Matrizes..................................................................................................................................127
Escopo das variveis..............................................................................................................128
Constantes simblicas.............................................................................................................129
Expresses..............................................................................................................................129
9.3 Fluxo de controle da execuo...............................................................................................132
Comando de deciso If ... Then..............................................................................................132
Comando de deciso Select Case...........................................................................................133
Comando de repetio While ... Wend...................................................................................134
Comando de repetio For ... Next........................................................................................135
2

Introduo ao OpenOffice.org Basic

Verso 2

Comando de repetio Do ... Loop .......................................................................................136


9.4 Organizao do Programa......................................................................................................137
Comandos...............................................................................................................................137
Sub-rotinas.............................................................................................................................137
Funes..................................................................................................................................138
Passagem de Parmetros........................................................................................................139
Chamada de Procedimentos...................................................................................................139
Modelo Geral de uma Macro.................................................................................................140
10 Mais informaes.........................................................................................................................142
10.1 Na rede.................................................................................................................................142
10.2 Com o autor.........................................................................................................................143
10.3 Histrico, alteraes, ..........................................................................................................143
11 Crditos, Agradecimentos, Licena..............................................................................................144
11.1 Crditos................................................................................................................................144
11.2 Agradecimentos ...................................................................................................................144
11.3 Licena.................................................................................................................................144

Introduo ao OpenOffice.org Basic

Verso 2

Apresentao
EstedocumentooresultadodomeuesforoparaaprenderoOpenOffice.orgBasic.
Eleestfocado,principalmente,nasextensesdoOpenOffice.orgaoBasic,isto,naAPIdo
OpenOffice.org.Assimsendo,ascaractersticasbsicasdalinguagemdeprogramaoBasicno
seroabordadas.
SevocjprogramououconhecealgumdossaboresBasicedesejaescrevermacrosparao
OpenOffice.orgesteumbomlocalparacomear.Seno,recomendoprocuraralgumcursona
rede,esefamiliarizarcomoBasic,antesdeseaventurarnoOOoBasic.muitoimportante
dominarosfundamentosdeumalinguagemdeprogramao.
TodososexemplosdecdigofonteforamtestadoscomoOpenOffice.org,verso1.0.1,exceto
ospequenosblocosdecdigoforadassubrotinas.
Para utilizar este texto, o OpenOffice.org deve estar instalado em seu computador. Aps o
Captulo 3, recomendo que voc instale, tambm, o Manual de Referncia da API do
OpenOffice.org (consulte o captulo Mais Informaes). O Manual de Referncia sofre
atualizaesperidicasesuaversoatualizadaestdisponvel,tambm, paraconsultason
line.
Espero ter tempo para continuar aprendendo e acrescentando informaes teis aos
programadoresque,comoeu,nodominamalnguainglesa.Portanto,periodicamente,procure
pornovasversesdestedocumento.
Comoresultadodeumaaprendizagem, estaIntroduo,seguramente, contmmuitos errose
inconsistncias,esperocontarcomasuaajudaparacorriglos.
Em20dejunhode2003
OAutor
Consideraessobreaverso2destaIntroduo:
AinclusodeumcaptulosobreBancodeDados,deumapndicesobreaLinguagemBasicede
novasseesaolongodotexto,praticamentedobrandoonmerodepginas,meconvenceua
liberarestaIntroduocomoumanovaverso.
OOpenOffice.orgtambmevoluiu,e,nasuanovaverso,trazumgravadordemacros.Isto
ampliaaspossibilidadesdeprogramaoparaosusurioscomunse,tambm,paratodosaqueles
quedesejamaprenderaprogramar.
Porm,acreditoqueachaveparaaprogramaodoOpenOffice.org,estnoconhecimentoda
suaAPI.Estefoiocaminhoadotadodesdeaprimeiraversoe,dele,nopretendomeafastar.
Em25deagostode2003
OAutor
4

Introduo ao OpenOffice.org Basic

Verso 2

Macros OpenOffice.org Basic

1 Macros OpenOffice.org Basic

1.1 Introduo
UmamacroumprogramaescritonalinguagemOpenOffice.orgBasiccomafinalidadede
automatizartarefasdoOpenOffice.org.
AlinguagemOpenOffice.orgBasicmantmasprincipaiscaractersticasdasversesatuaisdo
BASIC,noquedizrespeitosintaxe,tiposdedados,operadores,comandos,funesinternas
eorganizaogeraldoprograma.Almdisto,oOpenOffice.orgBasicpermiteoacessoauma
grande quantidade de objetos, com seus mtodos e propriedades, especficos do
OpenOffice.org.
O OpenOffice.org tem um IDE (Integrated Development Environment Ambiente de
Desenvolvimento Integrado) completo, inclundo: edio de cdigo fonte, verificao de
erros,criaodedilogosegerenciamentodebibliotecas.

1.2 Criando a Primeira Macro


Anossamacroserbemsimples.Ooperadorvaidigitarumafrasenumacaixadeentrada,em
seguidaestafraseseradicionadanaposiocorrentedocursordetextodeumdocumento
ativodoWriter.
Paracomear:
a)ExecuteoWriter,crieumnovoducumentoesalveocomoPrimeira_Macro.sxw.
b)Nabarrademenu,selecioneFerramentasMacro.OdilogoMacroserexibido.
Figura1:DilogoMacro

Introduo ao OpenOffice.org Basic

Macros OpenOffice.org Basic

Verso 2

Observearvore Macrode,nocentrododilogo,temosduasentradasprincipais sofficee


Primeira_Macro.sxw,elassorecipientes(containers)parabibliotecas.Umnvelabaixo,
nas duas entradas, temos a biblioteca Standard. Dentro de soffice Standard temos o
mduloModule1.
O recipiente soffice sempre ser carregado com o OpenOffice.org, ele tem bibliotecas
globais,usadasemtodososdocumentosdoOpenOffice.org.Observequealgunsmdulosde
sofficeestodesativados.
CadadocumentoabertotemseuprpriocontainercomumabibliotecaStandard.Nafigura
acima,onicodocumentoabertoPrimeira_Macro.sxw.
Alista,esquerdadodilogo,exibeosnomesdosprocedimentos(Subrotinasefunes)do
mduloselecionado.OcampoNomedamacroexibeonomedoprocedimentoselecionado.
Ao selecionar o nome de um procedimento, os botes Executar, Atribuir e Editar so
ativados.
Vamoscontinuarcomacriaodanossaprimeiramacro:
a)SelecioneabibliotecaStandarddePrimeira_Macro.sxw.
b)CliquesobreobotoNovoparacriarumnovomdulo.
c)ApareceacaixadeentradaNovoModulo,sugerindoonomeModule1.
d)CliquenobotoOKparacriaronovomdulo.OIDEBasiccarregado.
Figura2:IDEBasic

Introduo ao OpenOffice.org Basic

Verso 2

Macros OpenOffice.org Basic

e) Observe, no editor Basic, a definio de uma subrotina Sub Main ... End Sub. Note
tambmqueaabaModule1estativa.
f)Digite(oucopieecole)ocdigofonteabaixoentreaslinhasSubMaineEndSub.
DimoDocumentoasObject
DimoTextoasObject
DimoCursorVistaasObject
DimoCursorasObject
DimsInserirasString
'solicitaotexto
sInserir=InputBox("Digiteotexto:","InserirTexto","")
'testasealgofoidigitado
ifsInserir=""then
exitsub
endif
'obtmomodelododocumento
oDocumento=ThisComponent
'obtmoservioTextdodocumento
oTexto=oDocumento.getText()
'obtmaposiodocursornaGUIecriaumcursordetexto
oCursorVista=oDocumento.getCurrentController().getViewCursor()
oCursor=oTexto.createTextCursorByRange(oCursorVista.getStart())
'insereotextonaposiocorrentedocursor
oTexto.insertString(oCursor,sInserir,FALSE)

Introduo ao OpenOffice.org Basic

Macros OpenOffice.org Basic

Verso 2

Pronto,terminamosanossaprimeiramacro.Lembresequeelaestembutidanodocumento
Primeira_Macro.sxw.

1.3 Executando a Primeira Macro


Antesdecontinuarmos,vamosanalisarajaneladoIDEBasic.Temos,naparteinferiorda
janela,umareaObservador,esquerda,eoutraChamadas,direita.Aprimeiraserusada
paraobservarvaloresdevariveiseasegundamostraaschamadasaprocedimentos,tudo
duranteaexecuodamacro.
Vejamos,tambm,afinalidadedealgunsconesdajaneladoIDEBasic:
ExecutarexecutaumamacroatencontrarumPontodeInterrupo.
Pontodeinterrupodefineumpontodeinterrupo.
Passoapassoexecutaumamacro,linhaalinha.
Pararterminaaexecuodeumamacro.Serativadoquandoaexecuodamacroiniciar.
Macrospermiteselecionarumamacroparaexecuo.
SalvarcdigofontecomosalvaomdulocorrentecomoumarquivoBasic.
InserircdigofonteinsereocdigofontedeumarquivoBasic.
chegadaahoradetestarmosanossamacro:
a)NoeditorBasic,posicioneocursordetextonalinhasInserir=InputBox(...).Cliqueno
conePontodeinterrupo.Surgeumamarcavermelhaesquerdadalinha.
b)NocampoObservador,digitesInseriretecleEnter,parainspecionarovalordavarivel
duranteaexecuodamacro.NotequeoconeRemoverobservador,direitadocampo,
ativado.
c)CliquesobreoconeExecutar.Aexecuodamacroiniciadae,noPontodeinterrupo,
elapranoteasetaamarela,direita.
d)Clicandonocone Passoapasso,acompanheaexecuodamacro.Quandoacaixade
entradaforexibida,digiteoseunomeecliquesobreobotoOK.Continueaexecuoato
final,quandooconePararfordesativado.
AlterneparaajaneladodocumentoPrimeiraMacro.sxw,evejaseoseunomefoiinseridona
posiodocursor,comodesejado.
Seocorreualgumerro,reviseocdigofonte.
Casoumamacrosejautilizadacomfreqncia,podemosconfiguraroOpenOffice.orgpara
executla de modo mais fcil. Na opo de menu Ferramentas Configurar, temos
entradasparaMenusTecladoBarradeferramentaseEventos,ondepossvelassociar
macrosaopesdemenus,aconesnabarradeferramentas,aumacombinaodeteclasea
umeventodoOpenOffice.org.

Introduo ao OpenOffice.org Basic

Verso 2

Macros OpenOffice.org Basic

Antesdeencerrarestaseo,retornejaneladoIDEBasic,parasimularmosumerrono
cdigofonte:
a)NapenltimalinhadecdigooTexto.InsertString(...)altereonomedavariveloCursor
paraoCurso.
b)Executeamacro.SurgeumacaixacomumamensagemdeerroeumbotoOK.Notequea
setadeacompanhamentodaexecuotornasevermelhanalinhaondeocorreoerro.Aps
clicaremOKaexecuodamacrofinalizadaealinhacomoerropermaneceselecionada.

Figura3:Errodeexecuo
c)CorrijaonomedavariveldeoCursoparaoCursor.FecheoIDEBasic.
SalveodocumentoPrimeira_Macro.sxw.
Noprximopasso,veremoscomodisponibilizarumamacroparatodososdocumentosdo
OpenOffice.org.

1.4 Compartilhando uma Macro


Asmacrosdeumabibliotecadocontainersoffice/Standardsocarregadasjuntamentecom
o OpenOffice.org. Aquelas de um container de um documento qualquer so carregadas
juntamentecomomesmo.Portanto,estarodisponiveisparaexecuosomentequandoo
documentoestiveraberto.
Nesta seo, veremos como exportar uma macro de um documento para o aplicativo
OpenOffice.org.Aqui,mostraremosapenasospassosnecessriosparaefetuaratarefa.
ParadisponibilizarumamacrodeumdocumentoparaoutrosdocumentosdoOpenOffice.org,
sigaospassosabaixo:
a)SelecioneFerramentasMacroecliquesobreobotoGerenciar.
b)ApareceodilogoGerenciar,cliquesobreaabaBibliotecas.
Figura4:DilogoGerenciar

Introduo ao OpenOffice.org Basic

Macros OpenOffice.org Basic

Verso 2

c)Selecione,nacaixadelistagem Aplicao/Documento,aentrada soffice epressioneo


botoAdicionar.
d)Umdilogo AbrirArquivo serexibido.Localizeeselecioneoarquivoquecontma
macroasercompartilhadaecliquesobreobotoAbrir.
e)OdilogoInserirBibliotecasserexibido.Notequeasbibliotecasexistentesnoarquivo
estomarcadasparacompartilhamento.Desmarqueaquelasquenoserocompartilhadasea
bibliotecaStandard,emseguida,cliquesobreobotoOk.

Figura5:InserirBibliotecas

10

Introduo ao OpenOffice.org Basic

Verso 2

Macros OpenOffice.org Basic

Aps esta operao a biblioteca ser acrescentada ao recipiente soffice. Normalmente,


somente as macros da biblioteca Standard so carregadas com o OpenOffice.org. Para
carregarumaoutrabiblioteca,escolha FerramentasMacro,selecioneorecipienteed
umduplocliquesobreonomedabiblioteca.
Paraasbibliotecas Standard, omtododeexportar,nofuncionaadequadamente,poiso
recipiente soffice possuiasuaprpriabiblioteca Standard.Nestecaso,devemos usaros
recursosdeediodoIDEBasicparacompartilharamacro.
AtiveoIDEBasicecrieumnovomdulonabibliotecaStandarddorecipientesoffice.Em
seguida,abraodocumentocomamacroe,noIDEBasic,ativeomduloquecontmamacro
asercompartilhada,selecionetodaamacroecopie,alterneparaonovomduloemsoffice/
Standardecoleamacrocopiada,salvetudoefecheoOpenOffice.org.Agoraasuamacro
faz parte da biblioteca Standard de soffice e est disponvel para execuo no
OpenOffice.org.
Sevocpretendedesenvolvermacrosparausocompartilhado,criebibliotecasprpriaspara
elas, principalmente se usarem dilogos. Para criar uma nova biblioteca, no dilogo
Gerenciar(Figura4),cliquesobreobotoNovo,surgeodilogoNovaBiblioteca,nacaixa
detextodigiteumnomeparasuabibliotecaecliquesobreobotoOk.
OSDKdoOpenOffice.orgpossuiaferramentapkgchkparaempacotamentodemacros,oseu
usoestforadoescopodestaIntroduo.ConsulteoDevelopersGuideparainformaes
detalhadas.

Introduo ao OpenOffice.org Basic

11

Dilogos Personalizados

Verso 2

2 Dilogos Personalizados

2.1 Introduo
OOpenOffice.orgBasicpermiteacriaodeDilogosPersonalizados,atravsdeumeditor
deDilogosintuitivoepoderoso.
Dilogos so uma excelente soluo para interao com o usurio, permitindo que o
programadordesenheumainterfacegrficaconsistenteparaobteroupassarinformaesao
operador.

2.2 Criando um Dilogo


ODilogoquevamoscriarserbemsimples.Naverdade,substituiremosacaixadeentrada
usadaemnossaprimeiramacroporumdilogopersonalizado.
Antesdecomearmos,precisamosrecuperaronossoarquivoPrimeira_Macro.sxw:
a)CarregueoOpenOffice.org.
b)AbraoarquivoPrimeira_Macro.sxw.
c)Escolha FerramentasMacro, selecioneo Module1 danossamacroecliquesobreo
botoEditarparaativaroIDEBasic.
d)CliquecomobotodireitodomousesobreaabaModule1.Nomenuinstatneo,selecione
InserirDilogo.ApareceoeditordedilogosBasic,comumdilogovazio.Notequefoi
criadaumapginaDialog1.
e)Cliquesobreocone Controles
.Surgeumquadrocomvrioscones.Arrasteeste
quadropelabarradettulo(faixasuperior)paraforadabarradeferramentas,posicionandoo
doladodireitododilogo.

12

Introduo ao OpenOffice.org Basic

Verso 2

Dilogos Personalizados

Figura6:EditordeDilogos
VejamosafinalidadedealgunsconesexistentesnoquadrodeControles.
Etiquetausadoparacolocaretiquetasnodilogo.
Botousadoparacolocarbotesnodilogo.
Caixadetextopermiteinserirumacaixadetextonumdilogo.
Propriedadesexibeajaneladepropriedadesdocontroleselecionado.Serativadoquando
algum controle for selecionado. Alm da edio das propriedades, permite associar
procedimentos(cdigo)aeventosocorridosnocontrole.
Ativarmododetesteexibeodilogocomoseestivesseemexecuo.
InserirControlesnumDilogoumaoperaoemtrspassos:
1) ativaroconedocontrolenoquadrodecontroles;
2) definirareadodilogoondeocontroleserposicionado.Paraistopressioneoboto
esquerdodomouseearrasteformandoumretngulo,emseguida,libereobotodomouse;
3) definiraspropriedadesdocontrole.
Quando um controle adicionado ao dilogo, o OpenOffice.org Basic automaticamente
defineumvalorpadroparacadapropriedade.Paraexibiraspropriedadesdeumcontrole
Introduo ao OpenOffice.org Basic

13

Dilogos Personalizados

Verso 2

selecionado,cliquesobreoconePropriedadesoucliqueduasvezessobreocontrole.Note,
tambm,queajanelaPropriedadespossuiumabarraderolagemparavisualizao.

Figura7:JanelaPropriedades
Vamostrabalharemnossodilogo:
a)Selecioneodilogovazio,clicandonasuabordaexterna.Notequeaparecemmarcasem
tornodomesmo.Podemosusarestasmarcaspararedimensionaronossodilogo.
b)CliquenoconePropriedadesparaexibirasuajanela,comonafiguraacima.Nocampo
TtuloabaGeraldigiteInserirFraseetecleEnter.CliquenobotoSubirdePropriedades
eobserveottulododilogo.
c) Adicione um controle Etiqueta ao dilogo. Para isto, clique no cone Etiqueta, em
seguidadefinaumretngulonapartesuperiordodilogo.Definaasuapropriedadettulopara
Digiteotexto.
d) Coloque uma Caixa de Texto no dilogo, logo abaixo da etiqueta. Observe a sua
propriedade Nome: TextField1. No cdigo fonte, nos referimos a um controle pela sua
propriedade Nome, da a sua importncia. Note, tambm, que este controle no tem a
propriedadeTtulo.
e)Vamoscolocardoisbotes,ladoalado,naparteinferiordodilogo,abaixodacaixade
texto.DefinaosseusttulosparaOKeCancelar.
f)Ajusteodilogoeseuscontrolesdemodoquefiquemcomaaparnciadafiguraabaixo.

14

Introduo ao OpenOffice.org Basic

Verso 2

Dilogos Personalizados

Figura8:DilogoInserirFrase
Bem,terminamosonossodilogo.Vamosverificarasuaaparnciaquandoemexecuo.
CliquesobreoconeAtivarmododetestenoquadrodecontrolese,apsobservarodilogo,
cliqueemseuconeFecharpararetornaraoeditor.
Naprximaseo,daremosfuncionalidadeaonossoDilogo.

2.3 Manipulando Eventos do Dilogo


Vejamos comoodilogoqueacabamos deprojetarvaiinteragircomooperador:apsa
exibiododilogo,ooperadordevedigitarotextoedepoispressionarobotoOkoupode,
simplesmente,pressionarobotoCancelar.Paracadaumadestasaes(emuitasoutras),o
sistemaemitemensagensdeeventos.
Paradarfuncionalidadeaodilogo,precisamosinterceptaroseventosquenosinteressam,isto
,opressionamentodobotoOkouCancelare,emseguida,fazeroprocessamentorequerido.
OIDEBasicpermiteaassociaodeprocedimentosaeventosdecontrolesatravsdajanela
PropriedadesesuaabaEventos.Apalavraprocedimentos,acima,indicaqueprecisamosde
cdigofonte.
NoIDEBasic,selecioneomduloModule1.
NoeditordecdigoBasic,digite(oucopieecole)ocdigofonteabaixo,acimadaSubMain.

PrivateoDialogoasVariant
SubdlgExecutaDialogo
oDialogo=createUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo.execute()
EndSub
SubdlgCancelaDialogo
oDialogo.endExecute()
EndSub
SubdlgInserirFrase

Introduo ao OpenOffice.org Basic

15

Dilogos Personalizados

Verso 2

DimoDocumentoasObject
DimoTextoasObject
DimoCursorVistaasObject
DimoCursorasObject
DimsFraseasString
oDialogo.endExecute()
'noteareferenciaaocontroleTextField1dodialogo
sFrase=oDialogo.Model.TextField1.Text
ifsFrase=""then
exitsub
endif
'obtmomodelododocumento
oDocumento=ThisComponent
'obtmoservioTextdodocumento
oTexto=oDocumento.getText()
'obtmaposiodocursornaGUIecriaumcursordetexto
oCursorVista=oDocumento.getCurrentController().getViewCursor()
oCursor=oTexto.createTextCursorByRange(oCursorVista.getStart())
'insereotextonaposiocorrentedocursor
oTexto.insertString(oCursor,sFrase,FALSE)

EndSub

Nocdigoacima,declaramos avarivel oDialogo(PrivateoDialogoasVariant)forados


procedimentos,oqueatornavisvelemtodoomduloModule1.
Antes de exibir o dilogo, criamos um objeto oDialogo com createUnoDialog() e, para
executlo,chamamososeumtodoexecute.Parafecharodilogochamamososeumtodo
endExecute ( chamado em dois procedimentos). Objetos UNO (criados com createUno)
devemserdeclaradoscomotipoVariantenoObject.
Aseguir,vamosassociarosprocedimentosaoseventosdodilogo.
SelecioneapginaDialog1paraativaroeditordedilogos.
Emnossodilogo,selecioneoboto OK e cliquenocone Propriedades. Surgeajanela
Propriedades,cliquenaabaEventose,emseguida,cliquenoboto direitadocampodo
eventoAoIniciar.SurgeajanelaAtribuirmacroscomoeventoAoIniciarselecionado.Na
rvore Macros, expanda as entradas Primeira_Macro.sxw e Standard, clique sobre
Module1. Surge a relao de procedimentos do mdulo, selecione o procedimento
dlgInserirFraseecliquesobreobotoAtribuir.Parafecharajanela,cliquenobotoOK.

16

Introduo ao OpenOffice.org Basic

Verso 2

Dilogos Personalizados

Figura9:DilogoAtribuirmacro
Agora,repitaospassosacimaparaatribuiroprocedimentodlgCancelaDialogoaoeventoAo
Iniciar,dobotoCancelardonossodilogo.
ParaoOpenOffice.orgBasic,oprimeiroprocedimentonomduloopontodeentradada
macro. Logo, a Sub dlgExecutaDialogo ser automaticamente executada toda vez que
executarmosanossamacro.
Teste a macro e o dilogo personalizado, clicando sobre o cone Executar, na barra de
ferramentasdoIDEBasic.Digiteumafrasequalquernacaixadetextododilogoeclique
sobreobotoOk.Apsaexecuodamacro,verifiqueseafrasefoiadicionadacorretamente
aodocumento.
Noprximocaptulo,vamostransformaronossodilogosimplesnumPilotoAutomtico.

Introduo ao OpenOffice.org Basic

17

Pilotos Automticos

Verso 2

3 Pilotos Automticos

3.1 Introduo
UmPilotoAutomticoumDilogoexibidoemvriospassos.umaformaeficientede
guiarousurionaexecuodeumatarefa.
OOpenOffice.orgtraz,emsuainstalaopadro,vriosPilotosAutomticos.Verifiqueo
funcionamentodeumdeles,selecionandoArquivoPilotoAutomticoCarta.

3.2 Criando um Piloto Automtico


Nestaseo,veremoscomotransformaroDilogoPersonalizadodocaptuloanterior,num
PilotoAutomtico.
Aidiageral,numprimeiropasso,obterafrasee,numsegundopasso,solicitarumaposio
parainserirafrasedigitada.Paradaresteefeitopassoapasso,oOpenOffice.orgpermitea
criaodedilogoscommltiplaspginas.Odilogocomapropriedade Pgina iguala1
serexibidonoprimeiropasso,odapgina2nosegundo,eassimsucessivamente.
OscontrolesdoOpenOffice.orgBasictmumapropriedadePgina(Step),quecontrolaem
qualpginadedilogoeleserexibido.Assim,oscontrolescomapropriedadePginaiguala
1(um)serovisveisnodilogodapgina1(um),aquelescomaPginaiguala2(dois)sero
visveisnodilogodapgina2(dois)eassimpordiante.Umcontroleserexibidoemtodos
ospassosquandoasuapropriedadePginaforiguala0(zero).
Oltimodilogoacessadonoeditordedilogos,independentedonmerodasuapgina,ser
oprimeiroaserexibidonaexecuodamacro.Portanto,apsdesenharosdilogosdoPiloto
Automtico,retorneparaodilogodapgina1(um).Sevocdefinirapginadodilogopara
0(zero),todososcontroles,detodasaspginas,seroexibidos.
NatransformaododilogoemPilotoAutomtico,precisaremosdemaisalgunscontrolese,
tambm,alteraralgumaspropriedadesdoscontrolesexistentes.
Carregue o Writer, abra o documento Primera_Macro.sxw, selecione Ferramentas
Macro,navegueatomoduloPrimera_MacroStandardModule1epressioneoboto
Editar,paraativaroIDEBasic.
Clique sobre a aba Dialog1, ativando o Editor de Dilogos e redimensione o dilogo
tornandoomaislargo.SelecioneosbotesOkeCancelar(cliqueemOk,pressioneatecla
ShiftecliqueemCancelar),movahorizontalmenteestesbotesparaadireita.
NabarradeferramentasdoIDEbasic,cliquenocone Controles eposicioneoquadrode
controlesaoladododilogo.
18

Introduo ao OpenOffice.org Basic

Verso 2

Pilotos Automticos

CliquenoconeBoto,noquadrodecontroleseadicionedoisnovosbotesnodilogo,lado
aladoeesquerdadobotoOk.
Selecioneoboto CommandButton3,cliquenocone Propriedades edefinaapropriedade
Titulopara<<Voltar,altereovalordapropriedadeAtivadodeSimparaNo.
SelecioneobotoCommandButton4edefinaasuapropriedadeTituloparaPrximo>>.
SelecioneobotoOkealtereoseuTtuloparaConcluir.
Selecioneodilogo(cliquenasuabordaexterna)edefinaasuapropriedadePgina(Step)
para1(um).
SelecioneocontroleEtiquetaedefinaasuapropriedadePginapara1(um).
SelecioneocontroleCaixadeTextoedefinaasuapropriedadePginapara1(um).
Agora, retoque a primeira pgina do Piloto Automtico, tornandoa semelhante figura
abaixo.

Figura10:PrimeiraPginadoDilogodoPilotoAutomtico
Bem,vamosprosseguiremnossoprojeto,desenhandoaPgina2doPilotoAutomtico.
Selecione o dilogo e altere a propriedade Pgina para 2 (dois). Note que os controles
EtiquetaeCaixadeTextodesaparecem,poiselespertencemPgina1.Osbotes,quetma
pginaiguala0(zero),continuamvisveis.
Adicioneuma Etiqueta napartesuperioresquerdadodilogoedefinaoseu Ttulo para
Selecioneaposio.Observequeapropriedadepginaiguala2(dois),omesmovalordo
dilogo.
CliquesobreoconeBotodeOpo,noquadrodecontroles,eponhatrsbotesdeopo,
napartesuperiordireitadodilogo,umabaixodooutro.
DefinaoTtulodoprimeirobotodeopoparanoCursoreasuapropriedadeEstadopara
Selecionado.DefinaoTtulodosegundobotodeopoparanoIncio.DefinaoTtulodo
terceirobotodeopoparanoFinal.

Introduo ao OpenOffice.org Basic

19

Pilotos Automticos

Verso 2

Agora,ajusteoscontrolesdasegundapginadoPilotoAutomtico,tornandoasemelhante
figuraabaixo.NotequeobotodeoponoCursoropadro.Aativaoedesativaodos
botesVoltarePrximoserfeitaemtempodeexecuo(pelocdigofonte).

Figura11:SegundaPginadoDilogodoPilotoAutomtico.
ParafinalizarodesenhodoPilotoAutomtico,selecioneodilogoeretorneparaaPgina1
(um), pois oOpenOffice.org, como padro, exibe a ltima pgina acessada no Editor de
Dilogos.
Na prxima seo, veremos o cdigo fonte necessrio para dar funcionalidade ao Piloto
Automtico.

3.3 Manipulando Eventos do Piloto Automtico


OnossoPilotoAutomticotemdoisnovosbotes(VoltarePrximo)eprecisamosdecdigo
fonteparainterceptareprocessarosseuseventos.
AtiveoIDEBasiceseueditoredigite(oucopieecole)ocdigoabaixoacimadaSubMain.

SubdlgProximoDialogo
oDialogo.Model.Step=2
oDialogo.Model.CommandButton3.Enabled=true
oDialogo.Model.CommandButton4.Enabled=false
EndSub
SubdlgVoltarDialogo
oDialogo.Model.Step=1
oDialogo.Model.CommandButton3.Enabled=false
oDialogo.Model.CommandButton4.Enabled=true
EndSub

Antesdeinserirafrase,precisamosverificaraposio,selecionadanosegundopasso(botes
deopo)etrataressaescolhaadequadamente.

20

Introduo ao OpenOffice.org Basic

Verso 2

Pilotos Automticos

Digite o cdigo abaixo na Sub dlgInserirFrase, aps a linha oCursor =


oTexto.CreateTextCursorByRange(...)eantesdalinhaoTexto.insertString(...).

'aposiodafrasenoincioounofinal
ifoDialogo.Model.OptionButton2.State=1then
oCursor.gotoStart(FALSE)
elseifoDialogo.Model.OptionButton3.State=1then
oCursor.gotoEnd(FALSE)
endif

Agora,vamosligarosprocedimentosaoseventosquenosinteressam.
Alterneparaoeditordedilogos.
SelecioneobotoVoltarecliquenoconePropriedades.SurgeajanelaPropriedades,clique
naabaEventose,emseguida,cliquenoboto direitadocampodoeventoAoIniciar.
Surgeajanela Atribuirmacros comoevento AoIniciar selecionado.Narvore Macros,
expanda as entradas Primeira_Macro.sxw e Standard, clique sobre Module1. Surge a
relaodeprocedimentosdomdulo,selecioneoprocedimento dlgVoltarDialogo eclique
sobreobotoAtribuir.Parafecharajanela,cliquenobotoOK.
Seguindoospassosacima,atribuaoprocedimentodlgProximoDialogoaoeventoAoIniciar
dobotoPrximo.
Executeamacroeverifiquesetudoocorreucomooesperado.
Agora,vocpodeseaventurarescrevendosuasprpriasmacros.Comoumpontodepartida,
consulteoprximocaptuloembuscadeinformaescomplementares.

Introduo ao OpenOffice.org Basic

21

Introduo a API do OpenOffice.org

Verso 2

4 Introduo a API do OpenOffice.org

4.1 Viso geral


AAPIdoOpenOffice.orgestorganizadapormdulos.Ummdulocontmumconjuntode
elementosinterrelacionados.DentreosmdulosdaAPI,podemoscitar:
com.sun.star.awt
serviosrelacionadosainterfacedousurio
com.sun.star.beans
serviosparaacessoapropriedades
com.sun.star.container interfacesparacoleeserecipientes
com.sun.star.document serviosparadocumentosdooffice
com.sun.star.drawing
serviosparadesenho
com.sun.star.text
serviosparadocumentostexto
com.sun.star.sdb
serviosparabancodedados
com.sun.star.sheet
serviosparaplanilhas
com.sun.star.util
serviosdeutilidadediversa
Comovocpodenotar,omduloraiz< com.sun.star>etodososoutrosmdulosesto
subordinadosaele.
Normalmente, um mdulo pode conter servios, interfaces, estruturas, enumeraes,
definiesdetipoegruposdeconstantes.Porexemplo,entreoscomponentesencontradosno
mdulobeans,temos:
Services
relaodeserviosdomdulo
Interfaces
relaodeinterfacesdomdulo
Structs
relaodeestruturasdomdulo
Exceptions
relaodeexceesdomdulo
Enums
relaodeenumeraesdomdulo
ConstantGroups
relaodegruposdeconstantesdomdulo
Ummdulonoprecisacontertodosesteselementos.
Simplificandobastante,podemosdizerque:
Umservio(Service),normalmente,representaumobjeto.
Umainterface(Interface)contmasdefiniesdosmtodosreferentesaumdadoobjeto.
Umaestrutura(Struct)umtipodedadocontendoumoumaiscampos.
Umaexceo(Exception)umindicadordeerropassadoaosistemaemtempodeexecuo.
Umaenumerao(Enum)contmumarelaodeconstantesinteiras.
Umgrupodeconstantes(ConstantGroup)definevaloresparadeterminadasconstantes.
Servios(Services),naAPIdoOpenOffice.org,correspondemaobjetos.Umserviopode
incluir outros servios, oferecer interfaces e ter propriedades. No tpico sobre objetos,
apresentaremososservioscommaisdetalhes.

22

Introduo ao OpenOffice.org Basic

Verso 2

Introduo a API do OpenOffice.org

Asestruturassotiposdedadoscontendocampos,domesmotipoouno,agrupadossobum
mesmonome.Comoexemplo,vamosestudaraestrutura<com.sun.star.awt.Size>,utilizada
pordiversosserviosdaAPI.Eladefineotamanhodeumobjetoecontmdoiscampos:
Struct<com.sun.star.awt.Size>
Width
valordotipolongo(Long),especificandoalargura
Height
valordotipolongo(Long),especificandoaaltura
Umaestruturapodeincluiroutrasestruturasouobjetoscomocampos.
Podemosdeclararumavarivelsimplesouumvetordotipoestrutura,comoabaixo:
DimvTamanhoAsNewcom.sun.star.awt.Size
'declaraumavarivelsimples
DimvetorTam(2)AsNewcom.sun.star.awt.Size 'declaraumvetorpara3elementos
DimvTam()AsNewcom.sun.star.awt.Size
'declaraumvetorvazio
OcomandoAsNewutilizadoemdeclaraesdetiposdedadosnosuportadointernamente
peloBasic.Note,ainda,aespecificaocompletadotipodedado.
Oacessoaoscamposdaestruturasedatravsdooperadorponto(.)comoem:
'defineosvaloresdoscamposdaestruturaSizevTamanho
vTamanho.Width=2000
vTamanho.Height=1000
'ou,ainda
nAltura=vTamanho.Height
'acessoaoscamposdeumvetordeestrutura
vetorTam(0).Width=5000
vetorTam(0).Height=2500
Umaenumeraocontmumarelaodeconstantescomvaloresinteirosconsecutivos.Por
exemplo,aenumerao<com.sun.star.awt.PushButtonType>definetipospossveisparaum
boto,soeles:
STANDARD
comportasecomoumbotopadro
OK
comportasecomoumbotoOk
CANCEL
comportasecomoumbotoCancelar
HELP
comportasecomoumbotoAjuda
Normalmente,osvaloresdeumaenumeraosoutilizadoscomopropriedadesdeobjetos,
comoabaixo:
oBotao1.PushButtonType=com.sun.star.awt.PushButtonType.STANDARD
PushButtonType uma propriedade do objeto boto. Devemos fornecer a especificao
completaparaonomedaconstante.
Umgrupodeconstantestambmcontmvaloresparaconstantesrelacionadas,contudoeles
no so, necessariamente, consecutivos. A atribuio das constantes de um grupo a uma
varivelsegueomesmopadrodasenumeraes.

Introduo ao OpenOffice.org Basic

23

Introduo a API do OpenOffice.org

Verso 2

4.2 Objetos
Jdissemosqueumservioumaespecificaodeumobjeto,queenglobaumconjuntode
interfacesepropriedades.Umainterfaceumacoleodemtodos.Umapropriedadeum
valorquedeterminaumacaractersticadeumservio.
Deumamaneiraerrnea,umobjetocomoumaestruturaque,almdoscamposcomuns,
pudesse conter campos especiais definindo procedimentos. Os campos comuns seriam as
propriedades e os especiais os mtodos. Se voc quiser descobrir o porqu da palavra
errnea,procurealgumtextointrodutriosobreprogramaoorientadaaobjetos.
VamosanalisaroservioSpreadsheet,domdulo<com.sun.star.sheet>,querepresentauma
PlanilhanumdocumentodoCalc,parafixarosconceitos.
<com.sun.star.sheet.Spreadsheet>:
Incluioservio:
<com.sun.star.sheet.SheetCellRange>
Exportadiversasinterfaces,entreelas:
<com.sun.star.sheet.XSpreadsheet>
<com.sun.star.container.XNamed>
Possuiaspropriedades:
IsVisible AsBoolean
PageStyle AsString
Umainterfaceolocalaondeosmtodosdosobjetossodefinidos.Noexemploacima,a
interfaceXSpreadsheetdefinemtodosquecriamumcursorparaumaextensodeclulas,
soeles:
createCursor
criaumcursorparatodaaplanilha
createCursorByRange
criaumcursorparaumaextensodeclulas
UmmtodocorrespondeaumprocedimentodalinguagemBasic.
Existeoutracaractersticadasinterfacesquedevesercitada.Umainterfacepodeserderivada
apartirdeoutra(superinterface).Nestecaso,elaherdaosmtodosdasuperinterface.Como
exemplo,vejamosahierarquiadainterfaceXSpreadsheet:
com.sun.star.uno.XInterface
|___com.sun.star.table.XCellRange
|___com.sun.star.sheet.XSheetCellRange
|___com.sun.star.sheet.XSpreadsheet
NotequeXSpreadsheetdefinidaapartirdainterfaceXSheetCellRange,queporsuavez
derivada de XCellRange. A conseqncia prtica disto : todos os objetos que oferecem
XSpreadsheetsuportamosmtodosdeXCellRangeeXSheetCellRange.
Uma propriedade define uma caracterstica de um objeto. Por exemplo, a propriedade
IsVisible,acima, determinaseaplanilha aqueserefereserounovisvelnainterface
grfica.
24

Introduo ao OpenOffice.org Basic

Verso 2

Introduo a API do OpenOffice.org

ObservequeSpreadsheetincluioservioSheetCellRange,istosignificaqueosmtodosdas
suasinterfacese,tambm,assuaspropriedadessosuportadasporSpreadsheet.
Jvimosqueoacessoaoscamposdeumaestruturasedatravsdooperadorponto(.),isto
tambmseaplicaaosmtodosepropriedadesdeumobjeto.Ento,supondoquetemosuma
variveloPlanilha1,dotipoobjetoSpreadsheet,podemosescrever:
oCursor=oPlanilha1.createCursor() 'criaumcursorabrangendotodaaplanilha
bVisivel=oPlanilha1.IsVisible
'atribuiabVisivelovalordapropriedadeIsVisible
Devemoslembrarqueummtodopodeounoretornarumvalor.Noprimeirocasoelesse
assemelhamsfunese,nosegundo,ssubrotinasdoBasic.
Existempropriedadesquesorepresentadasporestruturas.UmadasmaisutilizadasnaAPI
doOpenOffice.orgaestrutura<com.sun.star.beans.PropertyValue>,comquatrocampos,
entreosquaisopar:
Name
Value

cadeiacomonomedapropriedade(sensvelamaisculas/minsculas).
tipodedadoVariantcomovalordapropriedade.

O servio MediaDescriptor, que contm muitas propriedades referentes a abertura e


gravaodedocumentos,podeserrepresentadoporumvetordaestruturaPropertyValue.

4.3 Definindo objetos


Paracriarumservio,usamosafunoBasic createUnoService(), queretornaumobjeto
comsuporteaoservioouNull,senoforpossvelacriao.Porexemplo,paraobtero
servioDesktopusamosachamada:
oDesktop=createUnoService(com.sun.star.frame.Desktop)

Oparmetrodafunoaespecificaocompletaparaoservio.Todososserviosiniciam
comcom.sun.star,emseguidavemonomedomdulo,nestecaso,framee,porfim,onome
doservioDesktop.Note,tambm,queaespecificaopassadacomoumacadeia.
Apsachamada,podemosverificarseoserviofoicriadocom:
IfisNull(oDesktop)Then
'Erronacriaodoservio
EndIf

ExistemserviosquepodemsercriadosatravsdechamadasamtodosdaAPI.Porexemplo,
um documento do Writer pode conter objetos como texto e desenhos. Os servios que
representamestesobjetospodemsercriadosdeduasmaneiras:
Naprimeira,usamosummtodoexclusivoparaestafinalidade:
oObjetoTexto=oDocumento.getText()
OmtodogetText,retornaumobjetocomocontedotextodeumdocumentodoWriter.
Introduo ao OpenOffice.org Basic

25

Introduo a API do OpenOffice.org

Verso 2

Nasegunda,podemoschamarumdosmtodosdogerentedeservios:
oObjetoLinha=oDocumento.createInstance(com.sun.star.drawing.LineShape)
OmtodocreateInstancecriaoobjeto(servio)especificadocomoparmetro.
Umservio(objeto)pode,tambm,serpartedaspropriedadesdeumoutroobjeto.Nestecaso,
eleserobtidocomooresultadodeumachamadaaomtodogetPropertyValue():
oPropriedade=oObjeto.getPropertyValue(Nome_da_Propriedade)
OmtodogetPropertyValueretornaumobjeto,seovalordapropriedadeforumobjeto.
Diversosserviossodependentesdeumcontexto.Porexemplo,vocnopodecriaruma
clula fora de uma planilha. Outros servios no precisam de um ambiente para operar.
Existem, ainda, servios que no oferecem nenhuma interface, servindo unicamente para
obteredefinirpropriedades.
OBasicofereceduaspropriedadesquefacilitamoacessoaservios,soelas:
StarDesktop equivalente ao objeto retornado por uma chamada funo
createUnoService(com.sun.star.frame.Desktop).Digiteocdigoabaixonumanovasub
rotina,executeeobserveoresultado:
MsgBoxStarDesktop.Dbg_SupportedInterfaces
'
'omesmoque:
'
DimoDesktop
oDesktop=CreateUnoService("com.sun.star.frame.Desktop")
MsgBoxoDesktop.Dbg_SupportedInterfaces

ThisComponentretornaoobjetodocumentoquecontmocdigoBasic,existeapenasem
documentosdoWriter,Calc,ImpressouDraw.Algumasdesuasinterfacesdependemdotipo
dedocumento.
DimoDocumentoAsObject
oDocumento=ThisComponent

OOOoBasictemtrspropriedadesmuitoteisparaainspeodeobjetos,soelas:
Dbg_SupportedInterfaces
retornaasinterfacessuportadaspeloobjeto
Dbg_Properties
retornaaspropriedadesdoobjeto
Dbg_Methods
retornaosmtodossuportadospeloobjeto
Paraobterestaspropriedades,useaforma Objeto.Propriedade.Porexemplo,verifiqueas
interfacessuportadaspelomodelodedocumento,executandoocdigoabaixo:
SubMain

26

Introduo ao OpenOffice.org Basic

Verso 2

Introduo a API do OpenOffice.org

MsgBoxThisComponent.Dbg_SupportedInterfaces
EndSub

Ainterfacecom.sun.star.lang.XServiceInfopossuiosmtodosabaixo,teisparainspeode
servios:
getImplementationName()AsString
retornaonomedeimplementaodoservio
supportsService(sNomeAsString)AsBoolean
retornaTrueseoserviosNomeforsuportado
getSupportedServiceNames()AsString()
retornaumconjuntodecadeiascomosnomesdosserviossuportados,inclusiveosindiretos
Vamosusarasfacilidadesdeinspeodeobjetos,oferecidaspeloOpenOffice.orgBasic,para
verificaroservioSpreadsheet.NumdocumentodoCalc,crieamacroabaixoeexecutea
observandoasada:
SubservicoSpreadsheet
'exibeinfodoservioSpreadsheet
oDocumento=ThisComponent
oSheet=oDocumento.Sheets(0)
'serviossuportados
sServ=oSheet.getSupportedServiceNames()
sMsg=""
Fori=0ToUBound(sServ())
sMsg=sMsg+sServ(i)+Chr$(10)
Nexti
MsgBoxsMsg
'interfacessuportadas
MsgBoxoSheet.Dbg_SupportedInterfaces
'mtodos
MsgBoxoSheet.Dbg_Methods
'propriedades
MsgBoxoSheet.Dbg_Properties
EndSub

Duranteaexecuo,seroexibidososservios,interfaces,mtodosepropriedadessuportadas
peloobjetoSpreadsheet.
Naprximaseo,vamosapresentarumexemplo,queutilizadiversosconceitosapresentados
nestecaptulo.

4.4 Criando um novo documento


Vamos,agora,desenvolverumasubrotinaparacriarumnovodocumentoapartirdeum
modelo existente. O cdigo fonte Basic, em linhas gerais, precisa tratar dos seguintes
detalhes:
a)obterocaminhocompletoparaoarquivomodelo;
b)carregaroarquivo,informandoaoOpenOffice.orgquesetratadeummodelo;
Introduo ao OpenOffice.org Basic

27

Introduo a API do OpenOffice.org

Verso 2

AsubrotinaSubcriaNovoDocumento,abaixo,executaestastarefasapropriadamente.
'
'Criaumnovodocumentoapartirdeummodelo
'
SubcriaNovoDocumento
DimoDesktopAsVariant
DimoDocumentoAsObject
DimmPropArquivo(0)AsNewcom.sun.star.beans.PropertyValue
DimsUrlAsString
'criaoobjetooDesktop
oDesktop=createUnoService("com.sun.star.frame.Desktop")
'defineaURLdoarquivomodelo,ALTEREparaseusistema
sUrl="file:///D:/nad/openoffice/documentation.stw"
'defineapropriedadeAsTemplateparaTrue
mPropArquivo(0).Name="AsTemplate"
mPropArquivo(0).Value=True
'criaoobjetooDocumento
oDocumento=oDesktop.loadComponentFromURL(sUrl,"_blank",0,mPropArquivo())
'INSERIRCDIGOPARASALVARAQUI(estamacroserreutilizadaadiante)
EndSub

AslinhasiniciadaspelocomandoDimdeclaramtodasasvariveisusadaspelasubrotina.
Paracarregarumarquivo,usamosomtodoloadComponentFromURL(),quedefinidopor
umainterface(XComponentLoader)doservio Desktop.Ento,precisamos deumobjeto
UNODesktop,declaradonalinhaDimoDesktopAsVariant.Aqui,otipoVariantsegueuma
recomendaodoDevelopersGuideparaadeclaraodeobjetosUNO.
AvarivelsUrl(tipoString)recebeaespecificaocompletadocaminhoparaoarquivo.Ser
passadacomoparmetrodomtodoloadComponentFromURL().
O mtodo loadComponentFromURL() retorna um objeto Document. A linha Dim
oDocumentoAsObjectreservamemriaparaesteobjeto.
O mtodo loadComponentFromURL(), recebe uma sequncia de propriedades como
parmetro.Alinha DimmPropArquivo declaraedefineumvetorpara estasequncia.A
definio do objeto feita com o operador New seguido do tipo de objeto (As New
com.sun.star.beans.PropertyValue).
AlinhaoDesktop=createUnoService(...)seencarregadacriaodoobjetoDesktop.
A linha oDocumento = oDesktop.loadComponentFromURL(...) carrega o documento de
acordocomos parmetros eretornaumobjetodotipoDocument. Notequeasequncia
mPropArquivopassadacomoargumentoseguidade().Oparmetro_blanksignificaque
umnovoquadrosercriadoparaodocumento.
Pronto,agoradigite(oucopieecole)aSubcriaNovoDocumento,alterandoavarivelsUrl
paraconterumcaminhocompletodoseusistema,eexecuteamacroparaverseuresultado.
No prximo captulo, aprenderemos mais sobre programao com documentos do
OpenOffice.org.

28

Introduo ao OpenOffice.org Basic

Verso 2

Trabalhando com Documentos

5 Trabalhando com Documentos

5.1 Carregando Documentos


ParacarregaroucriarumdocumentodoOpenOffice.orgdevemos:
a)CriarumobjetoDesktop
DimoDesktopAsVariant
oDesktop=createUnoService(com.sun.star.frame.Desktop)

b)DefiniraURL
Vocdevefornecerumacadeiadecaracterescomaespecificaocompletadocaminhodo
documento,casoestejaabrindoumdocumentoexistente,naforma:
file:///caminho_completo_do_arquivo
Paranovosdocumentos,criadosapartirdomodelopadro,existemURLsprdefinidas,que
devemserusadasdeacordocomotipodedocumento:
URL

Descrio

private:factory/swriter

Cria um novo documento do Writer

private:factory/scalc

Cria um novo documento do Calc

private:factory/sdraw

Cria um novo documento do Draw

private:factory/simpress

Cria um novo documento do Impress

c)Definiraspropriedadesdodescritordemdia
Odescritordemdiaumservio(com.sun.star.document.MediaDescriptor)quedefinecomo
umrecursodevesercarregado.Aspropriedadesdodescritorsodefinidasnumasequncia
com.sun.star.beans.PropertyValue.Declareumvetorparaasequncia,deacordocomo
nmerodepropriedadesaalterar,comoabaixo:
'declaraumvetorvazio,paraefeitodepassagemcomoparmetro
DimmPadrao()
'defineumvetorpara1propriedade(ndice0)
DimmPropArquivo(0)AsNewcom.sun.star.beans.PropertyValue
mPropArquivo(0).Name="AsTemplate"
mPropArquivo(0).Value=True
'defineumvetorpara2propriedades(ndices0e1)
DimmPropriedades(1)AsNewcom.sun.star.beans.PropertyValue

Introduo ao OpenOffice.org Basic

29

Trabalhando com Documentos

Verso 2

Seguemasdescriesdealgumaspropriedades(existemvrias):
Propriedade

Tipo

Descrio

AsTemplate

Boolean Se True cria um novo documento, a partir do


documento carregado, mesmo que ele no seja um
modelo. Se for um modelo e AsTemplate for False o
documento ser carregado para edio.

FilterName

String

Define um filtro a ser usado para carregar ou salvar o


documento.

JumpMark

String

Aps a carga, salta para uma posio (clula,


bookmark, etc).

Hidden

Boolean Se True, o documento no ser exibido na interface


grfica

Overwrite

Boolean Sobrescreve um documento ao salvar. Padro True.

ReadOnly

Boolean Se o documento deve ser somente leitura ou leitura /


gravao.

Unpacked

Boolean Na gravao o documento no ser compactado (zip).

Password

String

Senha para gravar ou carregar o documento.

d)Definiroquadrodedestino
oframeondeodocumentosercarregado/criado,sejexistirumquadrocomonome
especificado,eleserusado,senoumnovosercriado.
Osnomesprdefinidos,aseguir,nuncadevemserusadoscomonomedequadros:_blank;
_default;_self;_parent;_tope_beamer.Use_blankparacriarumnovoquadro.
e)Definiroflagdebusca
umaconstantequedefineotipodealgoritmousadoparaencontraroquadrodedestino.Use
umvalor0paradesconsiderar.
f)ChamaromtodoloadComponentFromURL()
Estemtodo,doobjetoDesktop,carregaocomponentedefinidopelaURL,dentrodoquadro
dedestino.Vejamosseusdetalhes:
loadComponentFromURL(URLAsString,
FrameDestinoAsString,
FlagBuscaAsLong,
Propriedades()As<com.sun.star.beans.PropertyValue>)
OvalorderetornoumobjetoXComponentouNullemcasodeerro.
Eisumexemplodechamada:

30

Introduo ao OpenOffice.org Basic

Verso 2

Trabalhando com Documentos

oDocumento=oDesktop.loadComponentFromURL(sUrl,"_blank",_
0,mPropArquivo())

Istotudo,analisenovamenteocdigodaSubcriaNovoDocumento,docaptuloanterior.

5.2 Salvando Documentos


Parasalvarumdocumento,devemos:
(asletrasa),b)ec),abaixo,foramvistasnoitem5.1Carregandodocumentos)
a)CriarumobjetoDocument
Nomalmente,porumachamadaaloadComponentFromURL()ouThisComponent.
b)DefiniraURL
Tratasedocaminhocompletodorecurso.
c)Definiraspropriedades
Soaspropriedadesdodescritordemdia.
d)Chamaromtodoadequado
OsdocumentosdoOpenOffice.orgsuportamosmtodosabaixoparasalvarcomponentes:
store()
storeAsURL(sURLAsString,PropriedadesAs<com.sun.star.beans.PropertyValue>)
storeToURL(sURLAsString,PropriedadesAs<com.sun.star.beans.PropertyValue>)
Omtodostore()simplesmentesobrescreveumarquivoenodeveserusadonumnovo
documentosemnome.
OmtodostoreAsURL()recebedoisparmetrosefuncionacomoocomandoSalvarComo
doOpenOffice.org.
OmtodostoreToURL()recebedoisparmetros,salvaocontedododocumentoemsURL
enoalteraoarquivooriginal.tilparaexportararquivos.
Exemplosdechamadas:
'salvaumdocumentoquejexiste
ThisComponent.store()
'ou,supondoqueoDocumentofoidefinido
oDocumento.store()

DocumentosabertoscomloadComponentFromURL(),devemusarosmtodosstoreAsURL
oustoreToURL.
Comoexemplo,digite(oucopieecole)ocdigofonteabaixo,apsalinha
'INSERIRCDIGOPARASALVARAQUI

Introduo ao OpenOffice.org Basic

31

Trabalhando com Documentos

Verso 2

da SubcriaNovoDocumento(),editeavarivel sUrl conformeoseusistema,executea


macroeverifiquequeumnovoarquivofoigravadoemsURL..
'
'Gravaonovoarquivo
'
'DefineaURLdonovoarquivo(ALTEREparaseusistema)
sUrl="file:///D:/nad/openoffice/novo_texto.sxw"
'defineapropriedadeOverwriteparaFalse
mPropArquivo(0).Name="Overwrite"
mPropArquivo(0).Value=FALSE
'gravaonovodocumento
oDocumento.storeAsURL(sUrl,mPropArquivo())

Temos,ainda,osmtodosabaixo,relacionadoscomatarefadesalvararquivos:
isModified()AsBoolean
RetornaTrueseorecursofoimodificado,senoretornaFalse.
hasLocation()AsBoolean
RetornaTrueseoarquivojexiste(foigravado),senoretornaFalse.
GetLocation()AsString
RetornaumaStringcomaURLdorecurso.
isReadonly()AsBoolean
RetornaTrueseforsomenteleitura,emcasocontrrioretornaFalse
Aseguir,temosumfragmentodecdigomaiselaboradoparasalvararquivos:
If(oDocumento.isModified)Then
If(oDocumento.hasLocationAnd(NotoDocumento.isReadOnly))Then
oDocumento.store()
Else
oDocumento.storeAsURL(sURL,mPropArquivo())
EndIf
EndIf

5.3 Imprimindo Documentos


OservioOfficeDocumentcontmainterfaceXPrintable,queforneceosmtodosparaa
impressoedefiniodeimpressoranoOpenOffice.org,soeles:
getPrinter()AsVariant<com::sun::star::beans::PropertyValue>
setPrinter(aImpressoraAsVariant<com::sun::star::beans::PropertyValue>)
print(xOpcoesAsVariant<com::sun::star::beans::PropertyValue>)
Vamosanalisarascaractersticasechamadasdecadaumdestesmtodos.
getPrinter()AsVariant<com::sun::star::beans::PropertyValue>

32

Introduo ao OpenOffice.org Basic

Verso 2

Trabalhando com Documentos

Este mtodo retorna uma sequncia com o descritor da impressora corrente. O descritor
(PrinterDescriptor) contmafiladeimpressoeasdefinies daimpressora,conformea
tabelaabaixo:
Propriedade

Descrio

Name

Uma cadeia (String) com o nome da fila de impresso

PaperOrientation

Contm a orientao do papel

PaperFormat

Especifica um tamanho de papel padro ou definido


pelo usurio

PaperSize

Especifica o tamanho do papel em 1/100 mm

IsBusy

True se a impressora estiver ocupada; False seno

CanSetPaperOrientation True se a impressora permite mudar a orientao do


papel
CanSetPaperFormat

True se a impressora permite mudar o formato do


papel

CanSetPaperSize

True se a impressora permite mudar o tamanho do


papel
Asquatroltimaspropriedadessosomenteleitura.
Vejamosumexemploqueacessaaspropriedadesdaimpressoracorrente:

SubobtemDescritorImpressora
DimoDocAsObject
DimoDescImprAsVariant
DimsMsgAsString

oDoc=ThisComponent
'obtemovetordeestruturasPrinterDescriptor
oDescImpr=oDoc.getPrinter()
'obtemtamanhodovetordeestruturas
iNrEstruturas%=UBound(oDescImpr)
'extraiosnomesdaspropriedadesdaimpressora
Forn=0ToiNrEstruturas%
sMsg=sMsg+oDescImpr(n).Name+""
Nextn
'exibeosnomesdaspropriedades
MsgBoxsMsg,0,"PropriedadesImpressora"
'obtemeexibeovalordapropriedadePageFormat
'A3=0;A4=1;Letter/Carta=5;...
MsgBoxoDescImpr(2).Value
'verificasePageFormatpodeseralterada
IfoDescImpr(6).ValueThen
MsgBox"FormatodaPgina,podeseralterado!"
'entoalteraparaA4
oDescImpr(2).Value=1
Else
MsgBox"FormatodaPgina,nopodeseralterado!"
EndIf
'exibeovalordePageFormatnovamente

Introduo ao OpenOffice.org Basic

33

Trabalhando com Documentos

Verso 2

MsgBoxoDescImpr(2).Value
EndSub

OcdigoacimachamaomtodogetPrinter()paraobteraspropriedades daimpressora
corrente.Emseguida,nolaoFor...Next,extraiosnomesdecadapropriedade.E,mais
abaixo,obtmealteraoformatodapgina,sepossvel.
setPrinter(aImpressoraAsVariant<com::sun::star::beans::PropertyValue>)
Atribuiumanovaimpressoraaodocumento.Podeimplicarnumareformatao.
Aspropriedadesdaimpressorasoasmesmasdatabelaacima.
print(xOpcoesAsVariant<com::sun::star::beans::PropertyValue>)
Imprimeodocumentodeacordocomasopesdeimpresso(PrintOptions)emxOpcoes.
Estasopessodescritasnatabelaaseguir:
Opo

Descrio

CopyCount

( Int ) Especifica o nmero de cpias a imprimir

FileName

Cadeia com o nome de um arquivo para a impresso

Collate

Se True todo o documento ser impresso antes da


prxima cpia, seno imprime todas as cpias pgina
a pgina

Pages

Uma cadeia com as pginas a serem impressas, por


exemplo: 1;3;5-8;12

Vejamosalgunsexemplosdecdigofonte.Paraimprimirumdocumento:
'imprimirodocumentocomasdefiniescorrentes
DimaOpcoes()
oDocumento.print(aOpcoes())

Paraimprimirsomenteaspginas1;3;58e12.
DimaOpcoes(0)
aOpcoes(0).Name=Page
aOpcoes(0).Value=1;3;58;12
ThisComponent.print(aOpcoes())

Paraimprimirnumaimpressoraquenoapadro,vocprecisaalterarapropriedadeName
daimpressoraechamarsetPrinterdefinindoumanovaimpressora,comoabaixo:
DimmImpressora(0)AsNewcom.sun.star.beans.PropertyValue
DimaOpcoes()'somenteparapassaroparmetro

34

Introduo ao OpenOffice.org Basic

Verso 2

Trabalhando com Documentos

'
mImpressora(0).Name="Name"
mImpressora(0).value="Segunda_Impressora"
'defineanovaimpressoraparaoobjeto,
'podeocorrerumaformataododocumento
oDocumento.setPrinter=mImpressora()
'imprimecomasopcoespadro
oDocumento.print(aOpcoes())

5.4 Fechando Documentos


Parafecharumdocumento,devemosconsiderardoiscasos:
a)AbertocomloadComponentFromURL()
VimosqueestemtodoretornaumobjetoXComponent.Ainterfacedesteservioforneceo
mtododispose(),queusadoparafecharumcomponente,suachamadasimples:
oDocumento.dispose()

AcrescentealinhaacimaapsaltimalinhadaSubcriaNovoDocumento(),executeamacro
eobserveoresultado.
b)AbertopelainterfacedoOpenOffice.org
SeodocumentofoicarregadocomocomandoArquivoAbrirdoOpenOffice.orgeno
houveadefiniodeumobjetoDocument,useapropriedadeThisComponent,comoabaixo:
ThisComponent.dispose()

Cuidado,omtododispose()descartatodasasalteraesefetuadasnodocumento.Portanto,
antes de chamlo, certifiquese de gravlas. Ou, ainda, use isModified() para alertar o
usurio.
Existemmaneirasmaissegurasparacontrolarofechamentodecomponentes,pormesto
almdoescopodestaIntroduo.

5.5 Identificando os Documentos Abertos


Todos os documentos abertos so gerenciados pelo objeto Desktop. Cada documento
consideradoumcomponentedesteobjeto,contudonemtodocomponenteumdocumento.
Porexemplo,setivermosumaplanilhaeumdocumentodetextoabertos,comoNavegador
de Fonte de Dados ativo, existem trs componentes no Desktop, dos quais dois so
documentos.
ASubexibeComponentes,abaixo,obtmumaenumeraodoscomponentesativos,verifica
quaissomodelosdedocumentoseexibeinformaessobreoseutipo.

Introduo ao OpenOffice.org Basic

35

Trabalhando com Documentos

Verso 2

SubexibeComponentes
DimoComponentesAsVariant
DimoCompAsVariant
DimsURLAsString
DimsTipoAsString
oComponentes=StarDesktop.getComponents().createEnumeration()
n=0
DoWhile(oComponentes.hasMoreElements())
oComp=oComponentes.nextElement()
'nemtodoscomponentessomodeloscomumaURL
IfHasUnoInterfaces(oComp,"com.sun.star.frame.XModel")Then
sURL=oComp.getURL()
IfoComp.SupportsService("com.sun.star.sheet.SpreadsheetDocument")Then
sTipo="Calc"
ElseIfoComp.SupportsService("com.sun.star.text.TextDocument")Then
sTipo="Writer"
ElseIfoComp.SupportsService("com.sun.star.drawing.DrawingDocument")Then
sTipo="Draw"
ElseIfoComp.SupportsService("com.sun.star.formula.FormulaProperties")Then
sTipo="Math"
Else
sTipo="Outro"
EndIf
MsgBoxsTipo+Chr$(13)+sURL
EndIf
n=n+1
Loop
MsgBox"Componentes:"+Str$(n)
EndSub

Analise atentamente o cdigo fonte acima, ele demonstra aspectos importantes da


programaodaAPIdoOpenOffice.org.Notecomosedacriaodeumaenumeraoe
comovisitamososseuselementos.
Apsaidentificaodeumdocumento,vocpode,porexemplo,comandarasuaimpresso
ouoseufechamento,alm,claro,depodermanipularoseucontedo,aplicandoastcnicas
queserovistasnosprximoscaptulos.

36

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

6 Documentos do Writer

6.1 Introduo
Neste captulo, veremos como efetuar tarefas simples de processamento de texto, como:
edio,formatao,buscaesubstituio.
Vamos abordar o assunto atravs de exemplos prticos, com uma breve explicao dos
aspectosmaisimportantes.
UmdocumentodoWritercontmprincipalmentetexto,organizadoempargrafosetabelas.
Almdesteselementosbsicos,elesuportamolduras,objetosembutidos,campos,grficos,
marcadores, ndices e muitos outros objetos. Estes dados compreendem um modelo de
documento.
Atravsdomodelo,podemosmanipularosdadosindependentementedasuarepresentao
visual. Para lidar com o aspecto visual do documento, o modelo dispe de um objeto
controlador.
Alguns elementos de um documento (grficos, molduras, etc) so nomeados e esto
ancoradosnumpargrafo,caractereoupgina.Ospargrafosnorecebemumnomeenem
umndice,demodoqueseuacessodevesersequncial.

6.2 Editando texto


Antesdecomearaeditarotextodeumdocumento,devemosteremmenteoseguinte:
a)Criarumainstnciadocomponenteaeditar,isto,umobjetoquerepresenteodocumento
doWriter;
b)Obterocontedoaeditar,nestecaso,umobjetocomotextododocumento;
c)Fazeraediodocontedo,usandoosmtodosapropriados.
CrieumnovodocumentodoWriter,vparaoIDEBasic,digiteocdigoabaixoeexecutea
SubeditaTextoparaveroresultado.
SubeditaTexto
DimoDocAsObject
DimoTxtAsObject
DimoTxtRangeAsObject
DimsStrAsString

oDoc=ThisComponent
oTxt=oDoc.getText()
sStr="Estauma"
oTxt.setString(sStr)
oTxtRange=oTxt.getEnd()

Introduo ao OpenOffice.org Basic

37

Documentos do Writer

Verso 2

sStr="cadeiadecaracteres"
oTxtRange.setString(sStr)
EndSub

Nesteexemplo,usamosainterfaceXTextRangeparaeditartexto.Eisosseusmtodos:
getText()AsText
retornaumobjetoText
getString()AsString
retornaaStringcontidanoobjeto
setString(sStrAsString)
defineaStringcomoocontedodoobjeto
getStart()AsObject<TextRange>
retornaumobjetoTextRangeapontandoparaoinciodoobjetochamador
getEnd()AsObject<TextRange>
retornaumobjetoTextRangeapontandoparaofinaldoobjetochamador
Inicialmente, chamamos o mtodo getText ( ), que retorna um objeto Text, este passo
correspondeaoitemb)acima.
Emseguida,nalinha oTxt.setString(sStr),definimosumacadeiadecaracteresparaonosso
objetoText,istosignificaquetodoocontedododocumentoobjetooTxtsersubstitudo
pela cadeia sStr de setString. Antes de inserir mais texto, precisamos obter o final do
contedodeoTxtcomachamadaaomtodogetEnd()eusarestenovoobjetoTextRange
parainserirmaistexto.AtravsdomtodogetStart,poderamosinserirtextonoincio.
Note,ainda,queasvariveisdosserviosTexteTextRangesodeclaradascomoObject.
Ateno,oTxttambmumTextRange,assimpodemossubstituiravariveloTxtRangepelo
encadeamentodemtodosabaixo:
oTxt.getEnd().setString(sStr)
Esteprocessodeediomuitolimitado.Podemosapenassubstituirtodoocontedodotexto
einserirtextonoincioounofinaldodocumento.

6.3 Movendo-se pelo texto


Paraaumentaraflexibilidadenaediodetexto,omodelodedocumentonosoferecedois
tiposdecursor:umcursordetextoeumcursordavista.Oprimeirooperasobreocontedo
dodocumentoindependentedainterfacegrficaeosegundorepresentaocursorvisvelna
interfacegrfica.Vocpodecriarquantoscursoresdesejar.
Oalcancedeumcursortemumincioeumfinal,quepodeabrangerumafaixavarivelde
textooucoincidirnummesmoponto.Oalcancedocursorpodeserexpandidoduranteo
deslocamentodomesmo.
38

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

NoWriter,almdocursordetexto,temosainda:cursordepalavra,cursordesentenae
cursordepargrafo,todosderivadosdocursordetexto.
Vejamos,agora,asinterfacesemtodosusadosparaflexibilizaraediodetexto.
AinterfaceXSimpleText,derivadadeXTextRange,usadanacriaodocursordetexto,na
inserodecadeiasedecaracteresdecontrole,elapossuiosseguintesmtodos:
createTextCursor()AsObject<TextCursor>
Retornaumobjetocursordetexto(noinciodocontedo)
createTextCursorByRange(aPosAsTextRange)AsObject<TextCursor>
Criaumobjetocursordetextonaposioespecificadanoparmetro
insertString(aPosAsTextRange,sStrAsString,bFlagAsBoolean)
Insereacadeianaposio.SebFlagforTrueocontedodeaPossersubstitudoporsStr,
senosStrseracrescentadanofinaldeaPos.
insertControlCharacter(aPosAsTextRange,iCharAsInteger,bFlagAsBoolean)
InsereumcaracteredecontrolenaposioaPos.
OservioTextCursor,atravsdainterfaceXTextCursor,provmtodosparaocontroledo
estadoemovimentaodocursor.
a)Mtodosparamoverocursor:
goLeft(iNrCharAsInteger,bExpandeAsBoolean)AsBoolean
moveocursorparaaesquerdaiNrCharcaracteres
goRight(iNrCharAsInteger,bExpandeAsBoolean)AsBoolean
moveocursorparaadireitaiNrCharcaracteres
gotoStart(bExpandeAsBoolean)
moveocursorparaoinciodotexto
gotoEnd(bExpandeAsBoolean)
moveocursorparaofinaldotexto
gotoRange(xRangeAs<TextRange>,bExpandeAsBoolean)
moveouexpandeocursorsobreoobjetoTextRange
Emtodososmtodosacima,sebExpandeforTrueoalcancedocursorserexpandido.
b)Mtodosparacontrolaroestadodocursor:
collapseToStart()
moveaposiodofinaldocursorparaoseuincio
collapseToEnd()
moveaposiodoinciodocursorparaoseufinal
isCollapsed()AsBoolean
retornaTrueseasposiesinicialefinaldocursorforemiguais
As interfaces XWordCursor, XSentenceCursor e XparagraphCursor, todas derivadas de
XTextCursor,tambmfornecemmtodosparacontroleemovimentodocursor.

Introduo ao OpenOffice.org Basic

39

Documentos do Writer

Verso 2

a)MtodosdeXWordCursor:
gotoNextWord(bExpandeAsBoolean)AsBoolean
gotoPreviousWord(bExpandeAsBoolean)AsBoolean
gotoEndOfWord(bExpandeAsBoolean)AsBoolean
gotoStartOfWord(bExpandeAsBoolean)AsBoolean
isStartOfWord()AsBoolean
isEndOfWord()AsBoolean
b)MtodosdeXSentenceCursor:
gotoNextSentence(ExpandeAsBoolean)AsBoolean
gotoPreviousSentence(bExpandeAsBoolean)AsBoolean
gotoStartOfSentence(bExpandeAsBoolean)AsBoolean
gotoEndOfSentence(bExpandeAsBoolean)AsBoolean
isStartOfSentence()AsBoolean
isEndOfSentence()AsBoolean
c)MtodosdeXParagraphCursor:
gotoStartOfParagraph(bExpandeAsBoolean)AsBoolean
gotoEndOfParagraph(bExpandeAsBoolean)AsBoolean
gotoNextParagraph(bExpandeAsBoolean)AsBoolean
gotoPreviousParagraph(bExpandeAsBoolean)AsBoolean
isStartOfParagraph()AsBoolean
isEndOfParagraph()AsBoolean
Antesdeapresentarumexemplo,vejamososcaracteresdecontrolequepodemserinseridos
num documento do Writer. Na interface grfica, eles so chamados de caracteres no
imprimveisetmfunesespeciaisnaapresentaofinaldodocumento.
Parafacilitaroseuemprego,estescaracteresestodefinidoscomoconstantes,nogrupode
constantes com.sun.star.text.ControlCharacter. Eles podem ser inseridos no texto com o
mtodo insertControlCharacter () oucomopartedocontedodeumacadeia,nestecaso,
usandooseucdigoUnicode.
Eisumarelaodoscaracteresdecontrolecomosseusrespectivoscdigos:
PARAGRAPH_BREAK Insere uma quebra de pargrafo

0x000D

LINE_BREAK

Quebra de linha dentro de um pargrafo

0x000A

HARD_HYPHEN

Caractere que aparece como um travesso. Hifenizao 0x2011


no remove.

SOFT_HYPHEN

Marca uma posio preferida para hifenizao.

0x00AD

HARD_SPACE

Espao com tamanho fixo.

0x00A0

APPEND_PARAGRAP Acrescenta um novo pargrafo


H

40

No tem

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

Vamos encerrar esta seo com um exemplo demonstrando o emprego de alguns dos
conceitosemtodosapresentados.
AtiveoIDEBasic,digite(oucopieecole)ocdigofonteaseguireexecuteasubrotinaSub
processaTexto.Elainseretexto,caracteresdecontroleeumaquebradepginanumnovo
documentosemnome.Depois,selecionaesubstituiduaspalavrasporumacadeiavazia.
SubprocessaTexto
DimoDesktopAsVariant
DimoDocAsObject
DimoCursorAsObject
DimoTextoAsObject
DimmPropArquivo()
DimsStrAsString
oDesktop=createUnoService("com.sun.star.frame.Desktop")
oDoc=oDesktop.loadComponentFromURL("private:factory/swriter",_
"_blank",0,mPropArquivo())
oTexto=oDoc.getText()
oCursor=oTexto.createTextCursor()
sStr="Esteotextodoprimeiropargrafododocumento"
WithoTexto
'insereotextonaposiocorrentedocursor
.insertString(oCursor,sStr,False)
'insereumpargrafo
.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
.insertString(oCursor,"Esteosegundopargrafo",False)
.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
EndWith
'insereumanovapgina
oCursor.gotoStartOfParagraph(True)
oCursor.breakType=com.sun.star.style.BreakType.PAGE_BEFORE
oTexto.insertString(oCursor,"Estounumanovapgina.",False)
'moveocursorsemexpanso
oCursor.gotoStart(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
'moveocursorexpandindo,i.,selecionatextodo
oCursor.gotoNextWord(True)
oCursor.gotoNextWord(True)
'substituiotextoentreoincioeofinaldocursor
oTexto.insertString(oCursor,"",True)
EndSub

Nocdigoacima,estudeoempregodoparmetro bExpande (TrueouFalse)elemuito


importante.
Outroaspectoainserodaquebradepgina.Noexisteumcaracteredecontrolepara
quebradepginaoucoluna.Elaumapropriedadedopargrafo.NotequeusamosoCursor
paradefinirumapropriedadedopargrafo(oCursor.breakType).Isto possvelporqueo
objetoTextCursorherdacaractersticasdeTextRange.
Introduo ao OpenOffice.org Basic

41

Documentos do Writer

Verso 2

Os valores possveis para a propriedade breakType (quebra de pgina e coluna) esto


enumeradosemcom.sun.star.style.BreakType,aquiusamosPAGE_BEFORE.
Finalmente, observe, no novo documento, que o cursor da vista encontrase no final do
mesmo,apesardaltimaao(seleoesubstituio)terocorridonoprimeiropargrafo,o
quedemonstraaindependnciaentreocursordetextoeainterfacegrfica.
Lembrese,ainda,queoacessointerfacegrficasedatravsdocontroladordomodelodo
documento. O cdigo fonte da subrotina dlgInserirFrase, do Captulo 3 (Piloto
Automtico),mostracomoacessarocontroladorecriarumcursordavista.

6.4 Formatando texto


Estaoutratarefacomumemprocessamentodetextos.Temosduasabordagensparaformatar
umcontedodetexto:aprimeiraaplicarascaractersticasdesejadasdiretamentesobreo
objeto,sobrescrevendoasdefiniesbsicas,porexemplo,selecionarumpargrafoemudaro
seuajustamento;asegundaconsisteemaplicarumestiloprdefinidodeformatao,por
exemploselecionarumpargrafoemudaroseuestilodePadroparaTtulo.
Inicialmente,vamosdemonstraraprimeiraabordagem.Existeuma grandequantidadede
propriedadesrelacionadasformatao,comopropriedadesdecaracteresedepargrafos.
O servio com.sun.star.style.CharacterProperties define as propriedades comuns de
caracteres.Eisalgumasdelas:
Propriedade

Descrio

CharFontName

Especifica o nome do estilo da fonte

CharFontStyleNa
me

Contm o nome do estilo da fonte

CharFontFamily

Contm
a
famlia
(com.sun.star.awt.FontFamily)

CharHeight

Valor com a altura do caracteres em pontos

CharUnderline

Contm
o
valor
do
(com.sun.star.awt.Underline)

CharWeight

Contm
o
valor
do
(com.sun.star.awt.FontWeight)

CharPosture

Contm
o
valor
da
(com.sun.star.awt.FontSlant)

CharFlash

Se True o caractere pisca. opcional

CharStrikeout

Define
o
tipo
de
(com.sun.star.awt.FontStrikeout)

CharRotation

Define a rotao do caractere em graus

42

da

fonte

caractere

do

conforme

sublinhado

peso

da

fonte

postura

da

fonte

risco

do

caractere

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

Natabelaacima,asrefernciasaomdulocom.sun.star.awt,contmpossveisvalorespara
asrespectivaspropriedadesdoscaracteres.
Oserviocom.sun.star.style.ParagraphPropertiesdefineaspropriedadesdospargrafos.A
tabelaabaixoapresentaalgumas:
Propriedade

Descrio

ParaAdjust

Define o tipo de ajuste (com.sun.star.style.ParagraphAdjust)

ParaBackColor

Contm a cor de fundo, opcional

ParaLastLineAdju Define o ajuste da ltima linha


st
ParaLeftMargin

Define a margem esquerda em 1/100 mm ( As Long )

ParaRightMargin

Define a margem direita em 1/100 mm ( As Long )

ParaTopMargin

Define a margem superior do pargrafo em 1/100 mm (As


Long)

ParaBottomMargi
n

Define a margem inferior do pargrafo em 1/100 mm (As


Long)

ParaStyleName

Contm o nome do estilo de pargrafo corrente, opcional.

LeftBorder

Define
a
borda
esquerda,
(com.sun.star.table.BorderLine )

opcional

RightBorder

Define
a
borda
direita,
(com.sun.star.table.BorderLine )

opcional

TopBorder

Define
a
borda
superior,
(com.sun.star.table.BorderLine )

opcional

BottomBorder

Define
a
borda
inferior,
(com.sun.star.table.BorderLine )

opcional

BorderDistance

Valor com a distncia da borda ao objeto (As Long)

ParaFirstLineInde Valor longo com a identao da primeira linha, opcional


nt
ParaVertAlignmen Define
o
alinhamento
t
(com.sun.star.text.ParagraphVertAlign)

vertical

Novamente, as referncias com.sun.star contm valores possveis para as respectivas


propriedades,geralmenteumvalorde0aNparaconstantes.Vejaaseguiralgumasdelas.
Constantes de com.sun.star.style.ParagraphAdjust: LEFT, RIGHT, BLOCK, CENTER e
STRETCH.
Introduo ao OpenOffice.org Basic

43

Documentos do Writer

Verso 2

Constantes de com.sun.star.text.ParagraphVertAlign: AUTOMATIC, BASELINE, TOP,


CENTEReBOTTOM.
Existemmuitasoutraspropriedadesparacaracteresepargrafos,umaconsultaaoDevelopers
GuideeaoReferenceManual,ambosdaSunMicrosystemsInc,indispensvelparaaqueles
quedesejamprogramarparaoOpenOffice.org.
Vamos retomar o nosso ltimo exemplo a Sub processaTexto. Desejamos mudar a
inclinaoecordafontedapalavrasegundoe,tambm,oestilodeumpargrafodePadro
paraTtulo.Digiteocdigoabaixo,apsaltimalinhadasubrotina,executeaeobserveo
resultado.
'
'cdigoparaformatao
'
oCursor.gotoNextParagraph(FALSE)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(True)
oCursor.CharPosture=com.sun.star.awt.FontSlant.REVERSE_ITALIC
oCursor.CharColor=RGB(255,0,0)
'aplicaestilodepargrafo
oCursor.gotoNextParagraph(FALSE)
oCursor.paraStyleName="Heading"

NoteaatribuiodapropriedadeCharPostureaumvalorenumeradoREVERSE_ITALICe,
ainda,aalteraodoestilodepargrafoparaStyleNameparaHeading.Emsetratandode
programao, os nomes permanecem em ingls, diferindo dos nomes apresentados pelo
OpenOffice.orgnoCatlogodeEstilos.

6.5 Formatando com estilo


Vejamos,agora,asegundaabordagemparaformatao,queaaplicaodeumestilosobre
oobjeto.Semprequepossvel,formateosseusdocumentosusandoestemtodo.Istofacilita
futuras alteraes,poisbastamudarmos ascaractersticas deumestiloparaquetodosos
objetoscomeleformatadossejamalterados.
Omdulocom.sun.star.stylepossuidiversasinterfacesparaformatao,definioeacesso
aosestilosusadospeloOpenOffice.org.
O Writer disponibiliza diversos tipos de estilos. Temos estilos de pargrafos, estilos de
pginas,estilosdecaracteres,estilosdenumeraoeestilosdemolduras.Todoselesesto
agrupadosdentrodaFamliadeEstilos.
Famlia de Estilos
Estilos de
Estilos de
Estilos de
Estilos de
44

Pginas
Pargrafos
Caracteres
Molduras

(
(
(
(

estilo_1,
estilo_1,
estilo_1,
estilo_1,

estilo_2,
estilo_2,
estilo_2,
estilo_2,

...,
...,
...,
...,

estilo_n
estilo_n
estilo_n
estilo_n

)
)
)
)

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer
Estilos de Numerao

( estilo_1, estilo_2, ..., estilo_n )

Oserviocom.sun.star.style.StyleFamiliescontmasfamliasdeestilosdeumdocumento,
paraobterestacoleofaa:
DimoFamiliasEstilosAsObject
oFamiliasEstilos=ThisComponent.getStyleFamilies()

Numdocumentotexto,umachamadaaomtodogetElementNames()retornaumvetorcom
osnomesdasseguintesfamlias:
CharacterStyles
ParagraphStyles
FrameStyles
PageStyles
NumberingStyles

estilosdecaracteres
estilosdepargrafos
estilosdemolduras
estilosdepginas
estilosdenumerao

Oservio com.sun.star.style.StyleFamily contm os estilos deuma mesma famlia, para


obterestacoleo,useoacessonomeado,isto,getByName(nomeDaFamlia):
oEstParagrafos=ThisComponent.StyleFamilies.getByName(ParagraphStyles)

Oserviocom.sun.star.style.Styledefineascaractersticasdeumestilo,paraobterumestilo
acesseopeloseundice,porexemplo,seoobjetooEstParagrafosfoidefinido,comoacima:
oEstilo=oEstParagrafos(1)

retornaosegundoestilodentrodacoleodeestilosdepargrafos.
AAPIdoOpenOffice.orgprovinterfacesparafacilitaroacessoaelementosdeumadada
coleo.Aotrabalharcomestilosprecisamosconhecerosmtodos:
con.sun.star.container.XNameAcess
getByName(sNomeAsString)AsVariant
getElementNames()AsaStrings()
hasByName(sNomeAsString)AsBoolean
con.sun.star.container.XIndexAcess
getCount()AsLong
getByIndex(nIndiceAsLong)AsVariant
con.sun.star.container.XNameContainer
insertByName(sNomeAsString,oElementoAsVariant)
removeByName(sNomeAsString)

Introduo ao OpenOffice.org Basic

45

Documentos do Writer

Verso 2

O servio com.sun.star.style.PageStyle define as propriedades mais comuns da pgina,


abaixotemosalgumasdelas:
Propriedade

Descrio

BackColor

Valor Long da cor de fundo da pgina

LeftMargin

Valor Long da margem esquerda em 1/100 mm

RightMargin

Valor Long da margem direita em 1/100 mm

TopMargin

Valor Long da margem superior em 1/100 mm

BottomMargin

Valor Long da margem inferior em 1/100 mm

IsLandscape

Determina se o formato da pgina paisagem (True / False)

PageStyleLayout

Determina
o
layout
(com.sun.star.style.PageStyleLayout)

Size

Valores Long definindo o tamanho do papel (Size.Width e


Size.Height)

Width

Valor Long definindo a largura da pgina em 1/100 mm

Height

Valor Long definindo a altura da pgina em 1/100 mm

da

pgina

HeaderLeftMargin Valor Long definindo a margem esquerda do cabealho em


1/100 mm
HeaderRightMargi Valor Long definindo a margem direita do cabealho em
n
1/100 mm
HeaderIsOn

Determina se o cabealho est ativo na pgina (True / False)

FooterLeftMargin

Valor Long definindo a margem esquerda do rodap em 1/100


mm

FooterRightMargi Valor Long definindo a margem direita do rodap em 1/100


n
mm
FooterIsOn

Determina se o rodap est ativo na pgina (True / False)

Vamosaumexemplo.Queremos exibironmerodeestilos depginas disponveis num


documento,osseusnomeseapropriedadeSizedoestilodepginaPadro(Standard).Os
passosbsicosso:
a)obterasfamiliasdeestilosdodocumento;
b)obterosestilosdepginas;
c)obterovetorcomosnomesdosestilosdepginas;
d)usarumndiceparaextraircadaumdosnomes;
e)obterapginapadro,usandooacessonomeado.
46

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

AsubrotinaSubexibeEstilosPagina,aseguir,implementaonossoexemplo:
SubexibeEstilosPagina
DimoDocAsObject
DimoFamiliaEstilosAsObject
DimoEstilosPaginaAsObject
DimoPaginaPadraoAsObject
DimmNomesEstilosPaginaAsVariant
DimsEstiloAsString
DimsMsgAsString
oDoc=ThisComponent
'obtmaFamliadeEstilos(noteousodeoDoc)
oFamiliaEstilos=oDoc.StyleFamilies
'obtmosEstilosdePgina
oEstilosPagina=oFamiliaEstilos.getByName("PageStyles")
'exibequantidadedeestilosdepgina
MsgBoxoEstilosPagina.Count
'obtmeexibeosnomesdosestilosdepginas
mNomesEstilosPagina=oEstilosPagina.getElementNames()
Forn=LBound(mNomesEstilosPagina)ToUBound(mNomesEstilosPagina)
sMsg=sMsg+mNomesEstilosPagina(n)+""
Nextn
MsgBoxsMsg,0,"EstilosdePginas"
'obtmoEstilodepginaPadro(Standard)
oPaginaPadrao=oEstilosPagina.getByName("Standard")
'testandootamanhodapgina
lLPag=oPaginaPadrao.Size.Width
lAPag=oPaginaPadrao.Size.Height
MsgBoxStr$(lLPag)+""+Str$(lAPag)
EndSub

Adestacar,oacessopelondicedentrodolaoFor...Next,oacessonomeadoaoestiloda
pginaStandardeoacessopropriedadeSize.
Note,ainda,achamadaaomtodogetStylesFamilies():
oFamiliaEstilos=oDoc.StylesFamilies
noOpenOffice.orgBasicvocpodeomitirogeteosetaoprogramarpropriedades.
Esteexemplopodeserusadocomomodeloparadiversasoperaescomestilos.
Duranteaformataodetexto,comumacriaoeaplicaodenovosestilos.Estauma
tarefasimplesdeexecutardentrodeumamacro.Paraistodevemosseguirospassos:
a)Obterasfamliasdeestilosdodocumento;
b)Obterafamliadogrupoaondesercriadoonovoestilo;
c)Criarumainstnciadoobjetodonovoestilo;
d)Acrescentaronovoestiloaogrupo;
e)Definiraspropriedadesdonovoestilo;
f)Aplicaronovoestilo.

Introduo ao OpenOffice.org Basic

47

Documentos do Writer

Verso 2

Vamos retomar a subrotina Sub processaTexto e acrescentar cdigo fonte para criar e
aplicarumnovoestilodepargrafo.Digite(oucopieecole)ocdigoabaixo,apsaltima
linhadaSubprocessaTexto,executeamacroeobserveasdefiniesdeestilodoprimeiro
pargrafododocumento.
'
'cdigoparanovoestilo
'
DimoFamiliasEstilosAsObject
DimEstilosParagrafoAsObject
DimoNovoEstiloAsObject
'obtemasfamiliasdeEstilos
oFamiliasEstilos=oDoc.StyleFamilies
'obtemosestilosdepargrafos
EstilosParagrafo=oFamiliasEstilos.getByName("ParagraphStyles")
'criaumnovoestilodeparagrafo
oNovoEstilo=oDoc.createInstance("com.sun.star.style.ParagraphStyle")
'acrescentaonovoestilocomonome"novo_estilo"
EstilosParagrafo.insertByName("novo_estilo",oNovoEstilo)
'defineaspropriedadesdoestilo
oNovoEstilo.Name="novo_estilo"
oNovoEstilo.CharFontName="Arial"
oNovoEstilo.CharHeight=16
oNovoEstilo.ParaAdjust=com.sun.star.style.ParagraphAdjust.CENTER
oNovoEstilo.CharWeight=com.sun.star.awt.FontWeight.BOLD
'entao,aplicaonovoestiloaoprimeiroparagrafo
oCursor.gotoStart(FALSE)
oCursor.gotoEndOfParagraph(TRUE)
oCursor.paraStyleName="novo_estilo"

Acima,devesenotaracriaodeumnovoobjeto,nocasoumainstnciadeumestilode
pargrafo, com a chamada ao mtodo createInstance ( ... ). E, ainda, as definies das
propriedadesdonovoestilo.

6.6 Obtendo o objeto selecionado


AAPIdoOpenOffice.orgpermitequeumamacroextraiaocontedodeumaseleopara,
emseguida,aplicaralgumaaosobreomesmo.Ainterface com.sun.star.frame.XModel
provomtodoabaixo,queretornaumoumaisobjetoscomaseleoatualdocontrolador
corrente:
getCurrentSelection()AsObject
Oobjetoretornadodotipocom.sun.star.uno.XInterfaceedependedocontedodaseleo.
Contedo
seleo

da Objeto retornado

Texto

Um ou mais objetos apontando para TextRange

Clulas de tabela

Um objeto apontando para um cursor de tabela

Caixa de texto

Um objeto apontando para uma caixa de texto

48

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

Grfico

Um objeto apontando para um grfico

Desenho

Um ou mais objetos apontando para ShapeCollection

Paraseleodetexto,omtodogetCurrentSelection()operadaseguinteforma,:
a)senadaestiverselecionado,retornaumobjetoTextRangecomaposiodocursordavista;
b)numaseleosimples,retornaumobjetoTextRangecomaseleo;
c)numaseleomltipla,retornaobjetosTextRangeparaocursordavistaeparacadauma
dasselees.
Noexemploabaixo,obtemosascadeiasselecionadas,umaoumaissemltiplaseleo,e
mudamosacordecadaumaparavermelha:
SubprocessaSelecao
DimoDocAsObject
DimoSelAsObject
DimoCurTxtAsObject

oDoc=ThisComponent
oSel=oDoc.getCurrentSelection()
Fori=0TooSel.Count1
oCurTxt=oSel(i)
oCurTxt.CharColor=RGB(255,0,0)
Nexti
MsgBoxoSel.Count
EndSub

Noteoacessoaosobjetosselecionadosatravsdeumndiceeacriaodeumcursordetexto
antesdamudanadecor.
Paraextrairacadeiaselecionada,chameomtodogetString(),comoabaixo:
sCadeia=oSel(i).getString()

Omtodo getString() retornaumacadeiavaziaparaoprimeiroobjetonoscasosa)ec)


acima.InsiraocdigoabaixonolaoFor...NextdeprocessaSelecaoeobserveasada:
MsgBoxStr$(i)+:+oSel(i).getString()

Sevocquiseraplicaralgumaaonapalavrasobocursordavista,faa:
IfLen(oSel(0).getString())=0Then
oCurTxt=oSel(0).Text.createTextCursorByRange(oSel(0).getStart())
oCurTxt.gotoStartOfWord(False)
oCurTxt.gotoEndOfWord(True)
EndIf

Analisecomosedacriaodocursordetexto.Emseguida,comoexerccio,faacomquea
SubprocessaSeleoapliqueacortambmnapalavrasobocursordavista.
AAPIdoOpenOffice.orgtem,ainda,ainterfacecom.sun.star.view.XSelectionSupplier,que
implementaalgunsmtodosdeseleopelainterfacegrfica,entreeles:
select(oObjetoAsObject)AsBoolean
Introduo ao OpenOffice.org Basic

49

Documentos do Writer

Verso 2

sepossvel,selecionaoobjetooObjetonainterfacegrfica
getSelection()oObjetoAsVariant
obtmaseleonainterfacegrfica,poderetornarumobjetoouumacoleodeobjetos
Estesmtodospodemserchamadosatravsdocontroladorcorrentedomodelo(vejaotrecho
decdigoabaixo).
Existem, ainda, dois mtodos que podem ser teis para a identificao do contedo
selecionado,soeles:
getImplementationName()AsString
retornaonomedaimplementaodoobjeto
getName()AsString
retornaonomedoobjeto,seomesmofornomeado,casodegrficosetabelas.
DimoControladorAsObject
oControlador=oDoc.getCurrentController()
oSel=oControlador.getSelection()
sNomeImpl=oSel.getImplementationName()
sNome=oSel.getName()

Agora, altere a Sub processaSelecao, para alertar o usurio quando ele selecionar algo
diferentedetexto(dica,usegetImplementationName).

6.7 Localizando objetos


UmdocumentodoWriterpodeconteroutrosobjetosalmdetexto,comogrficos,tabelas,
campos,caixasdetexto,etc.Paracadatipoexisteumainterfacecommtodosqueretornam
umrecipientecomosobjetosexistentesnodocumento.Eisalguns:
getTextTables()As<com.sun.star.container.XNameAccess>
getTextFrames()As<com.sun.star.container.XNameAccess>
getGraphicObjects()As<com.sun.star.container.XNameAccess>
getTextSections()As<com.sun.star.container.XNameAccess>
getBookMarks()As<com.sun.star.container.XNameAccess>
getTextFields()As<com.sun.star.container.XEnumerationAccess>
getFootNotes()As<com.sun.star.container.XIndexAccess>
getEndNotes()As<com.sun.star.container.XIndexAccess>
getDocumentIndexes()As<com.sun.star.container.XIndexAccess>
AinterfaceXNameAccessimplementaosseguintesmtodos:
getByName(sNomeDoObjetoAsString)AsVariant
retornaoobjetonomeado
getElementNames()AsString()
retornaumasequnciadecadeiascomosnomesdosobjetosdacoleo
hasByName(sNomeAsString)AsBoolean
retornaTrueseoobjetodenomesNomeexistenacoleo
50

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

AinterfaceXIndexAccessdefineosmtodosaseguir:
getByIndex(iIndiceAsLong)AsObject
retornaoobjetonaposiaoiIndicedacoleo
getCount()AsLong
retornaonmerodeobjetosdacoleo
AinterfaceXEnumerationAccessdefineomtodo:
createEnumeration()AsObject<com.sun.star.container.XEnumeration>
retornaumobjetoXEnumeration
AinterfaceXEnumerationimplementaosmtodosabaixo:
hasMoreElements()AsBoolean
retornaTrueseaindaexistemelementosnorecipiente
nextElement()AsVariant
retornaoprximoelemento
Alocalizaosimples,bastachamaromtodoapropriadoeaseguir,usaroacessonomeado
ouindexadoparaobteroobjeto.
Asubrotina SublocalizaGraficos,abaixo,exibeosnomesdetodososobjetosgrficosdo
documento:
SublocalizaGraficos
DimoGraficosAsObject
DimoGraficoAsObject
DimnAsInteger
oGraficos=ThisComponent.getGraphicObjects()
Forn=0TooGraficos.Count1
oGrafico=oGraficos(n)
MsgBoxoGrafico.getName()
Nextn
MsgBox"Grficosnodocumento:"+Str$(oGraficos.Count)
EndSub

Paraapagarumgrficodoseudocumento,vocpodeusaroblocodecdigo:
oGrafico=oGraficos.getByName(Grfico2)
oGrafico.dispose()

Noexemploaseguir,quedemonstraacriaodeumaenumerao,exibimosocomandode
cadaumdoscamposdeumdocumento:
SublocalizaCampos
DimoCamposAsObject
DimoCampoAsObject
DimnAsInteger

Introduo ao OpenOffice.org Basic

51

Documentos do Writer

Verso 2

oCampos=ThisComponent.getTextFields().createEnumeration()
n=0
DoWhile(oCampos.hasMoreElements())
oCampo=oCampos.NextElement()
MsgBoxoCampo.getPresentation(True)
n=n+1
Loop
MsgBox"Camposnodocumento:"+Str$(n)
EndSub

Observequeacriao eoacessoaos elementos deumaenumerao sequncial eno


indexado ou nomeado. O mtodo getPresentation() retorna o contedo do campo se o
parmetroforFalse.
Geralmente,pararecuperaroobjetoquenosinteressadentrodacoleoretornadaporumdos
mtodosacima,precisamosconheceroseunomeouasuaposiodentrodacoleo.

6.8 Busca e Substituio


AAPIdoOpenOffice.orgtemmecanismosavanadosparaabuscaesubstituiodetexto
numdocumento.
Paralocalizaresubstituirtextodevemos:criarumdescritordebuscaousubstituio;definir
aspropriedadesechamaromtodoapropriado.
Ainterfacecom.sun.star.util.XSearchableprovosmtodosabaixoparabusca:
createSearchDescriptor()AsObject<SearchDescriptor>
criaumdescritordebuscaparareceberaspropriedadesdabusca.
FindAll(oDescritorAsObject)AsObject<com.sun.star.container.XIndexAccess>
retornaumacoleodeTextRangescomtodososresultadosdabusca
FindFirst(oDescritorAsObject)AsObject<com.sun.star.uno.XInterface>
retornaumTextRangecomoprimeiroresultadodabusca
FindNext(oInicioAsObject,oDescritorAsObject)AsObject<XInterface>
retornaumTextRangecomoprximoresultadodabusca.OparmetrooIniciopontode
partidaparaabusca,normalmenteoresultadodaltimachamadaaFindFirstouFindNext.
OservioSearchDescriptortemosmtodosabaixo:
getSearchString()AsString
obtmacadeiadebusca
setSearchString(sCadeiaAsString)
defineacadeiadebusca
Eisalgumasdesuaspropriedades:
Propriedade

Descrio

SearchBackwards

Se True busca para o incio do documento

52

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

Propriedade

Descrio

SearchCaseSensitive

Se True considera maisculas / minsculas

SearchWords

Se True busca palavras completas

SearchStyles

Se True busca por um estilo

Noexemploaseguir,vamoslocalizar,nodocumento,todasasocorrnciasdacadeia()e
trocaracordafonteparavermelha.Digite(oucopieecole)ocdigoabaixoeexecuteasub
rotina.
SubbuscaTodas
DimoDocAsObject
DimoDescBuscaAsObject

oDoc=ThisComponent
oDescBusca=oDoc.createSearchDescriptor()
oDescBusca.SearchWords=True
oDescBusca.setSearchString("()")
oResultado=oDoc.findAll(oDescBusca)
Forn%=0TooResultado.Count1
oResultado(n%).CharColor=RGB(255,0,0)
Next
MsgBox"Ocorrnciasde"+oDescBusca.getSearchString()+_
+Str$(oResultado.Count)
EndSub

Atarefaacimapode,tambm,serexecutadacomosmtodosfindFirstefindNext:
oResultado=oDoc.findFirst(oDescBusca)
DoUntilIsNull(oResultado)
oResultado.CharColor=RGB(250,100,50)
oResultado=oDoc.findNext(oResultado,oDescBusca)
Loop

A substituio de texto implementada pela interface XReplaceable, que herda as


caractersticasdeXSearchable.Elaprovosmtodos:
createReplaceDescriptor()AsObject<com.sun.star.util.XReplaceDescriptor>
retornaumdescritordesubstituioparaaspropriedades
replaceAll(xDescritorAsObject<com.sun.star.util.XReplaceDescriptor>)AsLong
buscaesubstituitodasasocorrncias,retornaototaldesubstituies
OservioReplaceDescriptortemmtodosparaaspropriedadesdacadeia:
getReplaceString()AsString
obtmacadeiasubstituta
setReplaceString(sCadeiaAsString)
defineacadeiasubstituta
Introduo ao OpenOffice.org Basic

53

Documentos do Writer

Verso 2

Eisumexemplosimplesdebuscaesubstituio:
SubsubstituiTodas
DimoDocAsObject
DimoDescritorAsObject
oDoc=ThisComponent
oDescritor=oDoc.createReplaceDescriptor()
oDescritor.setSearchString("()")
oDescritor.setReplaceString("()")
n=oDoc.replaceAll(oDescritor)
MsgBoxn
EndSub

Notequenotemosummtodoparasubstituiointerativa.Porm,atravsdabuscaeedio,
possvelimplementar,comfacilidade,esteprocedimento.

6.9 Inserindo objetos


Vamosabordar,rapidamente,outratarefacomumemprocessamentodetextos.Ainserode
objetosdeorigemexterna,comogrficosedocumentos,numdocumentodoWriter.
Inserirumdocumentotextomuitofcil,bastacriarumcursordetextoechamaromtodo:
insertDocumentFromURL(sURLAsString,mPropriedades()AsObject)
OsparmetrosdestemtodosoidnticosaosjvistosnaseoCarregandoDocumentos.
DimoCursorTxtAsObject
DimmPropriedades()
DimsURLAsString
oCursorTxt=ThisComponent.createTextCursor()
'sURL=caminho_completo_do_arquivo
oCursorTxt.insertDocumentFromURL(sURL,mPropriedades())

Parainserirnaposiodocursordainterfacegrfica,crieocursordetextoapartirdocursor
davista.
Ainserodearquivosgrficosumpoucomaiscomplicada,paraissovocdeve:
a)criarumobjetogrfico;
b)definirassuaspropriedades;
c)inseriroobjeto.
ObserveasubrotinaSubinserirGraficoaseguir:
SubinserirGrafico
DimoTxtAsObject
DimoCursorTxtAsObject
DimoGraficoAsObject
DimsURLAsString

oTxt=ThisComponent.getText()

54

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

oCursorTxt=oTxt.createTextCursor()
oGrafico=ThisComponent.createInstance("com.sun.star.text.GraphicObject")
sURL="file:///D:/NAD/OPENOFFICE/HOWTO/FIGURAS/DIALOGO.JPG"
oGrafico.GraphicURL=sURL
oGrafico.AnchorType=com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
oTxt.insertTextContent(oCursorTxt.getStart(),oGrafico,False)
EndSub

A chamada ao mtodo createInstance ( ) cria o objecto grfico, depois definimos as


propriedades GraphicURL e AnchorType e,finalmente,inserimosogrficochamandoo
mtodoinsertTextContent()comosparmetrosadequados.
Apropriedade AnchorType podeassumir,ainda,osseguintesvalores:AT_CHARACTER,
AT_PAGEeAS_CHARACTER.
OAPIdoOpenOffice.org(verso1.0.1)salvanodocumentoapenasaURLdogrfico.Logo,
sevocremovlodasualocalizaooriginal,oWriternotercomoencontrlo.

6.10 Tabelas
Umatabelaumconjuntodeclulasorganizadasporlinhasecolunas,ondecadaclulatem
umnome,normalmenteindicadoporletrasenmeros.Asletrasreferemsescolunaseos
nmerosslinhas.Contudo,seexistiremclulasmescladasoudivididas,oconceitodecoluna
poderdesaparecereoesquemadenomeaotornasecomplicado.
Umaclulapodecontertextosimples(cadeiasenmeros),grficos,frmulasecamposcom
vriascaractersticasdeformatao.
Umatabelarecebeumnomeniconodocumento,podendoservircomoorigemparagrficos,
teroseucontudoordenadoeserautomaticamenteformatada.
AAPIdoOpenOffice.orgtemdiversosservioseinterfacesparalidarcomtabelas,vejamos
asprincipais.
A interface com.sun.star.text.XTextTable encarregase do gerenciamento de tabelas num
documentoecontmosmtodosabaixo:
initialize(nLinhasAsLong,nColunasAsLong)
Inicializaumatabela,recebeonmerodelinhasecolunascomoparmetros.
getCellNames()AsObject<Strings>
Obtmosnomesdasclulas,retornaumconjuntodecadeias
getCellByName(sNomeCelulaAsString)AsObject<com.sun.star.table.XCell>
Obtmaclulanomeadanoparmetro,retornaumobjetoXCell
getRows()AsObject<com.sun.star.table.XTableRows>
Obtmaslinhasdatabela,retornaumobjetoparaXTableRows.
getColumns()AsObject<com.sun.star.table.XTableColumns>
Obtmascolunasdatabela,retornaumobjetoparaXTableColumns.
Introduo ao OpenOffice.org Basic

55

Documentos do Writer

Verso 2

createCursorByCellName(sNomeCelulaAsString)AsObject<XTextTableCursor>
Criaumcursordetabelaposicionadonaclulanomeadanoparmetro
OservioTextTablepossuidiversaspropriedades,eisalgumasdelas:
Propriedade

Descrio

LeftMargin

Contm a margem esquerda da tabela, valor Long

RightMargin

Contm a margem direita da tabela, valor Long

Split

Um valor False impede a diviso da tabela em duas


pginas

TableBorder

Contm a descrio da borda da tabela

TableColumnSeparator Contm a descrio dos separadores de colunas da


s
tabela
BackGraphicURL

Contm a URL do grfico de fundo da clula

As interfaces XTableRows e XtableColumns, retornadas pelos mtodos getRows () e


getColumns(),acima,possuemosmtodosaseguir:
insertByIndex(nIndiceAsLong,nTotalAsLong)
removeByIndex(nIndiceAsLong,nTotalAsLong)
getElementType()AsType
hasElements()AsBoolean
getByIndex()AsVariant
getCount()AsLong
A interface XTextTableCursor, retornada pelo mtodo createCursorByCellName, acima,
provosmtodos:
getRangeName()AsString
Retornaaextensodeclulasdocursor,isto,osnomesdasclulassuperioresquerdae
inferiordireita,porexemploA2:D25(noteoseparador:).
goLeft(nQuantAsInteger,bExpandeAsBoolean)AsBoolean
goRight(nQuantAsInteger,bExpandeAsBoolean)AsBoolean
goUp(nQuantAsInteger,bExpandeAsBoolean)AsBoolean
goDown(nQuantAsInteger,bExpandeAsBoolean)AsBoolean
gotoStart(bExpandeAsBoolean)
gotoEnd(bExpandeAsBoolean)
Mtodosparamovimentaoeseleo,nQuantaquantidadedeclulase,sebExpandefor
True,extendeaseleoduranteodeslocamentodocursor.
gotoCellByName(sNomeAsString,bExpandeAsBoolean)AsBoolean
Deslocaocursorparaaclulanomeadanoparmetro.
mergeRange()AsBoolean
56

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

splitRange(nQuantAsInteger,bHorizAsBoolean)AsBoolean
Mtodosparafundiredividirclulas.
Atravs do servio TextTableCursor podemos efetuar a formatao das clulas, pois, ele
incluiosserviosCharacterPropertieseParagraphProperties.
Ainterfacecom.sun.star.table.XCellRangedefineosmtodosabaixoparalidarcomextenses
declulas:
getCellByPosition(nColunaAsLong,nLinhaAsLong)AsObject<XCell>
getCellRangeByPosition(nEsq,nSup,nDir,nInf)AsObject<XCellRange>
getCellRangeByName(sRangeAsString)AsObject<XCellRange>
Oserviocom.sun.star.table.CellRangeincluicom.sun.star.table.CellProperties,quedefineas
propriedadesdeumaoumaisclulas.Eisalgumas:
Propriedade

Descrio

CellBackColor

Valor Long com a cor de fundo da clula

HoriJustify

Alinhamento horizontal
CellHoriJustify)

VertJustify

Alinhamento vertical
CellVertJustify)

IsTextWrapped

Se True, o texto muda de linha automaticamente

Orientation

Orientao do contedo da clula (enum CellOrientation)

RotateAngle

Define a rotao do contedo da clula (em 1/100 graus)

TableBorder

Descreve a borda das clulas (struct TableBorde)

TopBorder

Descreve a borda superior de cada clula (struct BorderLine)

BottomBorder

Descreve a borda inferior de cada clula (struct BorderLine)

LeftBorder

Descreve a borda esquerda de cada clula (struct BorderLine)

RightBorder

Descreve a borda direita de cada clula (struct BorderLine)

NumberFormat

ndice do formato numrico usado nas clulas (servio


NumberFormatter)

CellProtection

Descreve a proteo da clula (servio CellProtection)

do
do

contedo
contedo

da
da

clula

(enum

clula

(enum

Ainterfacecom.sun.star.table.XCellofereceosmtodosabaixoparamanipularocontedode
umaclula:
getFormula()AsString
setFormula(sFormulaAsString)
Introduo ao OpenOffice.org Basic

57

Documentos do Writer

Verso 2

mtodosparaobteroudefinirafrmuladeumaclula
getValue()AsDouble
setValue(nValorAsDouble)
mtodosparaobteroudefinirovalordeumaclula
getType()AsLong<com.sun.star.table.CellContentType>
retornaotipodocontedodeumaclula,comoenumeradoemCellContentType
getError()AsLong
retornaoerrodeumaclula,tilpararastrearerrosemfrmulas
Onomedeumatabelapodeserobtidooudefinidocomosmtodosaseguir,dainterface
com.sun.star.container.XNamed:
getName()AsString
setName(sNomeTabelaAsString)
Ocontedodeumatabelapodeserordenadocomainterfacecom.sun.star.util.XSortablee
seusmtodos:
createSortDescriptor()AsVariant<com.sun.star.beans.PropertyValue>
retornaumdescritorparaaspropriedadesdaordenao
sort(xDescritorAsVariant<com.sun.star.beans.PropertyValue>)
executaaordenaoconformeodescritor
Seguemalgumasdaspropriedadesdodescritordeordenao(SortDescriptor):
Propriedade

Descrio

IsCaseSensitive

Se True, considera maisculas / minsculas

SortAscending

Define a ordem da ordenao (??)

SortColumns

Se True ordena as colunas, seno ordena as linhas.

Oserviocom.sun.star.table.TableSortDescriptorincluioservioSortDescriptorepossuias
propriedadesabaixo:
Propriedade

Descrio

SortFields

Descreve
os
campos
<com.sun.star.util.SortField>

MaxFieldCount

Define o nmero mximo de campos, somente leitura

Orientation

Define
a
orientao
<com.sun.star.table.TableOrientation>

ContainsHeader

Se True, no ordena a primeira linha ou coluna

58

de

da

ordenao

ordenao

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

horadeapresentarumexemplo.Inicialmente,vamoscriar,inicializareinserirumatabela,
comcincolinhasetrscolunas,noinciododocumentocorrente.Depois,vamosdefiniros
ttulosdascolunas.Digiteocdigoabaixo,executeeobserveoresultado:
SubcriaTabela
DimoTxtAsObject
DimoTabAsObject
'
'cria,inicializaeinsereatabelanoiniciododocumento
oTxt=ThisComponent.getText()
oTab=ThisComponent.createInstance("com.sun.star.text.TextTable")
oTab.initialize(5,3)
oTxt.insertTextContent(oTxt.createTextCursor(),oTab,FALSE)
'
'preencheosttulosdascolunas(clulasA1,B1eC1)
DimoCelulaAsObject
oCelula=oTab.getCellByName("A1")
oCelula.setString("ColunaA")
oCelula=oTab.getCellByName("B1")
oCelula.setString("ColunaB")
oCelula=oTab.getCellByName("C1")
oCelula.setString("ColunaC")
EndSub

PrimeirocriamosoobjetotabelacomcreateInstance(),depoisdefinimosaslinhasecolunas
com initialize (), inserimos a tabela no documento com uma chamada ao mtodo
insertTextContent()e,ento,obtemoscadaumadasclulasdocabealhoedefinimososeu
contedo.
Oblocodecdigoabaixodemonstraoempregodocursordetabela,navegao,formataoe
mesclagemdeclulas.AcrescenteoSubcriaTabela.
'
'criaumcursordetabelanaclulaCellNames(0)=A1
DimoCurTabAsObject
oCurTab=oTab.createCursorByCellName(oTab.CellNames(0))
'selecionaasclulasA1,B1eC1
oCurTab.gotoStart(False)
oCurTab.goRight(2,True)
'AplicaoestilodepargrafoTtulonaseleo
oCurTab.paraStyleName="Heading"
'exibeonomedaextensoselecionada(range)
'Noteaformadeapresentao(invertida)
MsgBoxoCurTab.getRangeName()
'
'nomeiaascelulasapartirdalinha2e
'escrevenmerodalinhanacolunaC
DimsNomes()AsVariant
DimsNomeCelulaAsString
sNomes=Array("A","B","C")
Fori%=1To4
Forj%=1To3
sNomeCelula=sNomes(j%1)+Str$(i%+1)
oCelula=oTab.getCellByName(sNomeCelula)
If(j%1=2)Then
'defineumvalornumricoparaaclula
oCelula.setValue(i%+1)
Else

Introduo ao OpenOffice.org Basic

59

Documentos do Writer

Verso 2

oCelula.setString(sNomeCelula)
EndIf
Nextj%
Nexti%
'
'defineumafrmula(somadeC2atC4)paraaclulaC5
oCelula=oTab.getCellByName("C5")
oCelula.setFormula("sum<C2:C4>")
'
'fundeasclulasA5eB5emudaseucontedo
oCurTab.gotoCellByName("A5",False)
oCurTab.goRight(1,True)
oCurTab.mergeRange()
oCelula=oTab.getCellByName("A5")
oCelula.setString("Total")

NoteacriaodocursordatabelacomcreateCursorByCellNames(...),ousodocursorpara
formatao, ousodosmtodossetValue()esetFormula()easeleoemesclagemdas
clulasA5eB5.
Noprximoblocodecdigo,veremosaordenaodeumaextensodeclulas(A2:C4)da
nossatabela.BastainserirocdigonaSubcriaTabelaeexecutarparaveroresultado.
'
'ordenadeA2atC4
DimoCampoOrd(0)AsNewcom.sun.star.util.SortField
DimoDescrOrdAsVariant
DimoExtensaoAsObject
'
'defineaextensoaserordenada
oExtensao=oTab.getCellRangeByName("A2:C4")
'defineocampodeordenaoesuaspropriedades
oCampoOrd(0).Field=0
oCampoOrd(0).SortAscending=False
oCampoOrd(0).FieldType=com.sun.star.util.SortFieldType.ALPHANUMERIC
'criaodescritordeordenao
oDescrOrd=oTab.createSortDescriptor()
'defineaspropriedadesdodescritor
oDescrOrd(0).Name="SortFields"
oDescrOrd(0).Value=oCampoOrd()
oDescrOrd(1).Name="ContainsHeader"
oDescrOrd(1).Value=False
oDescrOrd(2).Name="SortColumns"
oDescrOrd(2).Value=False
'ordenaaextenso
oExtensao.sort(oDescrOrd())

Notequeiniciamoscom adeclaraodasvariveis,criamosumaextensodeclulascom
umachamadaaomtodogetCellRangeByName(),definimosaspropriedadesdocampode
ordenao,criamosodescritoredefinimosassuaspropriedades(ocampodeordenao
umapropriedadedodescritor)e,finalmente,invocamosomtodosort()paraexecutarasua
tarefa.
Antes de terminar esta seo, vejamos como se d o acesso s tabelas existentes num
documentotexto.OprocessoomesmojvistonaseoLocalizandoObjetos.
OmtodogetTextTables()dainterfaceXTextTablesSupplierretornaumacoleocontendo
astabelasdodocumento.Elepercorreodocumentodoincioparaofinal.
60

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

getTextTables()AsObject<com.sun.star.container.XNameAccess>
Oexemploabaixodemonstraalocalizaodastabelasdeumdocumento,depoisobtmas
coleesdelinhasecolunasdatabelacomonomeTabela3.
SublocalizaTabelas
DimoTabelasAsObject
DimoTabelaAsObject
DimoLinhasAsObject
DimoColunasAsObject
DimnAsInteger
oTabelas=ThisComponent.getTextTables()
Forn=0TooTabelas.Count1
oTabela=oTabelas.getByIndex(n)
MsgBoxoTabela.getName()
Nextn
MsgBox"Tabelasnodocumento:"+Str$(oTabelas.Count)
'
If(oTabelas.hasByName(Tabela3))Then
oTabela=oTabelas.getByName("Tabela3")
oLinhas=oTabela.getRows()
oColunas=oTabela.getColumns()
MsgBoxStr$(oLinhas.Count)+""+Str$(oColunas.Count)
EndIf
EndSub

Lembreseque,paraacessarumatabela,vocdeveconheceroseunomeouoseu ndice
dentrodacoleoe,emseguida,chamaromtodogetByName()ougetByIndex().
Apsobteratabeladesejada,useastcnicasjapresentadasparaeditaroseucontedo.

6.11 Desenhos
AAPIdoOpenOffice.orgpossuidiversosservioseinterfacesparaoperaescomdesenhos
num documento, atravs de uma macro. Nesta seo, veremos como usar alguns destes
servioseinterfaces.
Oserviocom.sun.star.text.Shape,contmmuitaspropriedadesrelacionadasaosobjetosde
desenho,seguemalgumasdelas:
Propriedade

Descrio

AnchorType

Tipo da ncora

HoriOrient

Orientao horizontal

VertOrient

Orientao vertical

LeftMargin

Margem esquerda

RightMargin

Margem direita

TopMargin

Margem superior

Introduo ao OpenOffice.org Basic

61

Documentos do Writer

BottomMagin

Verso 2

Margem inferior

O servio com.sun.star.drawing.Shape contm proriedades adicionais, como Name, que


permitedefinirumnomeparaodesenho,esuportaasinterfaces:
com.sun.star.beans.XPropertySet
com.sun.star.drawing.XShape
com.sun.star.drawing.XShapeDescriptor
AinterfaceXShape,acima,provmtodosparadefiniraposioeotamanhododesenho:
getPosition()AsObject<com.sun.star.awt.Point>
setPosition(PontoAsObject<com.sun.star.awt.Point>)
getSize()AsObject<com.sun.star.awt.Size>
setSize(TamanhoAsObject<com.sun.star.awt.Size>)
AinterfaceXShapeDescriptorcontmomtodoaseguir,queretornaumacadeiacomotipo
dedesenho:
getShapeType()AsString
Atravs da interface com.sun.star.lang.XMultiServiceFactory, criamos o objeto desenho
usandoomtodo:
createInstance(sServicoAsString)AsObject<com.sun.star.uno.XInterface>
Omdulocom.sun.star.drawingdaAPIdoOpenOffice.orgcontmdiversosserviosparaa
criaodeobjetosdedesenhoesousadoscomoparmetrodafunocreateInstance().
Estesservioscontm,almdepropriedadescomuns,outrasespecficas.Eisalgunsdeles:
com.sun.star.drawing.EllipseShape
com.sun.star.drawing.RectangleShape
retngulos
com.sun.star.drawing.LineShape

usadoparadesenharcrculoseelipses
usado para desenhar
usadoparadesenharlinhas

A interface com.sun.star.drawing.XShapes define mtodos para adicionar e remover


desenhosdodocumento:
add(DesenhoAsObject<com.sun.star.drawing.Shape>)
remove(DesenhoAsObject<com.sun.star.drawing.Shape>)
Ainterfacecom.sun.star.text.XTexttambmdefineosmtodosabaixo,apresentadosnoutras
sees,paraadicionareremoverdesenhosdodocumento:
insertTextContent()
removeTextContent()
62

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Writer

Ainterfacecom.sun.star.drawing.XDrawPageSupplierdefineomtodoabaixoparaobtera
pginadedesenhododocumento:
getDrawPage()AsObject<com.sun.star.drawing.DrawPage>
ParaamanipulaodedesenhosnoWritereCalc,oOpenOffice.orgutilizaosmecanismos
bsicosdedesenhodoDraw.Umadasprincipaisdiferenas,quenoDrawexistemvrias
pginasdedesenho,enquantonoWriterexisteapenasuma.
Vejamoscomoinserirdesenhosnumdocumento,atravsdeumamacroqueusaalgunsdos
mtodosepropriedadesapresentados.CrieumdocumentodoWriteredigiteocdigofonte
abaixonoIDEBasic,emseguidaexecuteamacroeobserveoresultado.
SubcriaDesenho
'
DimoDocAsObject
DimoTextoAsObject
DimoCursorAsObject
DimoRetangAsObject
DimoElipseAsObject
DimoPagDesAsObject
DimoTamanhoAsNewcom.sun.star.awt.Size
DimoPontoAsNewcom.sun.star.awt.Point

oDoc=ThisComponent
oTexto=oDoc.getText()
oCursor=oTexto.createTextCursor()
'inseredoisnovospargrafosnofinaldotexto
oCursor.gotoEnd(False)
oTexto.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
oTexto.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
oCursor.gotoPreviousParagraph(False)
'criaumobjetoretnguloeumobjetoelipse
oRetang=oDoc.createInstance("com.sun.star.drawing.RectangleShape")
oElipse=oDoc.createInstance("com.sun.star.drawing.EllipseShape")
'defineotamanhodoretnguloeelipse
oTamanho.Height=4000
oTamanho.Width=10000
oRetang.setSize(oTamanho)
oRetang.Name="Ret_1"
oTamanho.Height=3000
oTamanho.Width=6000
oElipse.setSize(oTamanho)
oElipse.Name="Eli_1"
'defineaposiodoretnguloadireitadaelipse
oPonto.X=6100
oPonto.Y=0
oRetang.setPosition(oPonto)
'defineancoranopargrafo
oRetang.AnchorType=com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
oElipse.AnchorType=com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
'inserenaposiodocursordetexto
oTexto.insertTextContent(oCursor,oElipse,FALSE)

Introduo ao OpenOffice.org Basic

63

Documentos do Writer

Verso 2

oTexto.insertTextContent(oCursor,oRetang,FALSE)
oPosRet=oRetang.getPosition()
MsgBoxStr$(oPosRet.X)+""+Str$(oPosRet.Y)
'criaumalinha
oLinha=oDoc.createInstance("com.sun.star.drawing.LineShape")
'defineotamanhodalinha
oTamanho.Height=30
oTamanho.Width=6000
oLinha.setSize(oTamanho)
'defineaposiodalinha
oPonto.X=6000
oPonto.Y=10000
oLinha.setPosition(oPonto)
'obtmapginadedesenhododocumento
oPagDes=oDoc.getDrawPage()
'adicionaalinhanaprimeirapgina
oPagDes.add(oLinha)
'
EndSub

Comeamosinserindopargrafosnofinaldotexto,aseguircriamosdoisobjetosdedesenho,
um retngulo e uma elipse, definimos a suas propriedades e usamos o mtodo
insertTextContent()paraadicionarosobjetosnodocumento.Depois,criamosumalinha,
obtemosapginadedesenhododocumentoeadicionamosalinhacomomtodoadd().
Paraencerrarestaseo,vejamosumexemploqueidentificaosobjetosdedesenhoexistentes
nonossodocumento.Crieamacroabaixonumdocumentocontendodesenhos,moldurase
grficos.Emseguidaexecuteeobserveasada.
SubobtemDesenhos
'
'obtemoutrosobjetosalmdedesenhos,ex:molduras
'
DimoDocAsObject
DimoPageAsObject

oDoc=ThisComponent
oPage=oDoc.getDrawPage()
sMsg=""
nNrDes=oPage.getCount()
Fori=0TonNrDes1
oShape=oPage.getByIndex(i)
'obtemnomesedefinidonacriao
'sMsg=sMsg+oShape.getName()+chr$(10)
sMsg=sMsg+oShape.getShapeType()+chr$(10)
Nexti
MsgBoxsMsg+Str$(nNrDes)
EndSub

Note que outros objetos baseados no servio Shape, como molduras, tambm so
identificados. O mtodo getName(), somenteretornaonome,seoobjeto foinomeado
duranteacriaododesenho.

64

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

7 Documentos do Calc

7.1 Introduo
UmdocumentodoCalccontmumaoumaisfolhasdeplanilhas.Cadaplanilhaformadapor
clulasorganizadasemlinhasecolunas,demodobemparecidocomodeumatabelado
Writer. Estas clulas contm, basicamente, texto, que pode representar uma cadeia de
caracteres,umvalornumrico,umcampoouumafrmula.
Cadaumdoselementosacima(documento,planilhaeclula),possuicaractersticasprprias.
Algumas podem ser alteradas, como por exemplo: estilo de pgina, formato numrico,
pargrafoefonte.
Almdas tarefas comuns de edio, podemos aplicar, sobreocontedo de umaplanilha
operaescomo:ordenao,filtragem,subtotalizao,geraodegrficos,etc.
Podemos,tambm,inserir,numaplanilha,objetoscomoimagens,desenhos,dadosdeuma
fonteexternaeobjetosOLE.
Comovocjdeveternotado,dadoariquezaeopoderdasoperaescomdocumentosdo
Calc,asuaprogramaoumassuntoextenso.Nasprximassees,tentareiapresentaro
bsico.

7.2 Planilhas
AsfunesbsicasjabordadasnocaptuloTrabalhandocomDocumentos,podemserusadas
tambmcomdocumentosdoCalc.Assim,estaseovaicobriralgumasoperaessobreas
folhasdasplanilhasdeumdocumentodoCalc.
Omdulo com.sun.star.sheet,daAPIdoOpenOffice.org,contm os principais servios,
interfacesegruposdeconstantesrelacionadoscomplanilhas.
OservioSpreadsheetDocumentrepresentaomodelodeumdocumentodoCalc,contendo
atributos e uma ou mais planilhas. A interface XSpreadsheetDocument prov o mtodo
getSheets(),queretornaumacoleocomasplanilhasdodocumento.
getSheets()AsObject<com.sum.star.sheet.XSpreadsheets>
Osobjetosdestacoleopodemseracessadospelosseusnomesoundices.Podemos,ainda,
criarumaenumeraoeusaroacessoseqncial.
AinterfaceXSpreadsheets,retornadaporgetSheets(),defineosmtodosabaixo:
insertNewByName(sNomeAsString,iPosicaoAsInteger)
moveByName(sNomeAsString,iDestinoAsInteger)
copyByName(sNomeOrigemAsString,sNomeCopiaAsString,iPosicaoAsInteger)

Introduo ao OpenOffice.org Basic

65

Documentos do Calc

Verso 2

Parafixarosconceitosacima,noexemploaseguir,vamoscriarumdocumentoeefetuar
algumasoperaescomplanilhas.
SubcriaDocCalc
DimoDeskAsVariant
DimoDocAsObject
DimmProp()AsVariant
DimsURLAsString
'criadocumentodoCalc
oDesk=createUnoService("com.sun.star.frame.Desktop")
sUrl="private:factory/scalc"
oDoc=oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp())
'exibeapropriedadecasasdecimaispadrododocumento
MsgBoxoDoc.StandardDecimals
'
'navegapelasplanilhasexistentesnodocumento
DimoPlanilhasAsObject
DimoPlanilhaAsObject
DimsMsgAsString
'
oPlanilhas=oDoc.getSheets()
sMsg=""
Forn=0TooPlanilhas.Count1
oPlanilha=oPlanilhas.getByIndex(n)
sMsg=sMsg+oPlanilha.getName()+Chr$(13)
Nextn
MsgBoxsMsg+Str$(oPlanilhas.Count)
'acessonomeado
IfoPlanilhas.hasByName("Planilha2")Then
oPlanilha=oPlanilhas.getByName("Planilha2")
MsgBoxoPlanilha.PageStyle
EndIf
'insereumafolhanoincio
oPlanilhas.insertNewByName("Planilha4",0)
MsgBoxoPlanilhas.Count
'moveparaofinal
oPlanilhas.moveByName("Planilha4",4)
EndSub

Noteosparmetrosparaacriaododocumento,oacessoaosobjetosdacoleoeousodos
mtodosparainseriremoverumafolhadeplanilha.
O servio SpreadsheetView fornece funcionalidades relacionadas vista corrente de um
documento do Calc. Ele inclui o servio SpreadsheetViewSettings, que define algumas
propriedadesdecadaumadasplanilhasdodocumentoe,asuainterfaceXspreadsheetView,
trazosmtodosaseguir,paraadefiniodaplanilhaativanodocumento:
getActiveSheet()AsObject<XSpreadsheet>
setActiveSheet(oPlanilhaAsObject<XSpreadsheet>)
Lembresequeasoperaesrelacionadascomainterfacegrficasogerenciadaspeloobjeto
controladordodocumento.
DigiteocdigofonteabaixonofinaldaSubcriaDocCalc,executeeobserveoresultado.

66

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

'ativaaPlanilha4naGUI
IfoPlanilhas.hasByName("Planilha4")Then
MsgBoxoDoc.getCurrentController().getActiveSheet().getName()
oPlanilha=oPlanilhas.getByName("Planilha4")
oDoc.getCurrentController().setActiveSheet(oPlanilha)
EndIf

Inicialmente,exibimosonomedaplanilhaativae,ento,selecionamosaplanilhadenome
Planilha4.
ComojdemonstradonocaptuloDocumentosdoWriter,podemosalterarocontedodeum
documentoindependentedainterfacegrfica.

7.3 Editando
Paraeditarocontedodeumaoumaisclulas,devemosteremmenteoseguinte:
a)obteraplanilhaondeseencontramasclulasaeditar;
b)obterumaextensocontendoasclulasaseremeditadas,estepassoopcional,poisuma
planilhaumaextensodeclulas;
c)obteraclulaaeditar;
d)definirocontedodaclula.
Oitem a)devesersolucionado comousodomtodo getSheets (),associadoaoacesso
nomeado,indexadoouenumerado,comodemonstradonaseosobrePlanilhas.
Asferramentasparasolucionarositensb),c)ed)tambmjforamapresentadasnaseo
sobreTabelaseenvolveosmtodosdasinterfacesXCellRangeeXCell.
Mtodosdainterfacecom.sun.star.table.XCellRange:
getCellByPosition(nColunaAsLong,nLinhaAsLong)AsObject<XCell>
getCellRangeByPosition(nEsq,nSup,nDir,nInf)AsObject<XCellRange>
getCellRangeByName(sRangeAsString)AsObject<XCellRange>
Devemoslembrarqueaposiodeumaclula,dentrodeumaextenso(range),relativaao
inciodaextenso.
Mtodosdainterfacecom.sun.star.table.XCell:
getFormula()AsString
setFormula(sFormulaAsString)
getValue()AsDouble
setValue(nValorAsDouble)
getType()AsLong<com.sun.star.table.CellContentType>
getError()AsLong
Pararelembrar,vejamosumexemplodeediodocontedodasclulasdeumaplanilha.
Digiteocdigoabaixo,executeeobserveoresultado.
Introduo ao OpenOffice.org Basic

67

Documentos do Calc

Verso 2

SubeditaPlanilha
DimoDeskAsVariant
DimoDocAsObject
DimmProp()AsVariant
DimsURLAsString
'
'criadocumentodoCalc
oDesk=createUnoService("com.sun.star.frame.Desktop")
sUrl="private:factory/scalc"
oDoc=oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp())
'
'editaclulasdaplanilha
DimoPlanilhaAsObject
DimoCelulaAsObject
DimsTitCol()AsString

'escreveostitulosdascolunas
sTitCol=Array("CDIGO","MATERIAL","QUANT","P.UNIT","P.TOTAL")
oPlanilha=oDoc.getSheets().getByIndex(0)
Fori%=0To4
oCelula=oPlanilha.getCellByPosition(i%,0)
oCelula.setString(sTitCol(i%))
Nexti%
'
'preencheasclulascomtexto,valoreformula
Fori%=1To6
Forj%=0To4
oCelula=oPlanilha.getCellByPosition(j%,i%)
If(j%=0)Then
Ifi%<4Then
oCelula.setString("A"+Str$(i%))
Else
oCelula.setString("A"+Str$(i%3))
EndIf
ElseIf(j%=1)Then
oCelula.setString("Materialdeconstruo"+Str$(i%))
ElseIf(j%=2)Then
oCelula.setValue(i%*j%)
ElseIf(j%=3)Then
oCelula.setValue(100*Rnd())
Else
sLinha=Trim$(Str$(i%+1))
sFormula="=C"+sLinha+"*"+"D"+sLinha
oCelula.setFormula(sFormula)
EndIf
Nextj%
Nexti%
'resumo
oCelula=oPlanilha.getCellByPosition(0,7)
oCelula.setString("CUSTOTOTAL")
'
sFormula="=Sum(E1:E6)"
oCelula=oPlanilha.getCellByPosition(4,7)
oCelula.setFormula(sFormula)
'
EndSub

Noteque,nasegundachamadadomtodosetFormula(),definimosafrmulausandoonome
deumafunoemingls.Parautilizarosnomesdasfunesexibidospelainterfacegrfica,
useapropriedadeFormulaLocal,doserviocom.sun.star.sheet.SheetCell.,porexemplo:
68

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

oCelula=oPlanilha.getCellByPosition(4,7)
sFormula="=Soma(E1:E6)"
oCelula.FormulaLocal=sFormula

OservioSheetCelldefineasseguintespropriedades:
Propriedade

Descrio

Position

Somente leitura, posio da clula na planilha

Size

Somente leitura, tamanho da clula em 1/100 mm

FormulaLocal

Cadeia com o nome local da frmula

FormulaResultType

Somente leitura, tipo do resultado de uma frmula

ConditionalFormat

Definies de formatao condicional da clula

ConditionalFormatLoc Definies locais de formatao condicional da clula


al
Validation

Definies de validao da clula

ValidationLocal

Definies locais de validao da clula

Naprximaseo,trataremosdacriaoeempregodeumcursor,outrafuncionalidadedos
documentosdoCalc.

7.4 Navegando pelas Clulas


Umaclulaouextensodeclulasidentificadapeloseuendereo,queformadopelos
ndices da planilha, coluna inicial, linha inicial, coluna final e linha final. A interface
XCellRangeAddressabledefineomtodoabaixo,paraarecuperaodesteendereo:
getRangeAddress()AsObject<com.sun.star.table.CellRangeAddress>
retornaumaestrutura CellRangeAddress comoselementosSheet,StartColumn,StartRow,
EndColumneEndRow.
Numaplanilha,tambmpodemoscriarumcursor.Estecursorumaextensodeclulascom
funcionalidadesparanavegao,formataoeedio,dentreoutras.
OservioSpreadsheet,atravsdainterfaceXSpreadsheet,defineosmtodosaseguir,paraa
criaodeumcursordeclulas:
createCursor()AsObject<XSheetCellCursor>
retornaumcursordeclulacontendotodaaplanilha
createCursorByRange(oExtensaoAsObject<XSheetCellCursor>)
retornaumcursordeclulacontendoaextensodeclulasdoparmetro

Introduo ao OpenOffice.org Basic

69

Documentos do Calc

Verso 2

Oservio SheetCellCursor fornecetodafuncionalidadeparaoperarmoscomumcursorde


clula.ElepossuiasinterfacesXSheetCellCursoreXUsedAreaCursor,almdesuportaros
serviostable.CellCursoreSheetCellRange.
A interface XSheetCellCursor define os mtodos a seguir, para contrair ou expandir o
cursor:
collapseToCurrentRegion()
collapseToCurrentArray()
collapseToMergedArea()
expandToEntireColumns()
expandToEntireRows()
collapseToSize(nColunasAsLong,nLinhasAsLong)
Os mtodos abaixo, da interface XUsedAreaCursor, so teis quando desejamos operar
sobreareautilizadadeumaplanilha.Porexemplo,identificaraltimaclulacomdados
numaplanilha.
gotoStartOfUsedArea(bExpandeAsBoolean)
gotoEndOfUsedArea(bExpandeAsBoolean)
AinterfaceXCellCursor,doservioCellCursor,provosseguintesmtodos,jexplicados
naseoTabelas,docaptuloDocumentosdoWriter:
gotoStart()
gotoEnd()
gotoNext()
gotoPrevious()
gotoOffSet(nDeslocColunaAsLong,nDeslocLinhaAsLong)
Parademonstrarousodeumcursor,digiteocdigofonteabaixoeexecute,observandoo
resultado.
SubcriaCursorCelulas
DimoDeskAsVariant
DimoDocAsObject
DimmProp()AsVariant
DimsURLAsString
'
'criadocumentodoCalc
oDesk=createUnoService("com.sun.star.frame.Desktop")
sUrl="private:factory/scalc"
oDoc=oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp())
'
'trabalhacomumcursor
DimoPlanAsObject
DimoCursorAsObject

oPlan=oDoc.getSheets().getByIndex(0)
oCursor=oPlan.createCursorByRange(oPlan.getCellByPosition(0,0))

70

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

'suportaXSpreadSheet
MsgBoxoCursor.getSpreadsheet().getName()
'editaalgumasclulas
'notequeaposiodaclularelativa
oCursor.getCellByPosition(0,0).setFormula("ClulaA1")
oCursor.gotoNext()
oCursor.getCellByPosition(0,0).setFormula("ClulaB1")
oCursor.gotoNext()
oCursor.getCellByPosition(0,0).setFormula("ClulaC1")
'moveocursor5celulasabaixo
oCursor.gotoOffSet(0,5)
oCursor.getCellByPosition(0,0).setFormula("AbaixodeC1")
oCursor.CharHeight=16
'obtmtodaareaemuso
oCursor.gotoStartOfUsedArea(False)
oCursor.gotoEndOfUsedArea(True)
'obtemeexibeoendereodocursor(ndices)
oEnd=oCursor.getRangeAddress()
MsgBoxStr$(oEnd.Sheet)+Str$(oEnd.StartColumn)+Str$(oEnd.StartRow)
MsgBoxStr$(oEnd.Sheet)+Str$(oEnd.EndColumn)+Str$(oEnd.EndRow)
EndSub

Aqui,usamosomtodocreateCursorByRange(),maspoderamosterusadocreateCursor().
Note que, para definir o contedo de uma clula, devemos obtla chamando o mtodo
getCellByPosition (),comaposio relativa aoincio daextensodeclulas docursor.
Observe,ainda,comosedaseleoeidentificaodareausadapelaplanilha.

7.5 Obtendo objetos selecionados


Osprincipaismtodosparaobterocontedodeumaseleo,estodefinidosnainterface
com.sun.star.frame.XModel,soeles:
getCurrentSelection()As<com.sun.star.uno.XInterface>
retornaaseleonocontroladorcorrenteouNullsenoexistirumcontrolador.
getCurrentController()As<com.sun.star.frame.XController>
retornaocontroladordomodeloouNullsenenhumcontroladorfoiregistrado.
Diversassituaesdeseleopodemocorrer,porexemplo:aseleodeumaextensode
clulas,aseleodeumgrfico,etc.Aseguir,vamosapresentarasmaiscomuns.
Ocdigoabaixodefineumobjetoclulacomaprimeiracluladaextensoselecionada.
'paraumaclula:com.sun.star.sheet.SheetCell
oCel=ThisComponent.getCurrentSelection().getCellByPosition(0,0)

Otrechodecdigoaseguirobtmumaextensodeclulascontnuasselecionadaeexibeos
ndicesdaplanilha,colunainicialefinal,linhainicialefinal.
'paraumaextenso:com.sun.star.sheet.CellRange
oExt=oDoc.getCurrentSelection()

Introduo ao OpenOffice.org Basic

71

Documentos do Calc

Verso 2

oEnd=oExt.getRangeAddress()
MsgBoxStr$(oEnd.Sheet)+Str$(oEnd.StartColumn)+Str$(oEnd.StartRow)
MsgBoxStr$(oEnd.EndColumn)+Str$(oEnd.EndRow)

Podemos,ainda,obteraseleodeextensesdeclulasnocontnuas,numamesmaplanilha
ouem planilhas diferentes, obloco de cdigo fonte abaixo lida com esta situao. Num
documentodoCalc,selecioneextensesnocontnuas,crieamacroeexecuteparavera
sada.
SubselecaoExtensoes
DimoDocAsObject
DimoExtsAsObject

oDoc=ThisComponent
'oExtssuportacom.sun.star.sheet.SheetCellRanges
oExts=oDoc.getCurrentSelection()
MsgBoxoExts.getCount()
oEnd=oExts.getRangeAddresses()
Forn=0ToUBound(oEnd)
MsgBoxStr$(oEnd(n).Sheet)+Str$(oEnd(n).StartColumn)+Str$(oEnd(n).StartRow)
Nextn
MsgBoxoExts.getRangeAddressesAsString()
EndSub

O mtodo getCurrentSelection ( ) lida com outros objetos, como grficos ou desenhos.


Podemosusaromtodo getImplementationName() ou supportsService(),paratentar
umaidentificaoinicialdoobjetoselecionado.
Temos,ainda,ainterface com.sun.star.view.XSelectionSupplier,quedefinemtodospara
seleopelainterfacegrfica,entreeles:
select(oObjetoAsObject)AsBoolean
sepossvel,selecionaoobjetooObjetonainterfacegrfica.
getSelection()oObjetoAsVariant
obtmaseleonainterfacegrfica,poderetornarumobjetoouumacoleodeobjetos.
Estesmtodospodemserchamadosatravsdoobjetocontroladordomodelo,comoabaixo:
'selecionaumaextensodeclulasnaplanilha
'
oDoc=ThisComponent
oCtr=oDoc.getCurrentController()
oPlan=oDoc.Sheets(0)
oExt=oPlan.getCellRangeByPosition(0,1,4,6)
If(oCtr.select(oExt))Then
MsgBox"Selecionadonavista"
Else
MsgBox"Noselecionado"
EndIf

72

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

AAPIdoOpenOffice.orgofereceoutrasfuncionalidades,comoaseleodeumaextensode
clulas durante a execuo de uma macro, a serem abordadas em outras sees deste
documento.

7.6 Formatando
AapresentaofinaldeumtrabalhomuitoimportanteeoCalcofereceumavastagamade
possibilidadesparanosauxiliarnaformataodosnossosdocumentos.

Formatando Pargrafos e Caracteres


Inicialmente, podemos aplicar ao contedo de uma clula as tcnicas de formatao de
pargrafosecaracteres.Osprincipaisservios,japresentadosnocaptulosobreDocumentos
doWrite,naseoFormatandoTextoso:
com.sun.star.style.ParagraphProperties
com.sun.star.style.CharacterProperties
Oserviocom.sun.star.table.TableRowdefineasseguintespropriedadesparaformataode
linhas:
Propriedade

Descrio

Height

Define a altura da linha em 1/100 mm

OptimalHeight

Se True, ajusta automaticamente a altura da linha

IsVisible

Se True, a linha ser exibida

IsStartOfNewPage

Se True, insere uma quebra vertical de pgina nesta linha

Oservio com.sun.star.table.TableColumn defineaspropriedadesabaixoparaformatao


decolunas:
Propriedade

Descrio

Width

Define a largura da coluna em 1/100 mm

OptimalWidth

Se True, ajusta automaticamente a largura da coluna

IsVisible

Se True, a coluna ser exibida

IsStartOfNewPage

Se True, insere uma quebra horizontal de pgina nesta


coluna

Outraspropriedadesparaaformataodeclulassocobertaspelosservios:
com.sun.star.table.CellProperties
com.sun.star.table.TableBorder
Introduo ao OpenOffice.org Basic

73

Documentos do Calc

Verso 2

com.sun.star.table.BorderLine
O servio CellProperties contm diversas propriedades. As mais importantes foram
apresentadasnocaptuloDocumentosdoWriter,naseosobreTabelas.
Vamosaplicaralgumaformataoaoexemplocriadopela SubeditaPlanilha.Adicioneo
cdigofonteabaixonofinaldasubrotina,executeeobserveasada:
'Formatao
DimoExtensaoAsObject
DimoLinhaAsObject
DimoColunaAsObject
'
'formatapargrafosecaracteres
oExtensao=oPlanilha.getCellRangeByPosition(0,0,5,0)
oExtensao.CharHeight=12
oExtensao.CharWeight=com.sun.star.awt.FontWeight.BOLD
oExtensao.ParaAdjust=com.sun.star.style.ParagraphAdjust.CENTER
'ajustaaalturadalinha1
oLinha=oPlanilha.getRows().getByIndex(0)
oLinha.OptimalHeight=True
'ajustaalarguradacolunaB
oColuna=oPlanilha.getColumns().getByIndex(1)
oColuna.OptimalWidth=True

Adestacar,omtododerecuperaodelinhasecolunas,viaacessoindexado.

Mesclando Clulas
Numaplanilha,podemosmesclarclulas,ainterface com.sun.star.util.XMergeable define
osmtodosabaixo,comestafinalidade:
merge(bMergeAsBoolean)
SebMergeTruemesclaareadoobjeto,senosepara.
getIsMerged()AsBoolean
RetornaTrueseareadoobjetoestivermesclada,senoretornaFalse

Inserindo Bordas
Outroaspectoimportantenaapresentaodeumaplanilhaacolocaodebordasemtorno
dasclulas.OservioCellPropertiescontmasseguintespropriedades,quedefinemotipo
debordadeumaclulaouextensodeclulas:
Popriedade

Descrio

TableBorder

Define a borda de uma clula ou extenso de clulas

TopBorder

Define a borda superior de cada clula da extenso

BottomBorder

Define a borda inferior de cada clula da extenso

RightBorder

Define a borda direita de cada clula da extenso

74

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

LeftBorder

Define a borda esquerda de cada clula da extenso

Oprincipalelementodecadaumadestaspropriedadesaestrutura BorderLine,contendo,
dentreoutros,oscamposColoreOuterLineWidthparaacoreaespessuradalinha.Paraa
propriedadeTableBorder,podemosdefinirquatrolinhas:TopLine,BottomLine,RightLine
eLeftLine.
Prosseguindocomonossoexemplo,vamosmesclaralgumasclulase,depois,definirbordas
paraanossaplanilha.AcrescenteocdigofonteaseguirnasubrotinaSubeditaPlanilhae
observeoresultadodaexecuo:
'mesclaclulas
oExtensao=oPlanilha.getCellRangeByPosition(0,7,3,7)
oExtensao.merge(True)
'DefineBorda
DimoBordaAsNewcom.sun.star.table.TableBorder
DimoLinBordaAsNewcom.sun.star.table.BorderLine
'
oExtensao=oPlanilha.getCellRangeByPosition(0,0,4,7)
'defineaespessuraeacordalinhadaborda
oLinBorda.OuterLineWidth=30
oLinBorda.Color=CLng("&H000099")
oExtensao.setPropertyValue("TopBorder",oLinBorda)
oExtensao.setPropertyValue("RightBorder",oLinBorda)
oExtensao.setPropertyValue("LeftBorder",oLinBorda)
oExtensao.setPropertyValue("BottomBorder",oLinBorda)
'defineeaplicaumaTableBorder
oLinBorda.OuterLineWidth=100
oLinBorda.Color=CLng("&HAABBCC")
oBorda.TopLine=oLinBorda
oBorda.BottomLine=oLinBorda
oBorda.RightLine=oLinBorda
oBorda.LeftLine=oLinBorda
oBorda.IsTopLineValid=True
oBorda.IsBottomLineValid=True
oBorda.IsRightLineValid=True
oBorda.IsLeftLineValid=True
oExtensao.setPropertyValue("TableBorder",oBorda)

Inicialmentedefinimosasbordasdetodasasclulasde oExtensao,depoisaplicamosuma
bordanaextenso.NoteoscamposIs...ValiddefinidoscomoTrue.

Formatao Numrica
OOpenOffice.orgpossuidiversascategoriasdeformataonumrica.Cadacategoriapossui
vrios

formatos

prdefinidos.

Atravs

da

interface
com.sun.star.util.XNumberFormatsSupplier podemos ler, modificar e adicionar novos
formatosaosnossosdocumentos.
AinterfaceXNumberFormatsSuppliercontmosmtodosabaixo:
getNumberFormats()AsObject<com.sun.star.util.XNumberFormats>
getNumberFormatsSettings()AsObject<com.sun.star.beans.XPropertySet>
Introduo ao OpenOffice.org Basic

75

Documentos do Calc

Verso 2

EntreosmtodosdainterfaceXNumberFormats,temos:
getByKey(nChaveAsLong)AsObject<XPropertySet>
queryKeys(nCategoriaAsLong,nLocalAsLong,bInserirAsBoolean)AsaVetor()
queryKey(sFormatoAsString,nLocalAsLong,bProcuraAsBoolean)AsLong
addNew(sFormatoAsString,nLocalAsLong)AsLong
Ainterfacecom.sun.star.util.XNumberFormatTypescontmmtodosparaobterondicede
algunsformatosprdefinidos.Aqui,usaremosomtodo:
getStandardFormat(nTipoASLong,nLocalAsLong)AsLong
Ogrupodeconstantescom.sun.star.util.NumberFormatdefinevalorespara,dentreoutras,
asseguintescategorias:DATE,TIME,CURRENCY,NUMBER,DATETIME.
O servio CellProperties contm a propriedade NumberFormat, que define o tipo
formataonumricadeumaclulaouextensodeclulas.
Vejamosumexemploilustrativo.NumdocumentodoCalc,crieamacroabaixo,executeae
observeoresultado.
SubexibeFormatosNumericos
DimoDocAsObject
DimoFormatosAsObject
DimmChavesAsVariant
DimmPropAsVariant
DimoLocalAsNewcom.sun.star.lang.Locale

oDoc=ThisComponent
oFormatos=oDoc.getNumberFormats()
oSettings=oDoc.getNumberFormatSettings()
oInfo=oSettings.getPropertySetInfo()
oProp=oInfo.getProperties()
MsgBoxUBound(oProp)
Forn=0ToUBound(oProp)
MsgBoxoProp(n).Name
Nextn
mChaves=oFormatos.queryKeys(0,oLocal,FALSE)
MsgBoxUBound(mChaves)
mProp=oFormatos.getByKey(11).getPropertyValues()
'obtemosnomesdaspropriedades
sMsg=""
Forn=0ToUBound(mProp)
sMsg=sMsg+mProp(n).Name+Chr$(13)
Nextn
MsgBoxsMsg
'exibeovalordeFormatString
MsgBoxmProp(0).Value
EndSub

76

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

Agora, vamos retornar nossa subrotina Sub editaPlanilha para aplicar formatao
numricaemalgumasclulas.Adicioneocdigoabaixo,executeeobserveasada:
'FormatosNumricos
DimoFormatosAsObject
DimaLocal()AsNewcom.sun.star.lang.Locale
'obtemosformatosnumericosdomodelo
oFormatos=oDoc.getNumberFormats()
'obtmondicedoformatopadroparaMOEDA
n%=oFormatos.getStandardFormat(com.sun.star.util.NumberFormat.CURRENCY,aLocal())
'obtemumaextensodeclulas
oExtensao=oDoc.getSheets().getByIndex(0).getCellRangeByPosition(3,1,4,6)
'alteraoformatopadroparaMOEDA
oExtensao.NumberFormat=n%
'obtmumaclulaealteraparaMOEDA
oCelula=oPlanilha.getCellByPosition(4,7)
oCelula.NumberFormat=n%

Noteadeclaraodosobjetos,ousodomtodogetStandardFormat()eousodapropriedade
NumberFormatparaalteraraformataodasclulas.

Formatao Condicional
O servio com.sun.star.sheet.SheetCellRange contm as seguintes propriedades para
formataocondicional:
conditionalFormat
definecondiesparaformataocondicional
conditionalFormatLocal definecondieslocaisparaformataocondicional
Ainterface XSheetConditionalEntries provosmtodosaseguirparaoperaescomas
condiesdeformatao:
addNew(mCond()As<com.sun.star.beans.PropertyValue>)
oparmetromCondumvetorcomasseguintesentradas:
Operatorcomospossveisvalores,definidosemcom.sun.star.sheet.ConditionOperator
NONE,EQUAL,NOT_EQUAL,GREATER,GREATER_EQUAL,
LESS,LESS_EQUAL,BETWEEN,NOT_BETWEEN,FORMULA
Formula1contendoumacadeiacomumvaloroufrmula
Formula2contendoumvaloroufrmula,usadaquandoooperadorforBETWEEN
StyleNamecontendoumnomedeestilodeformataodeclula
removeByIndex(nIndiceAsLong)
removeacondionIndice
clear()
limpaascondiesatuaisdeformatao
AcrescenteocdigoabaixonofinaldaSubeditaPlanilha,executeeobserveasada:

Introduo ao OpenOffice.org Basic

77

Documentos do Calc

Verso 2

'FORMATAOCONDICIONAL
'
DimmCond(2)AsNewcom.sun.star.beans.PropertyValue
DimoEntradasAsVariant
'obtemumaextensodeclulas
oExtensao=oDoc.getSheets().getByIndex(0).getCellRangeByPosition(4,1,4,6)
'obtmaformataocondicionalcorrente
oEntradas=oExtensao.getPropertyValue("ConditionalFormat")
'defineaspropriedadesdeumacondioparaformatao
mCond(0).Name="Operator"
mCond(0).Value=com.sun.star.sheet.ConditionOperator.GREATER
mCond(1).Name="Formula1"
mCond(1).Value="500"
mCond(2).Name="StyleName"
mCond(2).Value="Result"
'limpaascondioesexistentes
oEntradas.clear()
'adicionaanovacondio
oEntradas.addNew(mCond())
'aplicaaformataocondicional
oExtensao.setPropertyValue("ConditionalFormat",oEntradas)

Nestecdigo,aplicamosoestiloResultadoseovalordaclulaformaiorqueR$500,00.
Podemos,tambm,aplicarestilosdeformataodeclulasdefinidospelosusurios.

7.7 Busca e Substituio


Abuscaesubstituio,numdocumentodoCalc,funcionademodosemelhantequelej
demonstradonaseoBuscaeSubstituio,docaptuloDocumentosdoWriter.
Relembrando, a interface com.sun.star.util.XSearchable prov os mtodos abaixo para
busca:
createSearchDescriptor()AsObject<SearchDescriptor>
FindAll(oDescritorAsObject)AsObject<com.sun.star.container.XIndexAccess>
FindFirst(oDescritorAsObject)AsObject<com.sun.star.uno.XInterface>
FindNext(oInicioAsObject,oDescritorAsObject)AsObject<Xinterface>
OservioSearchDescriptortemosmtodosabaixo:
getSearchString()AsString
setSearchString(sCadeiaAsString)
Eisalgumasdesuaspropriedades:
Propriedade

Descrio

SearchBackwards

Se True, busca para o incio do documento

SearchCaseSensitive

Se True, considera maisculas / minsculas

78

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

Propriedade

Descrio

SearchWords

Se True, localiza apenas as clulas com o texto e nada


mais, seno localiza tambm as clulas onde o texto
parte do contedo.

SearchStyles

Se True, busca por um estilo de clula

Vejamosumexemplodebusca:crieumnovodocumentodoCalc,preenchaalgumasclulas
comotextoTOTALeTOTALGERAL,emseguidacrieamacroabaixoeexecute.
SubbuscaTexto
DimoDocAsObject
DimoDescBuscaAsObject
DimoPlanilhaAsObject

oDoc=ThisComponent
oPlanilha=oDoc.Sheets(0)
oDescBusca=oPlanilha.createSearchDescriptor()
oDescBusca.SearchWords=True
oDescBusca.setSearchString("TOTAL")
oResultado=oPlanilha.findFirst(oDescBusca)
i=0
DoUntilIsNull(oResultado)
oResultado.CharColor=RGB(250,100,50)
oResultado=oPlanilha.findNext(oResultado,oDescBusca)
i=i+1
Loop
MsgBox"Ocorrnciasde"+oDescBusca.getSearchString()+""+Str$(i)
EndSub

Agora, altere a propriedade SearchWords para False e execute novamente a macro


observandooseuresultado.
A substituio de texto implementada pela interface XReplaceable, que herda as
caractersticasdeXSearchable.Elaprovosmtodos:
createReplaceDescriptor()AsObject<com.sun.star.util.XReplaceDescriptor>
replaceAll(xDescritorAsObject<com.sun.star.util.XReplaceDescriptor>)AsLong
OservioReplaceDescriptortemmtodosparaaspropriedadesdacadeia:
getReplaceString()AsString
setReplaceString(sCadeiaAsString)
Eisumabuscaesubstituiosimples,nomesmodocumentodoexemploacima:
SubsubstituiTexto
DimoDocAsObject
DimoDescritorAsObject
DimoPlanilhaAsObject
oDoc=ThisComponent

Introduo ao OpenOffice.org Basic

79

Documentos do Calc

Verso 2

oPlanilha=oDoc.Sheets(0)
oDescritor=oPlanilha.createReplaceDescriptor()
oDescritor.setSearchString("TOTALGERAL")
oDescritor.setReplaceString("Total")
n=oPlanilha.replaceAll(oDescritor)
sMsg=oDescritor.getSearchString()+por+oDescritor.getReplaceString()
MsgBoxsMsg+=+Str$(n)
EndSub

Notequedevemosexecutarabuscaeasubstituionumaextensodeclulas.Nosexemplos,
utilizamostodaaplanilha.

7.8 Ordenando
Para a ordenao de uma extenso de clulas, devemos utilizar os mesmos conceitos e
serviosjapresentadosnaseoTabelas,docaptulosobreDocumentosdoWriter.
Seguem,abaixo,osprincipaismtodosepropriedadesutilizadosnestatarefa.
Mtodosdainterfacecom.sun.star.util.XSortable:
createSortDescriptor()AsVariant<com.sun.star.beans.PropertyValue>
sort(xDescritorAsVariant<com.sun.star.beans.PropertyValue>)
Algumasdaspropriedadesdodescritordeordenao(SortDescriptor):
Propriedade

Descrio

IsCaseSensitive

Se True, considera maisculas / minsculas

SortAscending

Define a ordem da ordenao

SortColumns

Se True ordena as colunas, seno ordena as linhas.

Oserviocom.sun.star.table.TableSortDescriptorincluioservioSortDescriptorepossui
aspropriedadesabaixo:
Propriedade

Descrio

SortFields

Descreve
os
campos
<com.sun.star.util.SortField>

MaxFieldCount

Define o nmero mximo de campos, somente leitura

Orientation

Define
a
orientao
<com.sun.star.table.TableOrientation>

ContainsHeader

Se True, no ordena a primeira linha ou coluna

80

de

da

ordenao

ordenao

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

Noprximoblocodecdigo,veremosaordenaodeumaextensodeclulas(A2:E7),do
documentocriadopelaSubeditaPlanilha.Digiteocdigoabaixonofinaldamacro,execute
eobserveasaida.
'=================================
'ORDENANDOUMAEXTENSODECLULAS
'=================================
DimoCampoOrd(0)AsNewcom.sun.star.util.SortField
DimoDescrOrdAsVariant
'
'defineaextensoaserordenada(A2:E7)
oExtensao=oDoc.getSheets().getByIndex(0).getCellRangeByPosition(0,1,4,6)
'defineocampodeordenaoesuaspropriedades
oCampoOrd(0).Field=0
oCampoOrd(0).SortAscending=True
oCampoOrd(0).FieldType=com.sun.star.util.SortFieldType.ALPHANUMERIC
'criaodescritordeordenao
oDescrOrd=oExtensao.createSortDescriptor()
'defineaspropriedadesdodescritor
oDescrOrd(0).Name="SortFields"
oDescrOrd(0).Value=oCampoOrd()
oDescrOrd(1).Name="ContainsHeader"
oDescrOrd(1).Value=False
oDescrOrd(2).Name="SortColumns"
oDescrOrd(2).Value=False
'ordenaaextenso
oExtensao.sort(oDescrOrd())

Notequeiniciamoscom adeclaraodasvariveis,criamosumaextensodeclulascom
umachamadaaomtodogetCellRangeByPosition(),definimosaspropriedadesdocampode
ordenao,criamosodescritoredefinimosassuaspropriedades(ocampodeordenao
umapropriedadedodescritor)e,finalmente,invocamosomtodosort()paraexecutarasua
tarefa.

7.9 Filtrando dados


Nestaseo,veremos osprincipais servios einterfaces relacionados comaaplicao de
filtrosnumaextensodeclulas.
Ainterfacecom.sun.star.sheet.XSheetFilterabledefineosseguintesmtodos:
createFilterDescriptor(bVazioAsBoolean)AsObject<XSheetFilterDescriptor>
criaumdescritorvaziosebVazioforTrue,senopreservaasinformaes
filter(oDescritorAsObject<XSheetFilterDescriptor>)
aplicaofiltronaextensodeclulas
OservioSheetFilterDescriptorcontrolaascondiesdaoperaodefiltragem.Eisalgumas
desuaspropriedades:
IsCaseSensitive
SkipDuplicates
Orientation

seTrue,destinguemaisculaseminsculas
seTrue,asentradasduplicadasseroexcludas
filtraporLinhasouColunas(TableOrientation)

Introduo ao OpenOffice.org Basic

81

Documentos do Calc

ContainsHeader
CopyOutputData
OutputPosition

Verso 2

aprimeiralinhaoucolunaumcabealho
seTrue,oresultadosercopiadoparaoutrolocal
localdacpia(estruturaCellAddress)

A interface XSheetFilterDescriptor contm os mtodos abaixo para obter e definir os


camposcomoscritriosdofiltro:
getFilterFields()aCampos()AsObject<TableFilterField>
retornaoscamposcomoscritriosdofiltro
setFilterFields(aCampos()AsObject<TableFilterField>)
defineoscamposcomoscritriosdofiltro
Aestruturacom.sun.star.table.TableFilterFieldcontmoselementosaseguir:
Connection
Field
Operator
IsNumeric
NumericValue
StringValue

comoseraconexocomacondioanterior(Or/And)
acolunausadanacondio
operadorcondicional(FilterOperator)
seTrue,ovalordocampo(Field)numrico
valordocampo,usarseIsNumericforTrue
cadeiadecaracteres,usarseIsNumericforFalse

Ospassosnecessriosparafiltrardadosnumaplanilhaso:
a)obteraextensodeclulasaserfiltrada;
b)definiraestruturadoscamposcomoscritriosdofiltro;
c)criaredefinirosdadosdodescritordofiltro;
d)aplicarofiltro.
Vejamosumtrechodecdigofontequeaplicaumfiltrosimplesnumaextensodeclulas.
SubaplicaFiltro
DimoDocAsObject
DimoPlanAsObject
DimoExtAsObject
DimoDescFiltroAsVariant
DimoCamposFiltro(0)AsNewcom.sun.star.sheet.TableFilterField

oDoc=ThisComponent
oPlan=oDoc.getSheets().getByIndex(0)
oExt=oPlan.getCellRangeByPosition(0,1,4,6)
'defineaestruturaTableFilterField
oCamposFiltro(0).Field=4
oCamposFiltro(0).IsNumeric=True
oCamposFiltro(0).Operator=
com.sun.star.sheet.FilterOperator.GREATER_EQUAL
oCamposFiltro(0).NumericValue=300
'criaodescritordofiltrovazio(True)
oDescFiltro=oExt.createFilterDescriptor(True)
'defineocampodefiltro
oDescFiltro.setFilterFields(oCamposFiltro())
'aplicaofiltro

82

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

oExt.filter(oDescFiltro)
'
MsgBox"OKparafiltrarCaracteres"
'redefineaestruturaTableFilterField
oCamposFiltro(0).Field=0
oCamposFiltro(0).IsNumeric=False
oCamposFiltro(0).Operator=com.sun.star.sheet.FilterOperator.GREATER
oCamposFiltro(0).StringValue="A1"
'criaumdescritordefiltrovazio(True)
oDescFiltro=oExt.createFilterDescriptor(True)
'defineocampodefiltro
oDescFiltro.setFilterFields(oCamposFiltro())
'aplicaofiltro
oExt.filter(oDescFiltro)
EndSub

Sevocquiserexperimentarestecdigo,crieumamacro nodocumentogeradopela Sub


editaPlanilhaeexecute,observandoasada.NotequeaestruturaTableFilterFieldpodeter
maisdeumcampocomcritriosdefiltragem.
TenteacrescentarcdigoparacopiaroresultadodofiltronaPlanilha2dodocumento.

7.10 Inserindo Subtotais


Operaesdesubtotais,sobrenumaextensodeclulas,sodegrandepraticidade.AAPIdo
OpenOffice.orgoferecediversosservioseinterfacesparaaprogramaodesubtotais.
AinterfaceXSubTotalCalculatabledefineosmtodosabaixo:
createSubTotalDescriptor(bVazioAsBoolean)AsObject<XSubTotalDescriptor>
criaumdescritordesubtotalvaziosebVazioforTrue,senopreservadadosanteriores
applySubTotals(oDescAsObject<XSubTotalDescriptor>,bSubstituiAsBoolean)
aplicaosubtotal,sebSubstituiforTrueoresultadoanteriorsersubstitudo
removeSubTotals()
removeossubtotaisdoobjeto
Oservio SubTotalDescriptor umarepresentaodecomoossubtotaisserocriados.A
seguir,algumasdesuaspropriedades:
InsertPageBreaks
IsCaseSensitive
EnableUserSortList
UserSortListIndex
EnableSort
SortAscending

inserequebradepginaapscadasubtotal
consideraletrasmaisculas/minsculas
seTruepermiteadefiniodeumalistaparaordenao
alistaparaordenao,seEnableUserSortListforTrue
defineseocontedodoscamposseroordenados
seTrueordenaocrescente(dependedeEnableSort)

Almdaspropriedadesacima,odescritordeveconteroscamposdesubtotais.Ainterface
XSubTotalDescriptorprovmtodosparaadicionaroulimparcampos:
addNew(aColunas()As<SubTotalColumn>,nColGrupoAsLong)
adicionaoscamposaodescritor,nColGrupoespecificaacolunabaseparaagrupamento
Introduo ao OpenOffice.org Basic

83

Documentos do Calc

Verso 2

clear()
removetodososcamposdesubtotaisdoobjeto
Aestruturacom.sun.star.sheet.SubTotalColumncontmoselementos:
Column
Function

ndicedacolunaasubtotalizar
otipodesubtotal,definidoemcom.sun.star.sheet.GeneralFunction

Ospassosnecessriosparaadicionarlinhascomsubtotaisnumaextensodeclulasso:
a)obteraextensodeclulasasersubtotalizada;
b)definiraestruturadoscamposdesubtotal;
c)criaredefinirosdadosdodescritordesubtotal;
d)aplicaraoperaodesubtotal.
Vejamosumtrechodecdigofontequeaplicaumsubtotalnumaextensodeclulas.
SubaplicaSubTotal
DimoDocAsObject
DimoPlanAsObject
DimoExtAsObject
DimoDescSubTotalAsVariant
DimoCamposSubTotal(0)AsNewcom.sun.star.sheet.SubTotalColumn

oDoc=ThisComponent
oPlan=oDoc.getSheets().getByIndex(0)
oExt=oPlan.getCellRangeByPosition(0,0,4,6)
'defineaestruturaSubTotalColumn
oCamposSubTotal(0).Column=4
oCamposSubTotal(0).Function=com.sun.star.sheet.GeneralFunction.SUM
'criaodescritordosubtotal
oDescSubTotal=oExt.createSubTotalDescriptor(True)
'adicionaocamposubtotaleacolunabase
oDescSubTotal.addNew(oCamposSubTotal(),0)
'aplicaosubtotal
oExt.applySubTotals(oDescSubTotal,True)
EndSub

Sevocquiserexperimentarestecdigo,crieumamacro nodocumentogeradopela Sub


editaPlanilha,executeeanaliseoresultado.

7.11 Grficos
UmgrficoumdocumentoembutidonumoutrodocumentodoOpenOffice.org.AAPIdo
OpenOffice.orgcontmdiversosservioseinterfacesparaageraodegrficos,apartirdos
dadoscontidosnumaplanilha.
Oserviocom.sun.star.table.TableChartssuportaosmtodosdasinterfacesXTableCharts,
XIndexAccesseXEnumerationAccess.
Mtodosdainterfacecom.sun.star.table.XTableCharts:
addNewByName(sNomeAsString,
84

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

oAreaAsObject<com.sun.star.awt.Rectangle>,
oExt()AsObject<com.sun.star.table.CellRangeAddress>,
bTitColAsBoolean,bTitLinAsBoolean)
Adicionaogrficonacoleodegrficosdaplanilha.Osseusparmetrosso:
sNome
oArea
oExt
bTitCol
bTitLin

onomedogrfico
area(retngulo)aondeogrficoserplotado
aextensodeclulascomosdados
seTrue,osdadosdalinhasuperiorserousadosnalegendadogrfico
seTrue,osdadosdaprimeiracolunaserousadoscomottulosnoeixo

removeByName(sNomeAsString)
removeogrficocomonomesNomedacoleo.
Oserviocom.sun.star.table.TableChartsuportaainterfaceXTableChartcomosmtodos:
getHasColumnHeaders()AsBoolean
setHasColumnHeaders(bTituloColunaAsBoolean)
getHasRowHeaders()AsBoolean
setHasRowHeaders(bTituloColunaAsBoolean)
getRanges()AssExtensoes()<CellRangeAddress>
setRanges(sExtensoes()AsObject<CellRangeAddress>)
Umdocumento grfico contm uma referncia para umafonte dedados,um diagrama e
algumas propriedades como ttulo, subttulo e legenda. O servio ChartDocument o
modelo do documento grfico e suporta as interfaces XChartDocument, XPropertySet e
XMultiServiceFactory.Elepossuiasseguintespropriedades:
HasMainTitle
HasSubTitle
HasLegend

SeTrue,exibeottuloprincipal
SeTrue,exibeosubttulo
SeTrue,exibealegenda

Ainterfacecom.sun.star.chart.XChartDocumentprovosmtodos:
getTitle()As<com.sun.star.drawing.XShape>
getSubTitle()As<com.sun.star.drawing.XShape>
getLegend()As<com.sun.star.drawing.XShape>
getArea()As<com.sun.star.beans.XPropertySet>
getDiagram()As<com.sun.star.chart.XDiagram>
setDiagram(oDiagramaAs<com.sun.star.chart.XDiagram>)
getData()As<com.sun.star.chart.XChartData>
attachData(oDadosExternosAs<com.sun.star.chart.XChartData>)
Odiagramaoobjetoquecontmaformadogrfico,baseadanoservio Diagramesuas
interfacesXDiagrameXPropertySet.Diferentestiposdediagramaspodemsercriadoscomo
mtodocreateInstance(),dainterfaceXMultiServiceFactory.Eisalgunsserviosparatipos
dediagramas:
Introduo ao OpenOffice.org Basic

85

Documentos do Calc

Verso 2

com.sun.star.chart.BarDiagram
com.sun.star.chart.LineDiagram
com.sun.star.chart.PieDiagram
com.sun.star.chart.AreaDiagram
com.sun.star.chart.XYDiagram
PodemosalterarapropriedadeDiagramdeumgrficocomocdigoaseguir:
oDiagrama=oGraf.createInstance("com.sun.star.chart.PieDiagram")
oGraf.setDiagram(oDiagrama)

Oserviocom.sun.star.chart.Diagramtemaspropriedadesabaixo:
DataRowSource
DataCaption

defineseasriededadosporlinhasoucolunas
definecomoalegendadosdadosserexibida

Paracriarumgrficodevemosseguirospassosabaixo:
a)definirosdadosaseremexibidosnogrfico;
b)definirarearetangularaondeogrficoserdesenhado;
c)adicionarogrficocoleo;
d)recuperaroobjetogrficoembutido.
e)definiraspropriedadesdogrfico.
Vejamosumexemplosimples.Digiteamacroaseguireexecuteparaverasada:
SubcriaGrafico
DimoDeskAsVariant
DimoDocAsObject
DimmProp()AsVariant
DimsURLAsString
'criadocumentodoCalc
oDesk=createUnoService("com.sun.star.frame.Desktop")
sUrl="private:factory/scalc"
oDoc=oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp())
'editaclulasdaplanilha
DimoPlanilhaAsObject
DimoCelulaAsObject
DimsTitCol()AsString
'escreveostitulosdascolunas
sTitCol=Array("Perodo","Computador","Perifrico","Servio","Total")
oPlanilha=oDoc.getSheets().getByIndex(0)
Fori%=0To4
oCelula=oPlanilha.getCellByPosition(i%,0)
oCelula.setString(sTitCol(i%))
Nexti%
'preencheasclulascomtexto,valoreformula
Fori%=1To4
Forj%=0To4
oCelula=oPlanilha.getCellByPosition(j%,i%)
If(j%=0)Then
oCelula.setString(Str$(i%)+"Trim")
ElseIf(j%>0Andj<4)Then

86

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

oCelula.setValue(1000*Rnd())
Else
sExt="B"+Trim$(Str$(i%+1))+":"+"D"+Trim$(Str$(i%+1))
sFormula="=Soma("+sExt+")"
oCelula.FormulaLocal=sFormula
EndIf
Nextj%
Nexti%
'
'insereumgrficodecolunas
DimoRetAsNewcom.sun.star.awt.Rectangle
DimoEndExt(0)AsNewcom.sun.star.table.CellRangeAddress
DimoGraficosAsObject
'defineonomedogrfico
sNome="Trimestral"
'defineoendereodaextensodeclulascomosdados
oEndExt(0).Sheet=0
oEndExt(0).StartColumn=0
oEndExt(0).StartRow=0
oEndExt(0).EndColumn=3
oEndExt(0).EndRow=4
'defineareadogrfico
oRet.X=1000
oRet.Y=3000
oRet.Width=12000
oRet.Height=12000
'obtmacoleodegrficosdaPlanilha1
oGraficos=oPlanilha.Charts
'adicionaumgrficocoleo
oGraficos.addNewByName(sNome,oRet,oEndExt(),True,True)
'defineaspropriedades(Titulo)
oGraf=oGraficos.getByName(sNome).getEmbeddedObject()
oGraf.Title.String="FaturamentoTrimestral"
oGraf.HasSubTitle=True
oGraf.SubTitle.String="Ano2003"
EndSub

Comeamospreenchendoasclulascomosdados,depois,definimosonomedogrfico,a
extensodeclulascomosdadosearea(retngulo)aondeogrficoserplotado.Apsestes
passos preliminares, obtemos a coleo dos grficos da planilha e adicionamos o nosso
grficonacoleo,comumachamadaaomtodoaddNewByName().Finalmente,obtemos
oobjetogrficoembutido,comumachamadaaomtodogetByName()associadaaomtodo
getEmbeddedObject()e,ento,alteramosalgumaspropriedadesdogrfico.
Aproveitandooexemploacima,vamosmostrarcomoalterarapropriedadeDiagramdeum
grfico.AcrescenteocdigofonteabaixoaofinaldaSubcriaGraficoeexecuteparacriar
umgrficodotipoPizza,representandoosdadosdalinha2daplanilha.
'CriandoumgrficodotipoPizza
DimoExtPizza(1)AsNewcom.sun.star.table.CellRangeAddress
'
MsgBox"OKparaumaPizza"
'removeogrficodebarras
oGraficos.removeByName(sNome)
sNome="GrafPizza"
'defineoendereodaextensodeclulascomlegendas
oExtPizza(0).Sheet=0
oExtPizza(0).StartColumn=0

Introduo ao OpenOffice.org Basic

87

Documentos do Calc

Verso 2

oExtPizza(0).StartRow=0
oExtPizza(0).EndColumn=3
oExtPizza(0).EndRow=0
'defineoendereodaextensodeclulascomdados
oExtPizza(1).Sheet=0
oExtPizza(1).StartColumn=0
oExtPizza(1).StartRow=1
oExtPizza(1).EndColumn=3
oExtPizza(1).EndRow=1
'adicionaumgrficocoleo
oGraficos.addNewByName(sNome,oRet,oExtPizza(),True,True)
'defineaspropriedades
oGraf=oGraficos.getByName(sNome).getEmbeddedObject()
oGraf.Diagram=oGraf.createInstance("com.sun.star.chart.PieDiagram")
oGraf.Diagram.DataRowSource=com.sun.star.chart.ChartDataRowSource.ROWS
oGraf.Title.String="1Trimestre2003"

Observequetemosumvetordeestruturas CellRangeAddress,ondeoprimeiroelemento
contmosdadosdalegendadogrficoeosegundoosdadosaseremrepresentados.Note
tambmamudanadapropriedade Diagramcomumachamadaaomtodo createInstance
()eamudanadapropriedadeDataRowSourcedodiagrama.
Note,ainda,queofatodepodermosdefinirumvetorCellRangeAddress,indicaquepodemos
ter extenses de clulas, consecutivas ou no, contendo os dados a serem representados
graficamente.

7.12 Seleo durante a execuo da macro


AAPIdoOpenOffice.orgofereceummecanismosimplesparaaseleodeumaextensode
clulas, durante a execuo da macro. Segue uma descrio dos principais servios e
interfacesutilizadosnestatarefa.
Oserviocom.sun.star.sheet.RangeSelectionArgumentsdefineaspropriedadesabaixo:
InitialValue
$Planilha1.$a$1:$b$5
Title
CloseOnMouseRelease

Valor inicial para a seleo, por ex:


Ttulododilogodaseleo
SeTrueencerraaseleoapsaliberaodobotodomouse

Ainterfacecom.sun.star.sheet.XRangeSelectionprovosseguintesmtodos:
startRangeSelection(aProp()AsObject<com.sun.star.beans.PropertyValue>)
iniciaoprocessodeseleodaextensodeclulas
abortRangeSelection()
abortaoprocessodeseleo
addRangeSelectionListener(oListAs<com.sun.star.sheet.XRangeSelectionListener>)
adicionaumlistenerparamonitorarotrminoouocancelamentodaseleo
removeRangeSelectionListener(oListAs<com.sun.star.sheet.XRangeSelectionListener>)
88

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

removeolistenerespecificadonoparmetro
addRangeSelectionChangeListener(oListAs<XRangeSelectionChangeListener>)
adicionaumlistenerparamonitorarmudanasduranteaseleo
removeRangeSelectionChangeListener(oListAs<XRangeSelectionChangeListener>)
removeolistenerdemudanasespecificadonoparmetro
Ainterface com.sun.star.sheet.XRangeSelectionListener especificaosmtodos abaixo,a
seremdefinidospelousurio,usandooBasic:
done(aEventoAs<com.sun.star.sheet.RangeSelectionEvent>)
contmocdigoaserexecutadoapsotrminodaseleo
aborted(aEventoAs<com.sun.star.sheet.RangeSelectionEvent>)
contmocdigoaserexecutadoapsocancelamentodaseleo
Aestruturacom.sun.star.sheet.RangeSelectionEventcontmoelementoRangeDescriptor,
queumarepresentaotextualdaextensodeclulasselecionadas.
Devemos criar uma instncia do listener chamando a funo createUnoService ( ) do
OpenOffice.orgBasic,eisasuasintaxe:
createUnoService(sPrefixoAsString,sListenerAsString)AsObject
sPrefixo:oprefixousadononomedosmtodosdolistener.Ocaracteresublinhado
deveseroltimodoprefixo(ex:listen_).
sListener:onomedainterfacedolistener
retornaumobjetolistener,cujosmtodospodemserusadosnamacro.
Bem,jtemostodasasferramentasnecessriasparaexecutaranossatarefa.Vejamoscomo
uslasatravsdeumexemplosimplesdeseleo.
Abra uma nova planilha e salvea, em seguida crie um novo mdulo para a macro, isto
porqueusamosvariveisPblicasemnossamacro.Finalmente,digiteocdigofonteabaixo
(oucopieecole)nonovomdulo.Ativeaplanilhaeexecuteamacro,surgeumacaixade
dilogosolicitandoaseleodaextenso,useomouseouotecladoparaselecionar.Apsa
seleo,apropriedadeCharHeightdaextensoseralterada.
'
'seleodeumaextensoduranteaexecuodamacro
'usandoXRangeSelectionListener
'
PublicaListenerAsObject
PublicaResultAsString
PublicbSelecaoAsBoolean
SubMain
'
DimoDocAsObject
DimoDocViewAsObject
DimoPlanAsObject
DimaProp(2)AsNewcom.sun.star.beans.PropertyValue
'
oDoc=ThisComponent
oDocView=oDoc.getCurrentController()

Introduo ao OpenOffice.org Basic

89

Documentos do Calc

Verso 2

'defineumouvinte(listener)
SetaListener=CreateUnoListener("oList_",_
"com.sun.star.sheet.XRangeSelectionListener")
'adicionaoouvinte
oDocView.addRangeSelectionListener(aListener)
'defineaspropriedadesparaaseleo
aProp(0).Name="InitialValue"
aProp(0).Value=""'"$Planilha1.$A$1:$B$2"
aProp(1).Name="Title"
aProp(1).Value="Selecionea"
aProp(2).Name="CloseOnMouseRelease"
aProp(2).Value=True
'iniciaoprocessodeseleo
bSelecao=False
oDocView.startRangeSelection(aProp())
DoWhile(bSelecao=False)
'aguardaaseleo
Loop
'removeoouvinte(listener)
oDocView.removeRangeSelectionListener(aListener)
'operasobreoresultadodaseleo
If(bSelecao=TrueAndLen(aResult)>0)Then
MsgBoxaResult
oPlan=oDocView.getActiveSheet()
oRange=oPlan.getCellRangeByName(aResult)
oRange.CharHeight=20
Else
MsgBox"Seleorecusada"
EndIf
'
EndSub
'Mtodosdainterfacecom.sun.star.sheet.XRangeSelectionListener
'done()
SuboList_done(oEvent)
'obtemonomedaextenso
aResult=oEvent.RangeDescriptor
bSelecao=True
EndSub
'aborted()
SuboList_aborted(oEvent)
bSelecao=True
EndSub
SuboList_disposing()
'implementaomnima
EndSub

Inicialmentedefinimosalgumasvariveispblicas,depoisobtemosavistadodocumento,
pois a seleo ocorre na vista e chamamos a funo createUnoListener para criar uma
instnciadainterfaceXRangeSelectionListener,noteoprefixocomosublinhadonofinal.
Aps a criao, registramos o listener com addRangeSelectionListener, como se
estivessemosdizendoaoOpenOffice.org:ei,temosumnovomonitordeseleoparaavista
destedocumento.

90

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

Definimos ento, as propriedades iniciais para a nossa seleo, note que o valor da
propriedade CloseOnMouseRelease True, e atribuimos o valor False para o sinalizador
bSelecao. Depois, chamamos o mtodo startRangeSelection passando o vetor com as
propriedadesiniciais.
Aseguir,nolaoDoWhile...Loop,aguardamosaseleodousurio.Amacrosabandona
olaoquandoovalordebSelecaoforTrue.Istosacontecenosmtodosdone()eaborted()
dolistener.EstesmtodossochamadosautomaticamentepeloOpenOffice.orgnofinalou
nocancelamentodaseleo,isto,quandoousuriocompletaraseleo,liberandooboto
domouseouquandoelefecharodilogodeseleo.
Terminadaaseleo,removemosolistenercomomtodoremoveRangeSelectionListener
e,finalmente,processamosoresultadodanossaseleo.
AlmdasubrotinaMain,temos,emnossamacro,assubrotinasabaixo:
SuboList_done(oEvent)
SuboList_aborted(oEvent)
SuboList_disposing()

correspondeaomtododone()dainterface
correspondeaomtodoaborted()dainterface
chamadanaremoodolistener

Nasubrotinadone(),atribuimosadescriotextualdaseleovarivelpblicaaResult,
atravs do elemento RangeDescriptor da estrutura oEvent, e, depois, definimos o nosso
sinalizadorbSelecaoparaTrue.
Nasubrotinaaborted(),apenasdefinimosonossosinalizadorbSelecaoparaTrue.
NoteousodoprefixodecreateUnoListenerantecedendoosnomesdosmtodosdainterface.
AAPIdoOpenOffice.orgcontmmuitasinterfacesqueusamlisteners.muitoimportante
quetodososmtodosdainterfacesejamimplementadoscomoBasic.Quandonenhumaao
fornecessria,faaumaimplementaomnima,comoemoList_disposing().

7.13 Movimentando dados


Podemosinserir,copiar,moverouremoverumgrupodeclulas,nodocumento,atravsda
interfacecom.sun.star.sheet.XCellRangeMovement,doservioSpreadsheet,eseusmtodos:
insertCells(mEnderecoAs<com.sun.star.table.CellRangeAddress>,nModoAsInteger)
insereasclulasnolocalmEndereco;osvaloresdenModoestodefinidosnaenumerao
<com.sun.star.sheet.CellInsertMode>:
NONE
nenhumaclulasermovida
DOWN
asclulasabaixodasclulasinseridassomovidasparabaixo
RIGHT
asclulasdireitadasclulasinseridassomovidasparaadireita
ROWS
aslinhasabaixodasclulasinseridassomovidasparabaixo
COLUMNS ascolunasdireitadasclulasinseridassomovidasparaadireita
estasconstantesdefinemodeslocamentodasclulasadjacentes.
copyRange(mDestAs<com.sun.star.table.CellAddress>,
mOrigAs<com.sun.star.table.CellRangeAddress>)
Introduo ao OpenOffice.org Basic

91

Documentos do Calc

Verso 2

copiaogrupodeclulasdemOrigparamDestnomesmodocumento.
moveRange(mDestAs<com.sun.star.table.CellAddress>,
mOrigAs<com.sun.star.table.CellRangeAddress>)
moveogrupodeclulasmOrigparamDest,ocontedodemOrigapagado.
removeRange(mEnderecoAs<com.sun.star.table.CellRangeAddress>,nModoAsInteger)
remove o grupo de clulas de mEndereco; os valores de nModo esto definidos na
enumerao<com.sun.star.sheet.CellDeleteMode>:
NONE
nenhumaclulasermovida
UP
asclulasabaixodasclulasapagadassomovidasparacima
LEFT
asclulasdireitadasclulasapagadassomovidasparaaesquerda
ROWS
aslinhasabaixodasclulasapagadassomovidasparacima
COLUMNS ascolunasdireitadasclulasapagadassomovidasparaaesquerda
estasconstantesdefinemodeslocamentodasclulasadjacentes.
Agora,umexemplosimplesparademonstraroempregodestescomponentesdaAPI.
SubcopiaExtensao
'exemplointerfacesheet.XCellRangeMovement
DimoDocAsObject
DimoPlanAsObject
DimoExtAsObject
DimmDestAsNewcom.sun.star.table.CellAddress
DimmEndAsNewcom.sun.star.table.CellRangeAddress

oDoc=ThisComponent
oExt=oDoc.getCurrentSelection()
oPlan=oExt.getSpreadsheet()
mEnd=oExt.getRangeAddress()
mDest.Sheet=1 'Planilha2
mDest.Column=0
mDest.Row=0
'copyRangecopiatambmaformataodaclula
oPlan.copyRange(mDest,mEnd)
'
EndSub

Aqui,obtemosaseleocorrenteecopiamosparaaPlanilha2,tendocomoorigemaclula
A1.ObservequeomtodocopyRangechamadoapartirdoobjetoSpreadsheet.

7.14 Dados de fontes externas


UmatarefacomumsobredocumentosdoCalcaobtenodedadosdefontesexternas.Por
exemplo,avinculaodeumaplanilhadeoutrodocumentoouaimportaodedadosdeum
bancodedados.Aseguir,veremosalgunsserviosdaAPIdoOpenOffice.org,voltadospara
estastarefas.

92

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

Vnculos
O servio < com.sun.star.sheet.SpreadsheetDocument > contm as propriedades abaixo,
relacionadascomvnculosnoutrosdocumentos:
SheetLinks contmacoleodevnculosdeplanilhasnodocumento
AreaLinks contmacoleodevnculosdereasnodocumento
DDELinks contmacoleodevnculosDDEdodocumento
Estascoleespodemserobtidascomoabaixo:
oDoc=ThisComponent
oVinculos=oDoc.SheetLinks
documento

'obtmosvnculosdeplanilhado

Ainterface<com.sun.star.sheet.XSheetLinkable>possuiosseguintesmtodosparadefinir
vnculoscomplanilhasdeoutrosdocumentos:
getLinkMode()As<com.sun.star.sheet.SheetLinkMode>
setLinkMode(nModoAs<com.sun.star.sheet.SheetLinkMode>)
obtmoudefineomododovnculo
getLinkUrl()AsString
setLinkUrl(sURLAsString)
obtmoudefineaURLdorecurso(odocumentovinculado)
getLinkSheetName()AsString
setLinkSheetName(sPlanilhaAsString)
obtmoudefineonomedaplanilhadentrododocumentovinculado
link(sURLAsString,sPlanilhaAsString,sFiltroAsString,sOpcoesAsString,
nModoAs<com.sun.star.sheet.SheetLinkMode>)
criaumvnculocomumaplanilha,emoutrodocumento,seelenoexistir
OsvalorespossveisparaLinkMode,estoem<com.sun.star.sheet.SheetLinkMode>:
NONE
semvnculo
NORMAL copiaosvaloreseasfrmulas
VALUE
copiaosvalores,inclusiveoresultadodasfrmulas
EisalgunsnomesdefiltrosdoOpenOffice.org:
StarOfficeXML(Calc) documentosdoCalcnoformatoXML
MSExcel97
documentosdoExcel97/2000/XP
MSExcel95
documentosdoExcel5.0/95
Paraestesfiltros,podemospassarumacadeiavaziacomoopodofiltro.
Vejamosumexemplo:
SubvinculoPlanilha
'

Introduo ao OpenOffice.org Basic

93

Documentos do Calc

Verso 2

DimoDocAsObject
DimoPlanAsObject
'
oDoc=ThisComponent
oPlan=oDoc.Sheets(0)
'editesURLparaseusistema:
sURL="file:///d:/nad/openoffice/Intro_OOo_Basic/novo_mat/editaPlan.sxc"
sOrigem="Planilha1"
sFiltro="StarOfficeXML(Calc)"
sOpcoes=""
'defineomodo
nModo=com.sun.star.sheet.SheetLinkMode.NORMAL
'estabeleceovnculo
oPlan.link(sURL,sOrigem,sFiltro,sOpcoes,nModo)
'desativaovnculo
oPlan.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
'
EndSub

Notequedefinimososparmetroseestabelecemosovnculo.Apsexecutarestamacro,a
planilhavinculadasercarregadaparaodocumento.
Almdeplanilhas,possvelvincularumaoumaisreasdeumdocumentoexternoaum
outrodocumento.
Aprincipalinterfaceusadaparaisto,<com.sun.star.sheet.XAreaLinks>,temosmtodos:
insertAtPosition(aPosAs<com.sun.star.table.CellAddress>,sArqAsString,
sFonteAsString,sFiltroAsString,sFiltroOpAsString)
insereumareavnculadanacoleo.Osparmetrostemossignificados:
aPos
posiodaclulainicialnodocumentodedestino(estrutura).
sArq
Urldorecurso(documentodeorigem).
sFonte
endereodareanodocumentodeorigem(porex:Planilha1.A1:D10).
sFiltro
nomedofiltrousadoparaconverterosdados.
sFiltroOp opesparaofiltro
asopesdefiltrosoespecficasparaalgunstiposdefiltro.
removeByIndex(nIndex)
removeareavinculadadacoleo.
Vamosapresentarumexemplosimples,demonstrandoestapossibilidade:
SubvinculoArea
'
DimoDocAsObject
DimoPlanAsObject
DimoLinksAsObject
DimaPosAsNewcom.sun.star.table.CellAddress
oDoc=ThisComponent
oPlan=oDoc.Sheets(1)
sURL="file:///d:/nad/openoffice/Intro_OOo_Basic/novo_mat/editaPlan.sxc"
sFonte="Planilha1.A1:E8"
sFiltro="StarOfficeXML(Calc)"
sOpcoes=""
'defineaorigemdareanodestino

94

Introduo ao OpenOffice.org Basic

Verso 2

Documentos do Calc

aPos.Sheet=1
aPos.Column=0
aPos.Row=0
'obtmcoleo
oLinks=oDoc.AreaLinks
'insereumvnculocomareasFonte
oLinks.insertAtPosition(aPos,sURL,sFonte,sFiltro,sOpcoes)
'removeoultimolink
oLinks.removeByIndex(oLinks.Count1)
'
EndSub

Inicialmentedefinimososparmetros,depoisobtemosacoleodevnculos,adicionamoso
novovnculoe,porfim,removemosovnculo.
Seumvnculopermanecerativo,naprximacargadodocumentodestino,ooperadorser
informadodasuaexistnciaequestionadosedeseja,ouno,atualizlos.

Importando dados de um banco de dados


possvelimportardados,deumafontededadosregistradanoOpenOffice.org,parauma
planilha doCalc. Estes dados podem sero contedo de uma tabela, o resultado de uma
consultaoudeumcomandoSQL.
Esta tarefa executada pelos mtodos da interface com.sun.star.util.XImportable,
suportadapeloserviocom.sun.star.sheet.SheetCellRange.
OsmtodosdeXImportableso:
createImportDescriptor(bVazioAsBoolean)As<com.sun.star.beans.PropertyValue>
Se bVazio for True, cria um descritor vazio, seno retorna as propriedades da ltima
importao.
doImport(oDescritor()As<com.sun.star.beans.PropertyValue>)
importaosdadosconformeodescritor
Oserviocom.sun.star.sheet.DatabaseImportDescriptorpossuiaspropriedadesabaixo:
Propriedade

Descrio

SourceType

Tipo da fonte (com.sun.star.sheet.DataImportMode)

DatabaseName

Cadeia com o nome da fonte de dados registrada no


OOo

SourceObject

Cadeia com o nome do objeto dentro da fonte de


dados

OsvalorespossveisparaSourceTypeso(com.sun.star.sheet.DataImportMode):
NONE
SQL
TABLE

nadaserimportado
umcomandoSQLserpassadoparaSourceObject
onomedeumatabelaserpassadoparaSourceObject

Introduo ao OpenOffice.org Basic

95

Documentos do Calc

QUERY

Verso 2

onomedeumaconsultadafontededadosserpassadoparaSourceObject

Agoraumexemplo.AmacroabaixoimportatodososregistrosresultantesdocomandoSQL
paraumaplanilha.
SubimportaDadosParaPlanilha
'
DimoCelOrigemAsObject
DimoDescritorAsVariant
DimsFonteDadosAsString
DimsOrigemDadosAsString
DimiTipoAsLong
'obtemacluladaorigemnaplanilha
oCelOrigem=ThisComponent.Sheets(1).getCellByPosition(0,0)
'criaumdescritordeimportao
oDescritor=oCelOrigem.createImportDescriptor(True)
'inicializavariveis
iTipo=com.sun.star.sheet.DataImportMode.SQL
sFonteDados="Bibliography"
sOrigemDados="Select*Frombiblio"
'defineaspropriedadesdodescritor
oDescritor(0).Name="DatabaseName"
oDescritor(0).Value=sFonteDados
oDescritor(1).Name="SourceType"
oDescritor(1).Value=iTipo
oDescritor(2).Name="SourceObject"
oDescritor(2).Value=sOrigemDados
'importaosdados
oCelOrigem.doImport(oDescritor())
'
EndSub

Como exerccio, altere os valores das variveis oCelOrigem, iTipo e sOrigemDados,


executandonovamenteamacro.

96

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

8 Banco de Dados

8.1 Introduo
OOpenOffice.orgtrazumpoderososistemadeconexocombancodedados.Oseuprincipal
objetivooferecerumaindependnciadeplataforma,permitindooacessoabancodedados
dediversosfabricantes.
OmecanismoqueoOpenOffice.orgusaparaatingiroseuobjetivochamadoSDBC(Star
DatabaseConnectivity),quepermiteaescritadedriversSDBCespecficosparadiferentes
fontes de dados. Estes drivers podem, inclusive, usar padres de acesso a dados bem
estabelecidos,comoODBCeJDBC.
Destemodo,qualquerbancodedadosquesuporteumdospadresacima,podeserdefinido
como uma fonte de dados para o OpenOffice.org. O OpenOffice.org tambm acessa,
nativamente,tabelasdoDbaseePlanilhasdoCalc,comofontededados.
DentreasfacilidadesdeacessoabancodedadosdoOpenOffice.orgpodemoscitar:ousoda
SQL(LinguagemdeConsultaEstruturada)paraconsultaseousodevnculoseformulrios
baseadosemdocumentosdoOpenOffice.org.
Sevocnotemexperinciacombancodedados,antesdecontinuar,procuresefamiliarizar
comasferramentasgrficasdoOpenOffice.orgparaacessoafontededados.SelecioneVer
NavegadorFontedeDados.Nestajanela,podemosselecionarumafontededadosregistrada
e operar sobre suas tabelas, consultas e vnculos. Para administrar as fontes de dados,
selecioneFerramentasFontedeDados.

8.2 Fontes de Dados


Antes de podermos usar um banco de dados, precisamos registrar a fonte de dados no
OpenOffice.org.PelainterfacegrficaestatarefaexecutadanodilogoAdministraodas
FontesdeDados(MenuFerramentas/FontedeDados).Nestedilogo,notamosqueuma
fontededadoscontmquatrotiposbsicosdeinformaes:
a)Geralsobreosaspectosdaconexocomobancodedados;
b)Tabelasquaistabelasseroutilizadas;
c)ConsultasoscomandosSQLdisponveis;
d)VnculosligaescomdocumentosdoOpenOffice.org,porexemploformulrios.
OsprincipaisservioseinterfacesdaAPIdoOpenOffice.org,relacionadoscombancode
dadosestoagrupadosnosmdulos:
com.sun.star.sdbcom.sun.star.sdbcxcom.sun.star.sdbc
Introduo ao OpenOffice.org Basic

97

Banco de Dados

Verso 2

Vejamos alguns servios, relacionados com as fontes de dados. O ponto de entrada o


contextodebancodedados,representadopeloserviocom.sun.star.sdb.DatabaseContext.
ParacriarumobjetoDatabaseContext,chamamosafunocreateUnoService():
oContexto=createUnoService(com.sun.star.sdb.DatabaseContext)
Podemos obter as fontes de dados registradas, usando os mtodos relacionados com as
interfacesXNameAccesseXEnumeration,eisalgunsdeles:
hasByName(sNomeAsString)AsBoolean
getByName(sNomeAsString)AsVariant
getElementNames()AsString()
hasElements()AsBoolean
hasMoreElements()AsBoolean
nextElement()AsVariant
Lembreseque,antesdeusarosmtodosdeXEnumeration,umaenumeraodevesercriada
comumachamadaaomtodocreateEnumeration().
Jtemosasferramentasnecessriasparaescreverumexemplo.Vamosexibirosnomesdas
fontes de dados registradas em nosso contexto de banco de dados. Digite a Sub
contextoBancoDados,abaixo,eexecuteparaveroresultado.
SubcontextoBancoDados
'
DimoContextoAsVariant
DimsNomes()AsString
'
'criaocontextodebancodedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
IfoContexto.hasElements()Then
'obtemosnomesdasfontesdedados
sNomes=oContexto.getElementNames()
'exibeosnomesdasfontesdedados
sMsg=""
Fori=LBound(sNomes)toUBound(sNomes)
sMsg=sMsg+sNomes(i)+Chr$(13)
Nexti
MsgBoxsMsg
Else
MsgBox"Nenhumafonteregistrada"
EndIf
'
EndSub

Outroserviodalinhadefrente com.sun.star.sdb.DataSource,querepresentaumobjeto
fontededados.Eletemvriaspropriedadeseoferecediversasinterfaces.

98

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

Antes de adicionar uma nova fonte de dados ao contexto, precisamos criar um objeto
DataSource.Istopodeserfeitodeduasmaneiras:
oFonte=oDataContext.createInstance()'emdesuso
oFonte=createUnoService(com.sun.star.sdb.DataSource)
Paraobter,apagarouregistrarumafontededadosnocontextodebancodedados,devemos
usarosmtodosdainterfacecom.sun.star.uno.XNamingServicedoobjetoDatabaseContext.
getRegisteredObject(sNomeAsString)As<com.sun.star.uno.XInterface>
retornaoobjetofontededadoscomonomesNome
registerObject(sNomeAsString,oFonteAs<com.sun.star.uno.XInterface>)
registraoobjetooFontecomoumafontededadoscomonomesNome
revokeObject(sNomeAsString)
revogaafontededadoscomonomesNome
Eisalgumasdaspropriedadesdoserviocom.sun.star.sdb.DataSource:
Propriedade

Descrio

Name

Nome da fonte de dados

URL

URL do banco de dados (sdbc:subprotocolo:subname


ou jdbc ...)

User

Nome de login do usurio

Password

Senha do usurio

IsPasswordRequired Se True, uma senha ser necessria


IsReadOnly

Se True, acesso somente para leitura

Vamosretomaronossoexemploeacrescentarcdigoparaadicionarumanovafontededados
aocontextodebancodedados.Acrescenteocdigoabaixona SubcontextoBancoDados,
executeamacroeverifique,atravsdeFerramentasFontedeDados,seanovafontefoi
criada.
'ADICIONAUMANOVAFONTEDEDADOS
DimoFonteAsVariant
'criaumainstanciadefontededados
oFonte=createUnoService("com.sun.star.sdb.DataSource")
'oFonte=oContexto.createInstance()
'testaseafontejestregistrada
IfoContexto.hasByName("Minha_Fonte")Then
MsgBox"Minha_Fontejregistrada!"
ExitSub
Else
'registraanovafontenocontexto
oContexto.registerObject("Minha_Fonte",oFonte)
'defineapropriedadeURL>>>>ALTEREPARAOSEUSISTEMA<<<<

Introduo ao OpenOffice.org Basic

99

Banco de Dados

Verso 2

oFonte.setPropertyValue("URL",_
"sdbc:dbase:file:///D:/NAD/OPENOFFICE/BDados")
EndIf

O objeto DataSource suporta algumas interfaces relacionadas com os tipos bsicos de


informaesdafontededados,seguemasprincipais:
Ainterfacecom.sun.star.util.XFlushable,relacionadacomofluxodedadosentreoobjetoe
obancodedados,contendoosmtodos:
flush()
encaminhaosdadosdoobjetoconectadoparaobancodedados
addFlushListener()
removeFlushListener()
adicionaeremovelistenersparaoeventoflushed
Ainterfacecom.sun.star.sdb.XQueryDefinitionsSupplier,comomtodo:
getQueryDefinitions()As<com.sun.star.container.XNameAccess>
retornaorecipientecomasconsultasdefinidasnumafontededados.
Atravs da interface com.sun.star.sdb.XBookmarksSupplier, podemos obter os vnculos
dosdocumentosassociadosaumafontededados,comumachamadaaomtodo:
getBookmarks()As<com.sun.star.container.XNameAccess>
retornaumacoleodecadeiascomalocalizaodosdocumentosvinculados.
Vamosobteranossarecmcriadafontededadosefazeralgumasverificaes.Crieasub
rotinaSubinfoFonteDadoseexecute,observandoasada.
SubinfoFonteDados
'
DimoContextoAsVariant
DimoFonteAsVariant
DimoConsultasAsObject
DimoVinculosAsObject
DimsNomes()AsString
'
'criaocontextodebancodedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemoobjetofontededados
oFonte=oContexto.getRegisteredObject("Minha_Fonte")
'
'obtemapropriedadeTableFilter
sMsg="Tabelas:"+Chr$(10)
sNomes=oFonte.getPropertyValue("TableFilter")
IfUBound(sNomes)>0Then
Fori=0ToUBound(sNomes)
sMsg=sMsg+sNomes(i)+Chr$(10)
Nexti
MsgBoxsMsg
Else
MsgBox"NenhumaTabelaparavisualizar"
EndIf

100

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

'
'verificaconsultas
oConsultas=oFonte.getQueryDefinitions()
IfoConsultas.getCount()>0Then
MsgBoxStr$(oConsultas.getCount())+"consultasdefinidas"
Else
MsgBox"Nenhumaconsultadefinida."
EndIf
'
'verificavnculos
oVinculos=oFonte.getBookmarks()
IfoVinculos.getCount()>0Then
MsgBoxStr$(oVinculos.getCount())+"vnculosdefinidos"
Else
MsgBox"Nenhumvnculodefinido."
EndIf
'
EndSub

Note que as tabelas a serem visualizadas pela fonte de dados uma propriedade de
DataSource,enquantoasconsultasevnculossoobtidosatravsdemtodosespecficos.

8.3 Conexes
Atomomento,trabalhamosdentrodocontextodebancodedados.Seanossatarefaestiver
relacionadacomosdadosarmazenadosnobancodedadosoucomasuaestrutura,devemos
estabelecerumaconexocomomesmo.
Umaconexoumcanaldecomunicaoentreousurioeobancodedados,permitindoa
transfernciadedadosentreeles.EsteoprincipalobjetivodoservioDataSourcee,para
isto,dispedasseguintesinterfacesemtodos:
Ainterfacecom.sun.star.sdb.XCompletedConnection,possuiomtodo:
connectWithCompletion(oManipAs<com.sun.star.task.XInteractionHandler>)
As<com.sun.star.sdbc.XConnection>
tentaestabelecerumaconexocomobancodedados,senecessrio,solicitainformaes.
Ainterfacecom.sun.star.sdbc.XDataSource,temosseguintesmtodos:
getConnection(sUserAsString,sSenhaAsString)
As<com.sun.star.sdbc.XConnection>
tentaestabelecerumaconexocomobancodedados.
setLoginTimeout(iSegundosAsLong)
defineoperodo,emsegundos,paratentarestabeleceraconexo
getLoginTimeout()AsLong
obtmoperodo,emsegundos,paratentardeestabeleceraconexo
Os mtodos connectWithCompletion () e getConnection () retornam um objeto, que
representaumaconexo.Esteobjeto,porsuavez,suportaoutrosservioseinterfaces.

Introduo ao OpenOffice.org Basic

101

Banco de Dados

Verso 2

Umadasprincipaisinterfacesdoserviocom.sun.star.sdb.ConnectionXConnection,com
mtodosparadiversasoperaes.Aseguir,algunsdeles:
setAutoCommit(bSinalAsBoolean)
getAutoCommit()AsBoolean
commit()
rollback()
isClosed()AsBoolean
getMetaData()As<com.sun.star.sdbc.XDatabaseMetaData>
setReadOnly(sSinalAsBoolean)
isReadOnly()AsBoolean
Ainterfacecom.sun.star.sdbc.XDatabaseMetaData,retornadaporgetMetaData(),define
vrios mtodos para obter informaes sobre o banco de dados e sua estrutura. Seguem
alguns:
getUserName()AsString
getDatabaseProductName()AsString
getDriverName()AsString
getTables()As<com.sun.star.sdbc.XResultSet>
getColumns()As<com.sun.star.sdbc.XResultSet>
getNumericFunctions()AsString
getStringFunctions()AsString
getSystemFunctions()AsString
getTimeDateFunctions()AsString
supportsExpressionsInOrderBy()AsBoolean
supportsGroupBy()AsBoolean
supportsOuterJoins()AsBoolean
supportsStoredProcedures()AsBoolean

Vejamosumexemplo,queestabeleceumaconexocomumafontededados,obtmeexibe
metadados.Digiteocdigofonteabaixoeexecuteamacro.
SubobtemMetaData
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados(usaacessonomeado)
oFonte=oContexto.getByName("Minha_Fonte")
'fazaconexocomafontededados
DimoConexaoAsObject
'
IfoFonte.IsPasswordRequired()Then
DimoManipAsVariant
oManip=createUnoService("com.sun.star.sdb.InteractionHandler")
oConexao=oFonte.ConnectWithCompletion(oManip)
Else
oConexao=oFonte.getConnection("","")

102

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

EndIf
'obtemmetadados
DimoMetaDataAsObject
oMetaData=oConexao.getMetaData()
'exibemetadados
MsgBoxoMetaData.getURL()+Chr$(10)+_
oMetaData.isReadOnly()+Chr$(10)+_
oMetaData.supportsANSI92EntryLevelSQL()+Chr$(10)+_
oMetaData.supportsSelectForUpdate()+Chr$(10)+_
oMetaData.getMaxColumnNameLength()
'
EndSub

Noteque,seumasenhaforrequerida,usamosomtodoconnectWithCompletion(),seno
chamamos getConnection ().Apsestabeleceraconexo,chamamos getMetaData()para
obterosmetadados.Nofinal,chamamosalgunsmtodosdeXDatabaseMetaDataparaexibir
informaesdobancodedados.
O servio Connection inclui, tambm, o servio com.sun.star.sdbcx.DatabaseDefinition,
comoutrasinterfaces.Porenquanto,nosinteressa com.sun.star.sdbcx.XTablesSupplier e
seumtodo:
getTables()As<com.sun.star.container.XNameAccess>
retornaumcontainercomastabelasativasnafontededados.
Eisumachamadaaestemtodo:
'obtemacoleodetabelas(ativas)dafontededados
oTabelas=oConexao.getTables()

Nasprximassees,apresentaremosoutrosmtodossuportadospeloobjetoConnection.

8.4 Estrutura do Banco de Dados


Nestaseo,vamosapresentaralgunsservioseinterfaces,relacionados comadefinio,
alteraoecoletadeinformaessobreaestruturadobancodedados.Normalmente,isto
feitoatravsdalinguagemSQL.Porm,nomomento,desejamosmostraralgunsserviosdo
mdulocom.sun.star.sdbcx.

Tabelas
Astabelassoosprincipaiscomponentesdaestruturadeumbancodedadosetmumasrie
depropriedadeseelementosassociados.Entreelespodemoscitar:colunas,chavesprimriase
ndices.
Opontodeentradaparaoperaescomoalteraoerecuperaodeinformaesdetabelas
soosservioscom.sun.star.sdbcx.Tableecom.sun.star.sdb.Table.Elespossuemalgumas
interfacesepropriedades.
Introduo ao OpenOffice.org Basic

103

Banco de Dados

Verso 2

Entreassuaspropriedades,todassomenteleitura,temos:
Propriedade

Descrio

Privileges

Valor longo contendo os privilgios da tabela

Name

Cadeia com o nome da tabela

CatalogName

Cadeia com o nome do catlogo

SchemaName

Cadeia com o nome do esquema

Description

Cadeia com descrio adicional

Type

Cadeia com o tipo da tabela

Ogrupodeconstantes com.sun.star.sdbcx.Privilege,definealgunsprivilgiosdeoperao
sobre uma tabela: SELECT, INSERT, UPDATE, CREATE, ALTER, DELETE, DROP,
READ,REFERENCE.
Oserviocom.sun.star.sdb.DataSettingscontmpropriedadesrelacionadascomaexibio
dosdadosdatabela,comofiltroeordenao.Eisalgumas:
Propriedade

Descrio

Filter

Cadeia com um filtro de dados adicional

ApplyFilter

Se True, aplica o filtro

Order

Cadeia descrevendo um tipo de ordenao

AstabelasdeumafontededadossoobtidasatravsdoobjetoConnectionedomtodo
getTables,japresentado,comoabaixo:
oConexao=oFonte.getConnection(,)
oTabelas=oConexao.getTables()

Oserviocom.sun.star.sdbcx.Columntrazpropriedades(somenteleitura),quedescrevemas
caractersticasdeumacoluna.Entreasquais:
Propriedade

104

Descrio

Name

O nome da coluna

Type

O
tipo
de
dado
( com.sun.star.sdbc.DataType )

Precision

O nmero de dgitos da coluna ( largura )

Scale

Nmero de dgitos direita do ponto decimal

IsAutoIncrement

Se True, a coluna incrementada automaticamente

da

coluna

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

IsCurrency

Se True, o valor representa uma moeda

Description

Descrio da coluna

Obtemosascolunasdeumatabelapelainterfacecom.sun.star.sdbcx.XColumnsSupplier:
getColumns()As<com.sun.star.container.XNameAccess>
retornaumrecipientecomascolunasdatabela.
Ainterfacecom.sun.star.sdbcx.XKeysSuppliereseumtodo:
getKeys()As<com.sun.star.container.XIndexAccess>
retornaumrecipientecomaschavesdatabela.
Ainterfacecom.sun.star.sdbcx.XIndexesSupplierforneceosndicesdeumatabela:
getIndexes()As<com.sun.star.container.XNameAccess>
retornaumrecipientecomosndicesdatabela.
Ainterfacecom.sun.star.sdbcx.XRenameusadapararenomearumatabela:
rename(sNovoNomeAsString)
renomeiaoobjeto
Ainterfacecom.sun.star.sdbcx.XAlterTabletemosmtodos:
alterColumnByName(sNomeAsString,oDescAs<com.sun.star.beans.XPropertySet>)
alterColumnByIndex(iIndAsLong,oDescAs<com.sun.star.beans.XPropertySet>)
ambosalteram umacoluna, oprimeiro peloNomeeosegundopelo ndice, oparmetro
oDesccontmodescritordacolunacomasnovaspropriedades.
Vejamos um exemplo, que apresenta informaes sobre as tabelas da fonte de dados
Bibliography,distribudacomoOpenOffice.org.
SubexibeInfoTabelas
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
oFonte=oContexto.getByName("Bibliography")
'fazaconexocomafontededados
DimoConexAsObject
oConex=oFonte.getConnection("","")
'obteminfosobretabelasecolunas
DimoTabelasAsObject
DimoTabAsObject
DimoColunasAsObject
DimoColAsObject
'obtemacoleodetabelas(ativas)dafontededados
oTabelas=oConex.getTables()
'
Fori=0TooTabelas.Count1
'obtematabelapeloseundice
oTab=oTabelas.getByIndex(i)

Introduo ao OpenOffice.org Basic

105

Banco de Dados

Verso 2

sMsg="TABELA:"+oTab.getName()+Chr$(10)+"COLUNAS:"
'obtemacoleodecolunasdatabela
oColunas=oTab.getColumns()
sNomeColunas=oColunas.getElementNames()
'
Forj=0ToUBound(sNomeColunas)
oCol=oColunas.getByName(sNomeColunas(j))
sTipo=oCol.getPropertyValue("TypeName")
sMsg=sMsg+Chr$(10)+sNomeColunas(j)+""+sTipo
Nextj
MsgBoxsMsg
'
Nexti
'
EndSub

Apsaconexo,pegamosacoleodetabelascomgetTables.Aseguir,paracadatabela,
obtemos as suas colunas com getColumns e os nomes com getElementNames. Depois,
visitamoscadacolunaobtendoapropriedadeTypeName.Nofinal,exibimosasinformaes
databela.
Paraacriao deumatabela, dispomos doservio com.sun.star.sdbcx.TableDescriptor,
quecontmaspropriedadesabaixo:
Propriedade

Descrio

Name

Nome do objeto a ser criado (do servio Descriptor)

CatalogName

Cadeia com o nome do catlogo

SchemaName

Cadeia com o nome do esquema

Description

Cadeia com descrio adicional

Oserviocom.sun.star.sdbcx.ColumnDescriptortemvriaspropriedades,seguemalgumas:
Propriedade

106

Descrio

Name

O nome da coluna

Type

O
tipo
de
dado
( com.sun.star.sdbc.DataType )

Precision

O nmero de dgitos da coluna ( largura )

Scale

Nmero de dgitos direita do ponto decimal

IsAutoIncrement

Se True, a coluna ncrementada automaticamente

IsNullable

Define
o
nulo
da
( com.sun.star.sdbc.ColumnValue )

Description

Breve descrio da coluna

da

coluna

coluna

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

Ainterface com.sun.star.sdbcx.XDataDescriptorFactory,criaumdescritordedadospara
umdadoobjeto,atravsdomtodo:
createDataDescriptor()As<com.sun.star.beans.XPropertySet>
retornaumdescritordedadosparaoobjetoassociado. Porexemplo:sechamadoporum
containerdetabelas, criaumdescritordetabela;sechamado porumobjetocontendoas
colunasdeumatabela,criaumdescritordecoluna.
Ainterfacecom.sun.star.sdbcx.XAppend,usadaparacriareadicionarumnovoobjetonum
recipiente,contmomtodo:
appendByDescriptor(oDescAs<com.sun.star.beans.XPropertySet>)
criaumnovoobjeto,usandoodescritoroDesc,eadicionaesteobjetoaumrecipiente.
Demonstrandoousodestasinformaes,vamoscriarumamacroparaadicionarduastabelas
nafontededadosMinha_Fonte,criadaanteriormente.
SubcriaTabelasMinhaFonte
'
DimoContextoAsVariant
DimoFonteAsVariant
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
IfoContexto.hasByName("Minha_Fonte")Then
oFonte=oContexto.getByName("Minha_Fonte")
Else
MsgBox"Noexiste,saindo..."
ExitSub
EndIf
'fazaconexocomafontededados
DimoConexAsObject
oConex=oFonte.getConnection("","")
'obtemtabelasdafontededados
oTabelas=oConex.getTables()
'criaumdescritordedadosparaatabelaamigos.dbf
oTab=oTabelas.createDataDescriptor()
'definepropriedadenome
oTab.Name="amigos"
'obtemcolunasdatabela
oColunas=oTab.getColumns()
'criaumdescritordedadosparaumacoluna
oCol=oColunas.createDataDescriptor()
'defineaspropriedadesda1a.coluna
oCol.Name="CODIGO"
oCol.Type=com.sun.star.sdbc.DataType.DECIMAL
oCol.Precision=5
'adicionaacolunaaocontainerdecolunas
oColunas.appendByDescriptor(oCol)
'definepropriedadesda2a.coluna(oColpreservaosvalores)
oCol.Name="NOME"
oCol.Type=com.sun.star.sdbc.DataType.VARCHAR
oCol.Precision=50
oColunas.appendByDescriptor(oCol)
'definepropriedadesda3a.coluna
oCol.Name="ANIV"
oCol.Type=com.sun.star.sdbc.DataType.DATE
oColunas.appendByDescriptor(oCol)

Introduo ao OpenOffice.org Basic

107

Banco de Dados

Verso 2

'
'adicionaatabelaAmigosaocontainerdetabelas
oTabelas.appendByDescriptor(oTab)
'
'criaumdescritordedadosparaatabelafones.dbf
oTab=oTabelas.createDataDescriptor()
'definepropriedadenome
oTab.Name="fones"
'obtemcolunasdatabela
oColunas=oTab.getColumns()
'criaumdescritordedadosparaumacoluna
oCol=oColunas.createDataDescriptor()
oCol.Name="CODIGO"
oCol.Type=com.sun.star.sdbc.DataType.DECIMAL
oCol.Precision=5
oCol.Description="Cdigodoamigo"
oColunas.appendByDescriptor(oCol)
oCol.Name="FONE"
oCol.Type=com.sun.star.sdbc.DataType.VARCHAR
oCol.Precision=15
oCol.Description="Fonedoamigo"
oColunas.appendByDescriptor(oCol)
'
'adicionaatabelaaocontainerdetabelas
oTabelas.appendByDescriptor(oTab)
'
'encerraaconexo
oConex.dispose()
'
EndSub

Apsaconexo,chamamosomtodogetTables,queretornaumcontaineroTabelas,comas
tabelas ativas na fonte de dados. Depois, criamos o descritor oTab, da nova tabela e
chamamosomtodogetColumns,criandoocontainervazio oColunas,paraascolunasda
nova tabela. A seguir, o descritor oCol criado, suas propriedades definidas e, depois,
adicionado a oColunas. Isto repetido para cada nova coluna, aproveitando o mesmo
descritor.Emseguida,acrescentamosodescritordanovatabelaaocontaineroTabelas.Por
fim,repetimosoprocessoparaumasegundatabelae,paraevitarproblemas,encerramosa
conexo.

Chave Primria
Umachaveprimriaquaseobrigatoriaembancosdedadosrelacionais,principalmenteno
suportedealgumasoperaescomointegridadereferencial.
Atravsdoserviocom.sun.star.sdbcx.Key,queofereceasinterfacesXColumnsSuppliere
XDataDescriptorFactory,podemosextrairasinformaesdeumachaveprimria.Elepossui
aspropriedadesabaixo,todassomenteleitura:
Propriedade
Name
108

Descrio
Nome da chave
Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

Type

Tipo da chave (PRIMARY, UNIQUE, FOREIGN)

ReferencedTable

Nome da tabela, somente para chaves externas

UpdateRule

Regra de atualizao, somente para chaves externas

DeleteRule

Regra de deleo, somente para chaves externas

Ostipospossveisparaumachaveestodefinidosemcom.sun.star.sdbcx.KeyType.
Asregrassodefinidasemcom.sun.star.sdbc.KeyRule,porex:CASCADE,RESTRICT,etc.
Oserviocom.sun.star.sdbcx.KeyColumn,incluioservioColumnetemapropriedade:
RelatedColumn

nomedacolunarelacionadanumatabelaexterna

Paraacriaodechavesprimrias,temososerviocom.sun.star.sdbcx.KeyDescriptor,que
inclui o servio Descriptor, oferece a interface XColumnsSupplier e tem as mesmas
propriedadesdoservioKey,acima,semarestriodesomenteleitura.
Oserviocom.sun.star.sdbcx.KeyColumnDescriptor,incluioservioDescriptor, etemas
propriedades:
Propriedade

Descrio

Name

Nome da coluna ( de Descriptor )

RelatedColumn

Nome da coluna relacionada numa tabela externa

Otrechodecdigoabaixo(notestado),criaumachaveprimriaparaumatabela:
'
'CdigoparacriarumaChavePrimria
'
'obtemorecipientecomaschaves
oChaves=oTabela.getKeys()
'criaumdescritorparaachaveprimria:
oChave=oChaves.createDataDescriptor()
'definepropriedadesdachave
oChave.setPropertyValue("Type",com.sun.star.sdbcx.KeyType.PRIMARY)
'obtemascolunasdanovachave
oColunasChaves=oChave.getColumns()
'craiumdescritor(sprecisoum)
oColChave=oColunasChaves.createDataDescriptor()
'defineapropriedade
oColChave.setPropertyValue("Name","ID")
'adicionaacolunachave
oColunasChaves.appendByDescriptor(oColChave)
'adicionaachave
oChaves.appendByDescriptor(oChave)
'adicionaatabelaaocontainerdetabelas
oTabelas.appendByDescriptor(oTabela)

Introduo ao OpenOffice.org Basic

109

Banco de Dados

Verso 2

Normalmente,estaoperaoexecutadaduranteacriaodanovatabela,motivodaltima
linhadecdigo.

ndices
Atravsdoserviocom.sun.star.sdbcx.Index,podemosobterinformaessobreumndicede
tabela.EleforneceasinterfacesXDataDescriptorFactoryeXColumnsSupplierepossuias
propriedadesaseguir:
Propriedade

Descrio

Name

Nome do ndice

Catalog

Nome do catlogo do ndice

IsUnique

Se True, no aceita valores repetidos na coluna

IsPrimaryKey

Se True, o ndice usado como chave primria

IsClustered

Se True, indica que o ndice clustered

Oserviocom.sun.star.sdbcx.IndexColumn,quetambmincluioservioColumn,representa
ascolunasdeumndiceetemapropriedade:
IsAscending

SeTrue,aordemascendente

Acriaodenovosndicessedpeloserviocom.sun.star.sdbcx.IndexDescriptor,queinclui
oservioDescriptor,suportaainterfaceXColumnsSupplieretemaspropriedades:
Propriedade

Descrio

Name

Nome do ndice ( de Descriptor )

Catalog

Nome do catlogo do ndice

IsUnique

Se True, no aceita valores repetidos na coluna

IsClustered

Se True, indica que o ndice clustered

O servio com.sun.star.sdbcx.IndexColumnDescriptor, que inclui o servio Descriptor,


permiteacriaodecolunasparaondice.Eletemaspropriedades:
Propriedade

Descrio

Name

Nome da coluna ( de Descriptor )

IsAscending

Se True, a ordem ascendente

Vejamosumexemploqueadicionaumndiceparaatabelaamigos.dbf,criadaanteriormente.

110

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

SubcriaIndiceAmigos
'
DimoContextoAsVariant
DimoFonteAsVariant
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
IfoContexto.hasByName("Minha_Fonte")Then
oFonte=oContexto.getByName("Minha_Fonte")
Else
MsgBox"Fontenoexiste,saindo..."
ExitSub
EndIf
'fazaconexocomafontededados
DimoConexAsObject
oConex=oFonte.getConnection("","")
'obtemtabelasdafontededados
oTabelas=oConex.getTables()
IfoTabelas.hasByName("amigos")Then
'obtmatabelaamigos.dbf
oTabela=oTabelas.getByName("amigos")
Else
MsgBox"Tabelanoexiste,saindo..."
ExitSub
EndIf
'
'obtmosindicesdatabela
oIndices=oTabela.getIndexes()
'criaumdescritorparaumnovoindice
oIndice=oIndices.createDataDescriptor()
'definepropriedadesdonovoindice
oIndice.setPropertyValue("Name","ami_cod")
oIndice.setPropertyValue("IsUnique",True)
'obtemascolunasdoindice
'oColunas=oIndice.getColumns()
oColunas=oIndice.Columns
'criaumdescritordecolunaparaoindice
oColuna=oColunas.createDataDescriptor()
'defineaspropriedadesdacoluna
oColuna.setPropertyValue("Name","CODIGO")
oColuna.setPropertyValue("IsAscending",True)
'adicionaanovacolunaaocontainerdecolunas
oColunas.appendByDescriptor(oColuna)
'adicionaoindiceaosindicesdatabela
oIndices.appendByDescriptor(oIndice)
'
'fechaaconexo
oConex.dispose()
'
EndSub

Algicaparaacriaodendicesamesmajapresentadaparaachaveprimria,comuma
diferena:umndicenopodeseradicionadoaumdescritordetabela.
Antes de prosseguir, procure, nos exemplos que acompanham esta Introduo, a Sub
criaIndiceFone e comande a sua execuo, para criar um arquivo ndice para a tabela
fones.dbf.NotequeestendicetemapropriedadeIsUniquedefinidacomoFalse.
Introduo ao OpenOffice.org Basic

111

Banco de Dados

Verso 2

Segurana
Existem outros elementos, associados estrutura do banco de dados. Vamos apresentar,
brevemente,osrelacionadoscomasuasegurana.
Oserviocom.sun.star.sdbcx.Group,representaumacontaparaumgrupodeusurios.Ele
temapropriedadeNome(nomedogrupo)eofereceasseguintesinterfaces:
Interfacecom.sun.star.sdbcx.XUsersSuppliercomomtodo:
getUsers()

retornaosusuriosdoobjeto

Interfacecom.sun.star.sdbcx.XAuthorizablequedefineosmtodos:
getPrivileges()
obtmosprivilgiosdeacessoaoobjeto
getGrantablePrivileges()
obtm os privilgios, quepodem ser concedidos a
outros
grantPrivileges()
concedeosprivilgios
revokePrivileges()
revogaosprivilgios
Oservio com.sun.star.sdbcx.Userrepresenta umusurio doobjeto. Possuiapropriedade
Name(nomedousurio)eofereceasinterfacesabaixo.
Ainterfacecom.sun.star.sdbcx.XUserdefineomtodo:
changePassword(sSenhaAtualAsString,sNovaSenhaAsString)
alteraasenhadousurio
Ainterfacecom.sun.star.sdbcx.XGroupsSuppliercomomtodo:
getGroups()
retornaacoleodegruposdoobjeto
ParaacriaodeGruposeUsurios,temososserviosGroupDescriptoreUserDescriptor.O
raciocniogeralomesmojvistonestaseoparaoutrosdescritores.
Finalmente,vamoslembrarqueainterfacecom.sun.star.sdbc.XDatabaseMetaData,fornece
umavastaquantidadedeinformaessobreobancodedados.Eladefinediversosmtodos,
algunsjapresentadosnaseoConexo.

8.5 Registros
A manipulao dos dados contidos numa tabela pode ser efetuada por duas abordagens
diferentes.Aprimeira,utilizaoservioRowSeteusadaparafontesregistradasnocontexto
dedadosdoOpenOffice.org.Asegunda,atravsdeumacomunicaodiretacomobancode
dados,usandoumobjetoStatement.Nestaseoveremosapenasaprimeiradelas.

112

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

Criando um RowSet
OservioRowSetutilizaumaconexoparaoperarsobretabelas,consultasecomandosSQL.
Antesdeuslo,precisamosdefinirassuaspropriedadeseento,executaroseucomando.
Oserviocom.sun.star.sdb.RowSetincluiosservios<sdbc.RowSet>e<sdb.ResultSet>,
oferecealgumasinterfacesetmumagrandequantidadedepropriedades.
EisalgumaspropriedadesdeRowSet:
Propriedade

Descrio

ActiveConnection

Um objeto Conexo gerada por uma fonte ou URL

DataSourceName

Cadeia com o nome da fonte de dados

Command

o comando
CommandType

CommandType

O
tipo
de
comando,
sdb.CommandType >

Filter

O nome de um filtro para o resultado do comando

Order

O nome de uma ordenao para o resultado do


comando

RowCount

Nmero de registros acessados na base de dados

IsRowCountFinal

Se True, indica que todos os registros foram


contados

IsNew

Se True, indica que o registro ser inserido no banco


de dados

ser

executado,

depende

definido

em

de
<

IsModified
Se True, indica que o registro corrente foi alterado
Asquatroltimaspropriedadessoapenasparaleitura.
Ogrupo<com.sun.star.sdb.CommandType>defineasseguintesconstantes:
TABLE
QUERY
COMMAND

indicaqueCommandreceberonomedeumatabela
indicaqueCommandreceberonomedeumaconsulta
indicaqueCommandreceberumcomandoSQL

Ainterface<XResultSetAccess>defineomtodo:
createResultSet()As<com.sun.star.sdbc.XResultSet>
retornaumobjeto<ResultSet>
Oserviocom.sun.star.sdbc.RowSet,includoem<sdb.RowSet>,ofereceoutrasinterfaces
edefineoutraspropriedades.Entreelas:
Propriedade
Introduo ao OpenOffice.org Basic

Descrio
113

Banco de Dados

Verso 2

MaxRows

Tenta obter o nmero mximo de linhas

User

Nome do usurio para a conexo

Password

Senha do usurio para a conexo

ResultSetType

O
tipo
do
resultado,
de
com.sun.star.sdbc.ResultSetType >
Senecessriologon,definaaspropriedadesUserePassword,antesdaexecuo:

<

oRowSet.setPropertyValue("User","Maria")
oRowSet.setPropertyValue("Password","senha_de_Maria")

Ainterface<sdbc.XRowSet>define,entreoutros,omtodo:
execute()
preencheoobjetoRowSetcomosdados
Ainterface<sdbc.XColumnLocate>permitealocalizaodecolunascomomtodo:
findColumn(sNomeColAsString)AsLong
apartirdonomedacoluna,retornaoseundicenoobjetoRowSet.
Ainterface<sdbc.XParameters>usadaparadefinirparmetrosemconsultaspreparadas.
OsseusmtodostmaformasetXXXondeXXXotipodedadodacoluna.
VamosaumexemplodecriaodeumRowSet,utilizandoatabelabiblio,dafontededados
Bibliography,distribudacomoOpenOffice.org.
SubcriaRowSet
'
DimoRowSetAsVariant
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Bibliography")
oRowSet.CommandType=com.sun.star.sdb.CommandType.TABLE
'paraTABLE,passamosonomedatabela
oRowSet.setPropertyValue("Command","biblio")
'executa
oRowSet.execute()
'verificasecursorjestnofinaldoresultado
MsgBox"Ocontadorestnofim:"+_
oRowSet.getPropertyValue("IsRowCountFinal")
'posicionanofinal
oRowSet.last()
'verificadenovo
MsgBox"Ocontadorestnofim:"+_
oRowSet.getPropertyValue("IsRowCountFinal")
'exibetotalderegistrosnoresultado
MsgBox"H"+Str$(oRowSet.getPropertyValue("RowCount"))+_
"registros!"
'destroioresultado
oRowSet.dispose()
'
EndSub

114

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

Noteque,parausaroRowSetprecisamos:criarumobjeto,definirassuaspropriedadese,
ento,chamaromtodoexecute().
Aps a criao do objeto RowSet, podemos operar sobre os seus registros, usando as
funcionalidadesdoservioResultSet.

Navegando pelos registros


VamosapresentaralgumasinterfacesdoservioResultSet,includoemRowSet.
AinterfaceXResultSetdefinemtodosdenavegaoeverificaodoregistro,soeles:
next()AsBoolean
first()AsBoolean
last()AsBoolean
previous()AsBoolean
beforeFirst()AsBoolean
afterLast()AsBoolean
movimentaocursordelinha,retornaTrueemcasodesucesso.
isFirst()AsBoolean
isLast()AsBoolean
isBeforeFirst()AsBoolean
isAfterLast()AsBoolean
verificaaposiodocursornoResultSet
getRow()AsLong
retornaaposiocorrentedocursornoResultSet
absolute(nLinhaAsLong)AsBoolean
moveocursorparaalinhanLinha,retornaTruesebemsucedido
relative(nLinhasAsLong)AsBoolean
moveocursornLinhasemrelaoposiocorrente,retornaTruesebemsucedido
refreshRow()
atualizaalinhacorrentecomosdadosmaisrecentesnafontededados
rowUpdated()AsBoolean
rowInserted()AsBoolean
rowDeleted()AsBoolean
verificaoestadodoregistro(linha)corrente.
getStatement()As<com.sun.star.uno.XInterface>
retornaocomandoquedeuorigemaoResultSet.

Acessando os dados
AinterfaceXRowdefinediversosmtodosparaacessoaosdados,entreeles:
getString(nColunaAsLong)AsString
Introduo ao OpenOffice.org Basic

115

Banco de Dados

Verso 2

getBoolean(nColunaAsLong)AsBoolean
getInt(nColunaAsLong)AsInteger
getFloat(nColunaAsLong)AsSingle
getDouble(nColunaAsLong)AsDouble
getDate(nColunaAsLong)As<com.sun.star.util.Date>
getTime(nColunaAsLong)As<com.sun.star.util.Time>
getTimestamp(nColunaAsLong)As<com.sun.star.util.DateTime>
retornaocontedodacolunanColuna
wasNull()AsBoolean
seTrue,indicaquealtimacolunalidacomgetXXX()contmumNULL
Agora,umexemplodenavegaoeacessoaosdadosdeumRowSet,criadoatravsdeum
comandoSQL:
SubobtendoDadosRowSet
'
DimoRowSetAsVariant
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Bibliography")
oRowSet.CommandType=com.sun.star.sdb.CommandType.COMMAND
'seCOMMANDpassamosumcomandoSQL
sCmdSQL="SELECTIDENTIFIER,AUTHOR,TITLEFROMbiblio"
oRowSet.setPropertyValue("Command",sCmdSQL)
'executa
oRowSet.execute()
'obtemindicesdascolunas
nIdent=oRowSet.findColumn("IDENTIFIER")
nTitle=oRowSet.findColumn("TITLE")
sMsg="LINHA:IDENT:TTULO(S)"+Chr$(10)
'posicionacursoapsltimoregistro
oRowSet.afterLast()
'percorreosregistros,doltimoparaoprimeiro
DoWhile(oRowSet.previous())
'obtemnmerodalinha
sLinha=Str$(oRowSet.getRow())+""
'obtmocontedodascolunasIDENTIFIEReTITLE
sIdent=oRowSet.getString(nIdent)
sTitle=oRowSet.getString(nTitle)
sMsg=sMsg+sLinha+sIdent+":"+sTitle+Chr$(10)
Loop
'exibeosdados
MsgBoxsMsg
'destroioRowSet
oRowSet.dispose()
'
EndSub

ObservequeocomandoSQLrecuperatrscolunasdatabela biblio,masexibimosapenas
duas.

116

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

Alterando os dados
AinterfaceXResultSetUpdate,definemtodosparaaatualizaodosregistros:
insertRow()
insereoregistronoResultSetenobancodedados,deveestarnomododeinsero.
updateRow()
atualizaosdadosdoregistro.
deleteRow()
deletaoregistrocorrente.
cancelRowUpdates()
cancelaaatualizaodoregistro,seaoperaoforsuportada.
moveToInsertRow()
ativaomododeinsero,guardandoaposiodoregistroatual.
moveToCurrentRow()
retornaparaoregistroatualquandonomododeinsero.
AinterfaceXRowUpdatedefinemtodosparaatualizarosdadosdalinha.Eisalguns:
updateString(nColunaAsLong,sCadAsString)
updateBoolean(nColunaAsLong,bValorAsBoolean)
updateInt(nColunaAsLong,iValorAsInteger)
updateFloat(nColunaAsLong,fValorAsSingle)
updateDouble(nColunaAsLong,dValorAsDouble)
updateDate(nColunaAsLong,oDataAs<com.sun.star.util.Date>)
updateTime(nColunaAsLong,oHoraAs<com.sun.star.util.Time>)
updateTimestamp(nColunaAsLong,oDataHoraAs<com.sun.star.util.DateTime>)
updateNull(nColunaAsLong)
atualizaocontedodacolunanColuna,conformeotipodedado.
Vejamosumexemplo,queinserecincoregistrosnatabelaamigos.dbf,dafontededados
Minha_Fonte,criadaanteriormente.
SubinsereLinhasRowSet
'
DimoRowSetAsVariant
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Minha_Fonte")
oRowSet.CommandType=com.sun.star.sdb.CommandType.TABLE
oRowSet.setPropertyValue("Command","amigos")
'executa
oRowSet.execute()
'definenovosdados
DimrelAmig()'relaodenomesdeamigos
DimrelAniv()'relaodedatasdeaniversrio
DimdsDataAsNewcom.sun.star.util.Date
relAmig=Array("Ana","Maria","Jos","Maria","MrioXXX")

Introduo ao OpenOffice.org Basic

117

Banco de Dados

Verso 2

relAniv=Array("10/05/80","01/02/86","05/06/81","05/06/81","20/03/78")
'iniciaainserodaslinhas
ForI=0To4
'ativamododeinsero
oRowSet.moveToInsertRow()
ForJ=1To3
If(J=1)Then
'preenchebufferparacolunatipoDECIMAL
oRowSet.updateInt(J,I+1)
ElseIf(J=2)Then
'preenchebufferparacolunastipoVARCHAR
oRowSet.updateString(J,relAmig(I))
Else
'convertedestringparadata
dAniv=DateValue(relAniv(I))
'preenchecamposdaestrutura(com.sun.star.util.Date)
dsData.Day=Day(dAniv)
dsData.Month=Month(dAniv)
dsData.Year=Year(dAniv)
'preenchebufferparacolunastipoDATE
oRowSet.updateDate(J,dsData)
EndIf
NextJ
'escrevebuffernatabela,saindodomododeinsero
oRowSet.insertRow()
NextI
MsgBox"Registrosinseridos:"+Str$(oRowSet.getRow())
'
'destroioresultado
oRowSet.dispose()
'
EndSub

Adestacar:oempregodomtodo updateXXX() adequadoaotipodedadodacoluna,a


definiodosvaloresdoscamposdaestrutura<Date>eofatodeinsertRow()encerraro
mododeinseroativadopelomtodomoveToInsertRow().
Intencionalmente,inserimosdoisregistroserradosnatabelaamigos.dbf.Um,comumerrono
nome(MrioXXX),eoutro,duplicado(Maria).Vamoscorrigiresteserros.
SubeditaRowSet
'
DimoRowSetAsVariant
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Minha_Fonte")
oRowSet.CommandType=com.sun.star.sdb.CommandType.TABLE
oRowSet.setPropertyValue("Command","amigos")
'executa
oRowSet.execute()
'posicionanalinhaduplicada
IfoRowSet.absolute(4)Then
oRowSet.deleteRow()
Else
MsgBox"Erro:Saindo..."
ExitSub
EndIf
'posicionaantesdaprimeiralinha

118

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

oRowSet.beforeFirst()
DoWhile(oRowSet.next())
sNome=oRowSet.getString(2)'colunaNOMEasegunda
IfsNome="MrioXXX"Then
oRowSet.updateString(2,"Mrio")
oRowSet.updateRow()
ExitDo
EndIf
Loop
MsgBoxrowUpdated()
'
'destroioresultado
oRowSet.dispose()
'
EndSub

Inicialmente,apagamosoregistroduplicadoeemseguida,localizamosecorrigimosonome
nacoluna,omtodoupdateRowgravaasalteraesdeupdateString.

Obtendo Metadados do RowSet


AinterfaceXResultSetMetaDataSupplierutilizadaparaobterinformaesgenricassobreo
objetoResultSetedefineomtodo:
getMetaData()As<com.sun.star.sdbc.XResultSetMetaData>
OobjetoretornadoporgetMetaDatasuportadiversosmtodos,entreeles:
getColumnCount()AsLong
retornaonmerodecolunasdoResultSet.
getColumnName(nColunaAsLong)AsString
retornaonomedacolunanColuna.
getPrecision(nColunaAsLong)AsLong
retornaaprecisodacolunanColuna.
getScale(nColunaAsLong)AsLong
retornaaquantidadededgitosapsoseparadordecimal.
getTableName(nColunaAsLong)AsString
retornaonomedatabeladacolunanColuna,tilemresultadoscommaisdeumatabela.
getColumnType(nColunaAsLong)AsLong
retornaotipoSQLdacolunanColuna.

8.6 Consultas
Apsacriaodeumafontededados,podemosdefinirearmazenarconsultasutilizadascom
frequnciaparaarecuperaodedados.
O principal servio envolvido nesta tarefa com.sun.star.sdb.Query, que inclui outros
servioseoferecealgumasinterfaces.
Oserviocom.sun.star.sdb.QueryDefinition,contmalgumaspropriedades,como:
Introduo ao OpenOffice.org Basic

119

Banco de Dados

Verso 2

Propriedade

Descrio

Name

O nome da definio (somente leitura)

Command

O comando da consulta, normalmente um comando


SELECT

EscapeProcessing

Se True, a consulta no deve ser alterada pelo


parser SQL

Oserviocom.sun.star.sdb.DataSettings,contm propriedadesrelacionadascomaexibio
dosdadosejfoiapresentadonaseoTabelas.
Ainterfacecom.sun.star.sdbcx.XDataDescriptorFactory,defineomtodo:
createDataDescriptor()As<com.sun.star.beans.PropertySet>
craiumdescritordedadosparaoobjeto.
Ainterfacecom.sun.star.sdbcx.XRenameusadapararenomearobjetos,atravsdomtodo:
rename(sNovoNomeAsString)
renomeiaoobjeto.
Ainterfacecom.sun.star.sdbcx.XColumnsSupplierobtmascolunasdoobjetocomomtodo:
getColumns()As<com.sun.star.container.XNameAccess>
retornaascolunascontidasnoobjeto.
Adefiniodeconsultas,sedatravsdainterfaceXQueryDefinitionsSuppliereseumtodo:
getQueryDefinitions()As<com.sun.star.container.XNameAccess>
retornaumcontainercomasdefiniesdasconsultas.
O container retornado suporta o mtodo createInstance( ) para a criao de uma nova
consultaoupodemos,ainda,usarafunoBasiccreateUnoService.
VejamosumexemploquedefineumaconsultaparaafontededadosMinha_Fonte.
SubcriaConsulta
DimoContextoAsVariant
DimoFonteAsObject

oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
oFonte=oContexto.getByName("Minha_Fonte")
'obtemorecipientecomasdefiniesdeconsultas
DimoDefConsAsObject
oDefCons=oFonte.getQueryDefinitions()
'criaumainstanciaparaumaconsulta
DimoConsultaAsObject
oConsulta=oDefCons.createInstance()
'OU:
'oConsulta=createUnoService("com.sun.star.sdb.QueryDefinition")
'defineaspropriedades
oConsulta.Command="SELECT*FROMamigos"
'insereaconsultanorecipiente
oDefCons.insertByName("Consulta_1",oConsulta)

120

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

'verifica
MsgBoxoDefCons.hasByName("Consulta_1")
'
EndSub

Observe que no necessrio estabelecer uma conexo para definir novas consultas. As
propriedadesaseremdefinidas,soasmesmasdoservioQueryDefinition,japresentadas.
Consultaspodemsercriadas,ainda,atravsdoservioQueryDescriptoresuasinterfaces.A
lgicasimilarquelajapresentadanacriaodendicesparatabelas.
O acesso s consultas, aps estabelecer uma conexo, pode ocorrer atravs da interface
XQueriesSuppliereseumtodo:
getQueries()As<com.sun.star.container.XNameAccess>
retornaumcontainercomasconsultas.
Oexemploaseguir,criaumaconexocomafontededadoseobtmascolunasdaconsulta
armazenadaanteriormente.
SubexibeColunasConsulta
DimoDbContAsVariant
DimoDbFonteAsObject
oDbCont=createUnoService("com.sun.star.sdb.DatabaseContext")
oDbFonte=oDbCont.getByName("Minha_Fonte")
'fazaconexocomafontededados
DimoDbConAsObject
oDbCon=oDbFonte.getConnection("","")
'obtemorecipientecomasconsultas
DimoDefConsAsObject
oDefCons=oDbCon.getQueries()
'obtemaconsultaesuascolunas
DimoConsultaAsObject
DimoColunasAsObject
oConsulta=oDefCons.getByName("Consulta_1")
oColunas=oConsulta.getColumns()
'obtemnomedacolunaetipodedado
DimoColAsObject
DimsNomes()AsString
sNomes=oColunas.getElementNames()
sMsg=""
Fori=LBound(sNomes)ToUBound(sNomes)
oCol=oColunas.getByName(sNomes(i))
sMsg=sMsg+sNomes(i)+""+_
oCol.getPropertyValue("TypeName")+Chr$(10)
Nexti
MsgBoxsMsg+"Total:"+Str$(i)+"Colunas"
EndSub

Aexecuodeumaconsultaocorreatravsdoservio<RowSet>,demodoanlogoaoj
apresentadonaseosobreRegistros.Vejamosumexemplo.
SubexecutaConsulta
'
DimoRowSetAsVariant

Introduo ao OpenOffice.org Basic

121

Banco de Dados

Verso 2

'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Minha_Fonte")
oRowSet.CommandType=com.sun.star.sdb.CommandType.QUERY
'seQUERYpassamosonomedeumaconsulta
oRowSet.setPropertyValue("Command","Consulta_1")
'executa
oRowSet.execute()
'obtemindicesdascolunas
nIdent=oRowSet.findColumn("CODIGO")
nNome=oRowSet.findColumn("NOME")
sMsg="LINHA:CODIGO:NOME(S)"+Chr$(10)
'percorreosregistros
DoWhile(oRowSet.next())
'obtemnmerodalinha
sLinha=Str$(oRowSet.getRow())+""
'obtmocontedodascolunasCODIGOENOME
sIdent=oRowSet.getInt(nIdent)
sNome=oRowSet.getString(nNome)
sMsg=sMsg+sLinha+sIdent+":"+sNome+Chr$(10)
Loop
'exibeosdados
MsgBoxsMsg
'destroioRowSet
oRowSet.dispose()
'
EndSub

OnicoaspectoadestacarCommandTypedefinidacomoQUERYeapassagemdonome
daconsultaparaCommand.AsfuncionalidadesdeRowSetsoasmesmasjapresentadas
anteriormente.
Comoinformao,aAPIdoOpenOffice.orgoferece,tambm,ferramentasparaacomposio
de consultas, atravs do servio com.sun.star.sdb.SQLQueryComposer e da interface
XSQLQueryComposerFactory.

8.7 Comandos SQL


Nestaseo,vamosapresentaroselementosbsicosparaaexecuodecomandosSQLe
recuperaodosresultadosdecorrentesdestescomandos.Lembresequeaspotencialidades
dalinguagemSQLdependemdiretamentedosmecanismosdosbancodedados.
Umaconexo,atravsdainterfacecom.sun.star.sdbc.XConnection,permiteacriaodeum
objetoparaenviarcomandosSQLaobancodedados,comomtodo:
createStatement()As<com.sun.star.sdbc.Statement>
criaumnovoobjetoStatement.
Este tipo de objeto apropriado para a execuo de comandos SQL sem parmetros e
comandosquenosoexecutadosrepetidamente.
Oservio<com.sun.star.sdbc.Statement>oferece,dentreoutras,asinterfacesXStatemente
XMultipleResults.Entreassuaspropriedades,temos:
MaxRows
122

obtmomximodelinhas,se0nohlimitao
Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

CursorName
nomedocursorSQL,dependedobancodedados
ResultSetConcurrency retornaotipodeconcorrncia(emResultSetConcurrency)
ResultSetType
defineacapacidadederolagem(emResultSetType)
EscapeProcessing
SeTrueocomandoSQLnosermodificadopeloparser
Osseguintesvaloressodefinidosemcom.sun.star.sdbc.ResultSetConcurrency:
READ_ONLY
nopodeseratualizado
UPDATABLE
podeseratualizado
Osvaloresabaixosodefinidosemcom.sun.star.sdbc.ResultSetType:
FORWARD_ONLY
SCROLL_INSENSITIVE
SCROLL_SENSITIVE

ocursorsemoveparaadiante
ambasasdirees,insensvelamudanas
ambasasdirees,sensvelamudanas

Ainterface<com.sun.star.sdbc.XStatement>usadaparaaexecuodecomandosSQLe
obtenodoresultadodocomando.Possuiosmtodos:
executeQuery(sCmdSQLAsString)AsResultSet
executaumcomandoqueretornaumresultadosimples(umResultSet)
executeUpdate(sCmdSQLAsString)AsLong
executaumcomandoSQLdeatualizao,paracomandosDDLretornazero.
execute(sCmdSQLAsString)AsBoolean
executaumcomandoSQLquepoderetornarmltiplosresultados
getConnection()
retornaaconexoqueoriginouestecomando.
A interface < com.sun.star.sdbc.XMultipleResults > usada para verificar mltiplos
resultadosdeumcomandoSQL.Defineosmtodos:
getResultSet()As<ResultSet>
retornaoresultadocorrente
getUpdateCount()AsLong
retornaocontadorderesultados
getMoreResults()AsBoolean
moveparaoprximocomando
VejamosumexemplodeusodoservioStatement,queoperasobreatabelaamigos,dafonte
dedadosMinha_Fonte,retornandoascolunasNOMEeANIVdosregistroscomCODIGO
maiorouiguala2.
SubexemploSQLSelect
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
oFonte=oContexto.getByName("Minha_Fonte")
'fazaconexocomafontededados

Introduo ao OpenOffice.org Basic

123

Banco de Dados

Verso 2

DimoConexaoAsObject
oConexao=oFonte.getConnection("","")
'obtemoresultadodeumaconsulta
DimoComandoAsObject
DimoResultadoAsObject
oComando=oConexao.createStatement()
'defineocomandoSQL
sCmdSQL="SelectNOME,ANIVFromamigosWhereCODIGO>=2"
'executaocomando
oResultado=oComando.executeQuery(sCmdSQL)
'percorreoresultado
sMsg=""
n=0
DoWhile(oResultado.next())
sMsg=sMsg+oResultado.getString(1)+Chr$(10)
n=n+1
Loop
MsgBoxsMsg+"Linhas:"+Str$(n)
'
EndSub

Note que: estabelecemos uma conexo, criamos o comando e chamamos o mtodo


apropriado, neste caso executeQuery, que retorna um ResultSet. Por fim, percorremos o
resultado.
OservioResultSet,esuasprincipaisinterfaces,jfoiapresentadonaseosobreRegistros.
Algicaamesmaparaoscomandos SQLdeatualizao(Insert,Update,Delete)ou
comandosquealteremaestruturadobancodedados(CreateTable,Drop,etc).Omtodo
executeUpdateretornaonmerodelinhasparacomandosSQLezeroparacomandosDDL.
Aatualizaopossivel,tambm,atravsdosmtodosdasinterfacesdeResultSet,comoj
apresentadonaseosobreRegistros.

8.8 Comandos SQL Preparados


QuandoummesmocomandoSQL,comousemparmetros,forexecutadodiversasvezes,
podemospreparlocomantecedncia,otimizandoarespostadobancodedados.Aprincipal
diferena da abordagem anterior, que o comando ser passado ao banco de dados no
momento da sua criao. Assim, quando ele for executado o banco de dados responde
imediatamente, sema necessidade deanalislo acada execuo,comoacontece com os
comandosestticos.
A interface com.sun.star.sdbc.XConnection, permite a criao de um objeto para enviar
comandosSQL,comousemparmetros,aobancodedados,atravsdomtodo:
prepareStatement(sCmdSQLAsString)As<com.sun.star.sdbc.PreparedStatement>
criaumnovoobjetoPreparedStatement.
Cada parmetro do comando SQL deve ser substitudo por uma marca (um sinal de
interrogao),porexemplo:
sCmdSQL=UPDATEtabelaXSETcolunaY=?WHEREcolunaZLIKE?
representaumcomandoSQLcomdoisparmetros,umnacolunaYeoutronacolunaZ.
124

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

Oservio<com.sun.star.sdbc.PreparedStatement>oferecediversasinterfaces,entreelas:
A interface < com.sun.star.sdbc.XPreparedStatement > tem funcionalidade similar a
XStatementedefineosmtodos:
executeQuery()AsResultSet
executeUpdate()AsLong
execute()AsBoolean
getConnection()
Todoscomfuncionalidadeigualaosdainterface<XStatement>,massemparmetros.
Ainterface<com.sun.star.sdbc.XParameters>,encarregasedadefiniodosvaloresdos
parmetros,contendovriosmtodos,entreosquais:
setBoolean(nIndiceAsLong,bValorAsBoolean)
setInt(nIndiceAsLong,nValorAsLong)
setFloat(nIndiceAsLong,fValorAsSingle)
setDouble(nIndiceAsLong,dValorAsDouble)
setString(nIndiceAsLong,sValorAsString)
setDate(nIndiceAsLong,stValorAs<com.sun.star.util.Date>)
setTime(nIndiceAsLong,stValorAs<com.sun.star.util.Time>)
setTimestamp(nIndiceAsLong,stValorAs<com.sun.star.util.DateTime>)
DefineovalordoparmetronIndice.Elessonumeradosnaordememqueaparecemno
comandoSQL.
clearParameters()
limpaosvaloresdosparmetrosimediatamente
Jdispomosdoselementosparaapresentarumexemploilustrativo:
SubparametroSQLSelect
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
oFonte=oContexto.getByName("Minha_Fonte")
'fazaconexocomafontededados
DimoConexaoAsObject
oConexao=oFonte.getConnection("","")
'defineocomandoSQLparametrizado
sCmdSQL="Select*FromamigosWhereCODIGO>=?"
'preparaocomando
DimoComandoAsObject
oComando=oConexao.prepareStatement(sCmdSQL)
'defineovalordoparmetro
nValor=2
oComando.setInt(1,nValor)'ocampoDECIMAL
'obtemoresultadodaconsulta
DimoResultadoAsObject
oResultado=oComando.executeQuery()
'percorreoresultado
sMsg=""
n=0

Introduo ao OpenOffice.org Basic

125

Banco de Dados

Verso 2

DoWhile(oResultado.next())
sMsg=sMsg+oResultado.getString(2)+Chr$(10)
n=n+1
Loop
MsgBoxsMsg+"Linhas:"+Str$(n)
'liberaosrecursos
oComando.close()
'
EndSub

ObservequeocomandoSQL passadocomo argumento domtodo prepareStatement,


depoisdefinimosovalordoparmetrocomumdosmtodossetXXXe,sento,chamamos
omtodoexecuteQuery.
Algicaparaatualizaesamesma,masdevemoschamaromtodoexecuteUpdate.

8.9 Consultas Preparadas


Ainterface <com.sun.star.sdb.XCommandPreparation> defineomtodoaseguir,quenos
permiteprepararconsultas,comousemparmetros,armazenadasnafontededados.
prepareCommand(sComandoAsString,nTipoAs<com.sun.star.sdb.CommandType>)
As<com.sun.star.sdbc.PreparedStatement>
enviaumobjetoPreparedStatementparaobancodedados
OsparmetrossComandoenTipotmomesmosignificadodaspropriedadesCommande
CommandType,doservioRowSet.
Relembrando,<com.sun.star.sdb.CommandType>defineasseguintesconstantes:
TABLE
QUERY
COMMAND

indicaquesComandoreceberonomedeumatabela
indicaquesComandoreceberonomedeumaconsulta
indicaquesComandoreceberumcomandoSQL

Apsapreparaodocomando,eledeverserexecutadocomumdosmtodosdainterface
XPreparedStatement. Se a consulta ou o comando SQL tiver parmetros, cada um deles,
deverserdefinidocomomtodosetXXX,apropriadoaoseutipodedado.
Oblocodecdigoaseguir,demonstraestaabordagem:
'preparaocomando
DimoComandoAsObject
'Consulta_2estarmazenadanafontededados:
'Select*FromamigosWhereCODIGO>=?
sComando="Consulta_2"
nTipo=com.sun.star.sdb.CommandType.QUERY
oComando=oConexao.prepareCommand(sComando,nTipo)
'defineovalordoparmetro
nValor=2
oComando.setInt(1,nValor)'ocampoDECIMAL
'obtemoresultadodaconsulta
DimoResultadoAsObject
oResultado=oComando.executeQuery()

126

Introduo ao OpenOffice.org Basic

Verso 2

Banco de Dados

'percorreoresultado

Observeque:sComandodependedenTipo,omtodoprepareCommandretornaumobjeto
PreparedStatementeadefiniodoparmetrodaconsultasegueopadroanterior.

8.10 Vnculos
Alm de tabelas e consultas, uma fonte de dados permite a definio de vnculos com
documentos do OpenOffice.org. Este documentos podem conter formulrios ou outros
objetos,comocampos,dependentesdeumbancodedados.
Oacessoaosvnculospossivelatravsdainterfacecom.sun.star.sdb.XBookmarksSuppliere
seumtodo:
getBookmarks()As<com.sun.star.container.XNameAccess>
retornaumcontainercom.sun.star.sdb.DefinitionContainer,contendoosvnculosdafontede
dados.
Podemos adicionar ou remover elementos do container, usando os mtodos de
XNameContainer.
insertByName(sNomeAsString,sMarcadorAsVariant)
sNomeonomedovnculoesMarcadoraURLdodocumento.
removeByName(sNomeAsString)
sNomeonomedovnculo
Osmarcadoresdevemconterocaminhocompletododocumentonaformafile:///caminho.
Paramanteraconsistncia,umexemplo:
SubvinculosFonteDados
DimoContextoAsVariant
DimoFonteAsVariant
DimoVinculosAsObject
'
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
oFonte=oContexto.getRegisteredObject("Minha_Fonte")
'obtemocontainercomosvnculos
oVinculos=oFonte.getBookmarks()
'adicionaumnovomarcador
sURL="file:///D:/NAD/OPENOFFICE/TESTMACROS.SXW"
oVinculos.insertByName("Meu_Novo_Vinculo1",sURL)
'obtmasURLsdosvnculos
sMsg=""
ForI=oVinculos.getCount()To1Step1
sMsg=sMsg+"URL:"+oVinculos.getByIndex(I1)+Chr$(10)
NextI
MsgBoxsMsg
'
EndSub

Aqui,adicionamosumvnculonafonteMinha_Fontee,emseguidaextramosasURLsdos
vnculosregistradosnafontededados.

Introduo ao OpenOffice.org Basic

127

Banco de Dados

Verso 2

DepossedaURLdeumdocumento,podemoscarreglo,conformeoexplicadonocaptulo
TrabalhandocomDocumentos,usandoomtodo:
loadComponentFromURL(lista_de_parametros)
consulteocaptuloTrabalhandocomDocumentos,paramaisdetalhes.

128

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

9 Apndice Linguagem Basic


AlinguagemBASIC(Beginner'sAllpurposeSymbolicInstructionCode)foicriadanoanode
1963,pelosmatemticosJohnGeorgeKemenyeTomKurtzas,noDartmouthCollege.Desde
ento,pelafacilidadedeusoeaplicaogeral,tornouseumadasmaispopulareslinguagensde
programaodecomputadores,emtodoomundo.

9.1 Primeiros Passos


Paraexplicaralgumas caractersticas doOOoBasic,vamosapresentareanalisar,passoa
passo,umexemplosimplesdeprograma.
Antesdeiniciar,abraumnovodocumentodoWriteresalveocomo ExemplosBasic.Em
seguida,selecione,nomenuprincipal, FerramentasMacro.Surgeodilogo Macro,na
partecentraltemarvoreMacrode.Comabarraderolagemvertical,localizeeselecioneo
nExemplosBasic.sxw(dumcliquesobreonomeparaselecionar).Agora,cliquesobreo
botoNovo.SurgeodilogoNovoMdulo,comonomeModule1nacaixadetexto.Clique
sobreoboto OK.Pronto,vocacaboudecriarumnovomduloModule1,pararecebera
macrodonossoexemplo.AnovajanelaquesurgiuoeditorBasic,partedoIDEBasicdo
OpenOffice.org.Estajanela,nasuapartecentral,contmaslinhas:
REM*****BASIC*****
SubMain
EndSub
Sevocnochegounesteponto,consulteocaptulo MacrosOpenOffice.orgBasic,desta
Introduo.L,existeminformaesdetalhadassobreoIDEBasic.
Vamosaonossoexemplo.Elesolicitaonomedooperador,obtmahoradosistemaefaz
umasaudaoapropriada.Digiteocdigofonteabaixo,entreaslinhasSubMaineEndSub:
DimsNomeAsString'varivelparaguardaronome
DimsSaudaAsString'varivelparaguardarasaudao
DimsHoraAsInteger'varivelparaguardarahoradosistema

sHora=Hour(Now)
sNome=InputBox("DigiteoseuNome:","Caixadeentrada","Operador")
If(sHora>6AndsHora<18)Then
sSauda="BomDia!"
Else
sSauda="BoaNoite!"
EndIf
MsgBoxsSauda+sNome

VocacaboudecriarumamacrochamadaMain.Vamosexecutaramacro:selecione,nabarra
demenu,FerramentasMacro.NodilogoMacro,cliquesobreobotoExecutar.Surge
umacaixadeentrada,solicitandooseunome,digiteoecliquesobreobotoOk.Surgirum

Introduo ao OpenOffice.org Basic

129

Apndice Linguagem Basic

Verso 2

dilogocomumasaudao,cliqueem Ok paraencerraraexecuodamacro.Seocorrer
algumerro,reviseocdigodigitadoerecomece.
Vamosanalisar,passoapasso,onossocdigofonte:
REM*****BASIC*****
Estalinhacontmumcomentrio.Comentriosnosoexecutados.
SubMain
EstalinhadeclaraedefineumasubrotinachamadaMainedeveestaracompanhadadeuma
linhaEndSub.Entreasduaslinhasdevevirocdigofontequedfuncionalidadeasub
rotina.
DimsNomeAsString'varivelparaguardaronome
DimsSaudaAsString'varivelparaguardarasaudao
DimsHoraAsInteger'varivelparaguardarahoradosistema
Estaslinhas declarameinicializam as variveis queserousadasnamacro.O apstrofe
marcaoinciodecomentriosnumalinhadecdigo.
sHora=Hour(Now)
Aqui,chamamosduasfunesinternasdoBasic.AfunoNow,obtmahoracompletado
sistema(hh:mm:ss).Afuno Hour recebeovalorretornadoporNoweextraisomentea
hora.Emseguida,ovalorobtidoporHour(ahora)armazenadonavarivelsHora.Neste
contexto,osinaldeigual(=)chamadooperadordeatribuio.Tudoqueestiverdolado
direitodooperadordeatribuiorecebeonomedeexpresso,nestecasoHour(Now).
sNome=InputBox("DigiteoseuNome:","Caixadeentrada","Operador")
EstalinhachamaafunoInputBox,doBasic,queapresentaacaixadedilogoparalidar
comaentradadonomedooperador.Notequepassamostrscadeiasdecaracteresparaesta
funo. Estes valores (as cadeias) so chamados de parmetros da funo. O primeiro
parmetroumamensagemparaooperador,osegundoottulododilogoeoterceiroo
valorpadrodacaixadetexto.AfunoInputBoxretornaocontedodacaixadetextose
vocclicarsobreobotoOk,seno(cliquesobreobotoCancelarouFechar)retornauma
cadeiavazia.Apsencerrarodilogo,ovalorretornadoseratribudovarivelsNome.
Ainda,sobreparmetros,podemosdizerqueafunoNownotmparmetroequeafuno
Hourrecebeumparmetro.
If(sHora>6AndsHora<18)Then
Aqui,iniciamosaexecuodeum comandodedeciso.EstamosdizendoaoBasic: se o
valorarmazenadonavarivel sHoraformaiorque6emenorque18ento executeo
prximoblocodecdigo.Ossinais>e<sochamadosoperadoresrelacionais.Apalavra
Andchamadadeoperadorlgico.Ocontedoentreparntesesumaexpressocomposta
queseravaliadacomoVerdadeira(True)ouFalsa(False).Elaserverdadeira,seambasas
expresses(sHora>6;sHora<18)foremverdadeiras.
sSauda="BomDia!"
A expresso Bom Dia! ser atribuda a sSauda, se a expresso da linha anterior for
avaliadacomoverdadeira(True).

130

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

Else
Seno,aexpressofoiavaliadacomofalsa(False),executeoprximoblocodecdigo.
sSauda="BoaNoite!"
AexpressoBoaNoite!atribudavarivelsSauda.
EndIf
EstalinhaindicaofinaldocomandodedecisoIF...THEN...ELSE...ENDIF.
MsgBoxsSauda+sNome
EstalinhachamaasubrotinaMsgBox,doBasic,queexibeumacaixademensagemparao
operador.Elarecebeumparmetro,nestecasoaexpressosSauda+sNome.Osinal(+),
nestecontexto,chamadodeoperadordeconcatenao,poisjuntaascadeiasdecaracteres
guardadasnasvariveissSaudaesNome.CliquesobreobotoOKparafecharacaixade
mensagem.
EndSub
Estalinhaindicaotrminodasubrotina,iniciadanalinhaSUBMain.Noesquea,uma
linhaSUB...precisaestarassociadaaumalinhaENDSUB.
Neste tpico, voc aprendeu diversos conceitos (esto em negrito) relacionados com a
linguagemBasic.Sealgumpontonofoicompreendido,executenovamenteoexemploeleia
opassoapasso,tentandoassociaroqueocorreuduranteaexecuocomaslinhasdecdigo.

9.2 Elementos do Basic


Nestaseo,veremossuperficialmenteosprincipaiselementosdalinguagemBasic.

Palavras reservadas
Umapalavrareservadaumidentificador(nome)utilizadointernamentepelalinguagem
Basic. As palavras reservadas do Basic so aquelas usadas nos seus comandos, nas suas
funesinternas,nassuasconstantesenosseusoperadores.Abaixo,algunsexemplos:
BEEP
CALL
SUB
FOR
NEXT
EXIT
WHILE
DO
STR$
TRIM$
SQR
AND
OR
PI

comandodoBasic
comandodoBasic
comandodoBasic
partedeumcomandodoBasic
partedeumcomandodoBasic
partedecomandosdoBasic
partedecomandosdoBasic
partedecomandosdoBasic
funodoBasic
funodoBasic
funodoBasic
operadordoBasic
operadordoBasic
constantedefinidapeloBasic

Introduo ao OpenOffice.org Basic

131

Apndice Linguagem Basic

Verso 2

Oprincipalsobreestaspalavras:elasnopodemserusadascomonomesparaidentificar
variveis,constantesouprocedimentosdefinidospeloprogramador.

Regras para nomes


Devemosobservarasseguintesregrasparaosnomesdasnossavariveis,constantes,sub
rotinasefunes:
Nomessocompostosporletras(AaZ),dgitos(0a9)esublinhado(_);
Caracteresespeciaisedepontuaonosopermitidos(ex:letrasacentuadas,vrgula);
Nomesdevemcomearporumaletradoalfabeto;
Nomesnopodemcontermaisde255caracteres;
Nomesnodiferenciamentreletrasmaisculaseminsculas;
Nomescontendoespaosopermitidos,masdevemestarentrecolchetes;
Palavrasreservadasnopodemserusadascomonomesdefinidospeloprogramador.
Exemplos:
Nomesvlidos:ptoIni,ponto2,flag,minha_Funcao,[MinhaVariavel]
Nomesinvlidos:2_ponto,minha?Varivel,celsius,Retngulo,BEEP

Comentrios
Numa macro, as linhas iniciadas por apstrofe ou pela palavra reservada REM ( de
REMarker)soconsideradascomocomentrios,portantonosoprocessadas.
'Istoumcomentrio
REMOcdigoabaixoinicializaasvariveisdeambiente

Oscomentrios(comapstrofe)podemsercolocadosnafrentedeumalinhadecdigo.
DIMcoord_XAsDouble'varivelparaguardaracoordenadaXdoponto
DIMcoord_YAsDouble'varivelparaguardaracoordenadaYdoponto

Tipos de dados internos


Inteiros(INTEGER)
Uminteiropodeconterumvalornafaixade32768a32767.
InteirosLongos(LONG)
Uminteirolongopodeconterumvalornafaixade2.147.483.648a2.147.483.647.
Pontoflutuantesimples(SINGLE)
Valoresdeprecisosimplespodemvariarde3.402823E38a1.401298E45,paranmeros
positivosounegativos.
Pontoflutuanteduplo(DOUBLE)

132

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

Osvaloresdeduplaprecisovariamnafaixade1.797693134862315E308a4.94066E324,
paravaloresnegativosoupositivos.
Moeda(CURRENCY)
Osvaloresdestetipovariamde922.337.203.685.477,5808at922.337.203.685.477,5807.
Booleano(BOOLEAN)
OsvaloresdestetipopodemserTrue(verdadeiro)ouFalse(falso)
Data(DATE)
Podemcontervaloresdedataetempoarmazenadosnumformatointerno.
Cadeiasdecaracteres(STRING)
Umacadeiapodeconterat64000caracteres(64Kb).

Declarao de variveis
PodemosdeclararvariveisexplicitamentecomapalavrareservadaDIM,domodoabaixo:
DIMnome_da_variavelAStipo_de_dado
Ou:
DIMnome_da_variavelseguidodocaractereindicadordotipodedado
nome_da_variavelumnomedefinidopeloprogramador,conformeasregrasdenomeao.
Exemplos:
DIMvarInteiraASINTEGER
DIMvarInteira%
DIMvarIntLongoASLONG
DIMvarIntLongo&
DIMvarStringASSTRING
DIMvarString$
DIMvarSingleASSINGLE
DIMvarSingle!
DIMvarDuplaASDOUBLE
DIMvarDupla#
DIMvarPrecoASCURRENCY
DIMvarPreco@

'Declaraumavariavelinteira
'Declaraumavariavelinteira(%)
'Declaraumavariavellonga
'Declaraumavariavellonga(&)
'Declaraumavariavelstring
'Declaraumavariavelstring($)
'Declaraumavariavelrealsimples
'Declaraumavariavelrealsimples(!)
'Declaraumavariavelrealdupla
'Declaraumavariavelrealdupla(#)
'Declaraumavariavelmoeda
'Declaraumavariavelmoeda(@)

Podemosdeclararumavarivel,nomomentodoseuemprego,acrescentandoocaracterede
tipoaonomedavarivel,comonosexemplosabaixo:
UmInteiro%=1500
UmLongo&=2195678
MeuNome$=JOSDEANDRADE
UmRealSimples!=15.555
UmRealDuplo#=coordEne*sin(30)

'declarauminteiro
'declarauminteirolongo
'declaraumacadeia
'declaraumrealsimples
'declaraumrealduplo

SeotipodedadonoforindicadoavarivelserassumidacomoSingle.
Ovalordeumavariveldeclaradaser0paratiposnumricos,umacadeianulaparaStringse
FalseparaBoolean.

Introduo ao OpenOffice.org Basic

133

Apndice Linguagem Basic

Verso 2

recomendveladeclaraoexplcitadasvariveisdeumprograma,bemcomoaescolhade
nomessignificativosparaasmesmas.Paraforaradeclaraodetodasasvariveis,usea
linhadecomandoabaixo,noinciodomdulo:
OPTIONEXPLICIT

Matrizes
Matrizescontmumgrupodevariveiscomcaractersticascomunsecomomesmotipode
dado.Comumamatrizpodemosusarumsnomedevariveleacessarosvaloresdeum
elementousandoumndice.Umamatriztemumlimiteinferioreumlimitesuperioremcada
dimenso.Os ndices sovalores inteiros (negativos oupositivos).At16.368elementos
podemserendereados.
Matrizessoestruturasdedadosprpriasparausodentrodelaos.
Exemplosdeempregodematrizes:
DimnomeDePonto(30)ASString'Vetorpara31nomesdepontos(0a30)
DimcoordPonto3D#(30,2)'Matrizde2dimensescom31linhase
'3colunas(X,YeZ)dotipoDouble
'Atribuindovalores
nomeDePonto(0)=Ponto01
'atribuiacadeiaao1o.elemento
dovetor
nomeDePonto(30)=Ponto31
'atribuiacadeiaaoltimo
elementodovetor
'Acessandovalores
coordX=coordPonto3D(9,0) 'obtmovalordalinha10,coluna1
coordY=coordPonto3D(9,1) 'obtmovalordalinha10,coluna2
coordZ=coordPonto3D(9,2) 'obtmovalordalinha10,coluna3

OsndicesinferioresuperiorpodemserdefinidoscomaclusulaTO,porexemplo:
DimsNomes$(1To30)'Declaravetorpara30(1a30)nomes
DimmatrizA%(1To5,1To3)'Declaramatrizde5linhasX3colunas

Podemosdeclararumamatrizcujotamanhoserdeterminadoposteriormente.
DimnomePonto$()
'Declaraumvetordetamanhodesconhecido
Apsconheceronmerodepontos,podemosredimensionarovetorcomREDIM:
NumeroPontos=100
RedimnomePonto(numeroPontos)
'redimensionaovetorpara101nomes(0a100)
REDIMapagaocontedodovetor,sequisermosaumentarotamanhodovetorpreservando
seucontedo,devemosusaraclusulaPRESERVE,vejaabaixo:
REDIMPRESERVEnomePonto(200)'aumentade100para200conservandoocontedo

Escopo das variveis


Oescopotemavercomavisibilidadedeumavariveldentrodamacro,ouseja,oslugaresda
macroonde estavarivel podeserreferenciada. Umavarivel podeserlocal, pblica ou
global,conformeasuadeclarao.Seelafordeclaradadentrodeumasubrotinaoufuno
134

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

elaservisvelapenasdentrodasubrotinaoufuno,portantolocal.Sefordeclaradaforade
qualquersubrotinaoufunocomocomandoPUBLIC,elaservisvelportodasassub
rotinasefunesdamacro,sendoassimumavarivelpblicadessamacro.Sefordeclarada
foradeumasubrotinaoufunocomocomandoGLOBAL,elaservisvelportodasas
macros,isto,preservaoseuvalorapsotrminodaexecuodamacro.
Exemplosdoescopodevariveis:
GlobalcorElementoAsInteger'visvelportodasasmacros
PublicestiloLinhaAsInteger'visvelapenasnestamacro
SubtrocaValor(valor1%,valor2%)
Dimtemp%'tempvisvelapenasemtrocaValor
'...outroscomandos
EndSub
SubMain
Dimvar1AsInteger'visvelapenaspelaSubMain
pesoLinha%=2'visvelapenaspelaSubMain
'...outroscomandos
EndSub

Adeclaraodeumavarivelpblicadeveserfeitaantesdequalquersubrotinaoufunona
macro.
As variveis locais existem apenas enquanto a subrotina ou funo, na qual elas foram
declaradas,soexecutadas.

Constantes simblicas
Parafacilitaraleituradeumamacro,osvaloresliterais(1000,S,2.718),usadosaolongo
damesma,devemserdeclaradoscomoconstantessimblicas,comocomandoCONST,fora
dequalquersubrotinaoufuno,assim:
'declaraodeconstantes
ConstNR_PONTOS%=1000'nmerodepontos=1000
ConstSIM$=S'constanteSIM=S
ConstBASE_NATURAL#=2.718'baselog.naturais

Posteriormente,podemosusarestasconstantesnumaexpresso,nolugardosseusvalores
literais,porexemplo:
DIMcoordX(NR_PONTOS)AsDouble'declaravetorcom1001elementos
valor#=valor1*BASE_NATURAL'bemmaiscompreensvel!
If(Resposta$=SIM)Then
'seresposta=Sento
'executeoscomandos
EndIf

Apsadeclaraodeumaconstante,oseuvalornopodersermudadodentrodoprograma.
Constantessimblicasfacilitamamanutenodoprograma,poisvocprecisaalterarapenaso
seuvalor,emvezdetodasasocorrnciasdovalorliteraldentrodoprograma.

Introduo ao OpenOffice.org Basic

135

Apndice Linguagem Basic

Verso 2

OOpenOffice.orgBasicpossuiasseguintesconstantesprdefinidas(PI,True,False).

Expresses
Umaexpressoumaconstante,umavarivel,umafuno,ouqualquercombinaodestas,
separadas por operadores e parnteses, escrita segundo as regras do Basic e passvel de
avaliao.Seguemosprincipaiselementosencontradosemexpresses.
OperadordeAtribuio
Oresultadodeumaexpressopodeseratribuidoaumavarivelcomousodooperadorde
atribuio,osinaldeigual(=).Notequenestecontexto,osinaldeigualnosignificauma
comparao,massimumaatribuio,isto,oresultadodaexpressodoladodireitodosinal
seratribudovariveldoladoesquerdodosinal.Exemplos:
'declaraasvariveisdiametroeraio
Dimdiametro#,raio#
'atribuiovalor2.0aoraio(2.0umaexpresso)
raio=2.0
'atribuioresultadodaexpresso(2*raio)adiametro
diametro=2*raio

OperadoresAritmticos
So usados com operandos numricos e produzem resultados numricos. Os operandos
podem ser constantes numricas, variveis numricas ou funes que retornam valores
numricos.Osoperadoresso:
Operador

Usado para

Operandos

Somar expresses

Subtrair expresses

Multiplicar expresses

Dividir a primeira pela segunda expresso

Dividir expresses inteiras

Obter o resto de uma diviso inteira

Exponenciao

Mod
^
Exemplos:

'valor=0.5(noteque5e10sopromovidosaDouble)
valor#=5/10
'cos()umafunointernadoBasic
cosTeta#=cos(1.555)
'PIumaconstantedoBasic
area#=2*PI*raio^2
'r,a,b,c,d,esovariveisnumricas
r=(a+b)*(cd/e)

136

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

OperadoresdeConcatenaodeCadeias
Sousadosparajuntarduasoumaiscadeiasdecaracteres.
Operador

Usado para

&

Concatenar duas ou mais cadeias ( strings )

Concatenar duas ou mais cadeias ( strings )

Exemplos:
preNome$=Menino
sobreNome$=Maluquinho
nomeCompleto$=preNome&&sobreNome

OperadoresRelacionais(Comparao)
SousadosparacompararexpresseseoresultadoumBooleano,True(1)ouFalse(0).
Operador
=
<>

Usado para
As expresses so iguais ?
Asexpressessodiferentes?

>

A primeira expresso maior que a segunda ?

<

A primeira expresso menor que a segunda ?

>=

A primeira expresso maior que ou igual a segunda ?

<=

A primeira expresso menor que ou igual a segunda ?

Nacomparaodestrings,maisculassodiferentesdeminsculas,porpadro.
Exemplos:
'seRioSPfor>oresultadodaexpressoTrue,senoFalse
resultado=(RioSP>RioBH)
'seRaio1for=aRaio2oresultadoTrue,senoFalse
resultado=(Raio1=Raio2)

OperadoresLgicos
Se usados com operandos Booleanos e/ou expresses Booleanas, resultam num valor
Booleano.Seusadoscomoperandosnumricos,executamumaoperaobitabit,resultando
numvalornumrico.
Operador
Introduo ao OpenOffice.org Basic

Usado para

Operandos
137

Apndice Linguagem Basic

NOT

Verso 2

Inverte o resultado booleano

Uma das expresses TRUE ?

AND

Ambas as expresses so TRUE ?

XOR

Uma expresso TRUE e a outra FALSE ?

EQV

Ambas so TRUE ou ambas so FALSE ?

IMP

Se a 1a. for TRUE a 2a precisa ser TRUE

OR

Exemplos:
'
'resultadoTrue,seas2expressesforemTrue
'FIM_ARQUIVOumaconstantedefinidaanteriormente
resultado=(NrPtos<1000AndNotFIM_ARQUIVO)
'
'resultadoTruesea1a.oua2a.forTrue
'EOF()umafunodoBasic
resultado=(NrPtos<1000OrNotEOF())

Paraexemplosdeoperaobitabit,consulteaajuda(Help)online.
PrecednciadosOperadores
Uma expresso pode ser composta por mais de um operador. A ordem na qual estes
operadoressoavaliadoschamaseprecednciadosoperadores,damaiorparaamenortemos:
()
Parnteses
^
Exponenciaco
*,/
Multiplicaoediviso
\
Divisointeira
Mod
Mdulo
+,
Somaesubtrao
=,<>,>,<,>=,<=
Operadoresrelacionais
Not,And,Or,Xor,Eqv,Imp
Operadoreslgicosnestaordem
Para forar a avaliao de uma expresso podemos, sempre, usar parnteses (maior
precedncia).
Exemplo:
valor1=6+6/3
valor2=(6+6)/3

138

'apsavaliaovalor1=8
'apsavaliaovalor2=4

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

9.3 Fluxo de controle da execuo


Aordemdeexecuodoscomandos,numamacro,determinadapeloscomandosdedeciso
(IFeSELECTCASE)erepetio(DO,FOReWHILE)existentesnoprograma.Almdestes,
podemosusarLabels,GOTOeGOSUB,quandoestritamentenecessrio.

Comando de deciso If ... Then


PrimeiraformadocomandoIF:
If(expresso)Then'SeexpressoforTrueEnto
'
'Executeesteblocodecomandos
'
EndIfFimSe
SegundaformadocomandoIF(comaclusulaELSE):
If(expresso)Then'SeexpressoforTrueEnto
'Executeesteblocodecomandos
Else
'Executeesteblocodecomandos
EndIf'FimSe
TerceiraformadocomandoIF(comaclusulaELSEIF):
If(expresso)Then'SeexpressoforTrueEnto
'Executeesteblocodecomandos
ElseIf(expresso)Then
'Executeesteblocodecomandos
Else
'Executeesteblocodecomandos
EndIf'FimSe
Emtodasasformasousodosparntesesopcional.PodemosaninharvrioscomandosIf.
ExemplodasegundaformadocomandoIF:
If(a>b)Then
maior=a
Else
maior=b
EndIf

'seafor>queb,ento
'armazeneovalordeanavariavelmaior
'seno
'armazeneovalordebnavariavelmaior
'fimse

ExemplodaterceiraformadocomandoIF:
If(botao=Ok)Then
mens$=OKpressionado
ElseIf(botao=Cancela)Then
mens$=CANCELApressionado
Else

Introduo ao OpenOffice.org Basic

139

Apndice Linguagem Basic

Verso 2

mens$=AJUDApressionado
EndIf

Comando de deciso Select Case


FormadocomandoSelectCase...EndSelect:
SelectCase(expresso_de_teste)
Caselista_de_expresses1
'executeesteblocodecomandos
Caselista_de_expresses2
'executeesteblocodecomandos
CaseElse
'executeesteblocodecomandos
EndSelect 'fimdaseleo
A instruo Select Case avalia a expresso_de_teste somente uma vez, na entrada do
comando,emseguida,comparaseuresultadocomalista_de_expressesdasclusulasCase.
Sehouverumacoincidncia,oscomandosabaixodoCaseseroexecutados.Oscomandosde
CaseElse(queopcional)seroexecutadossenohouvernenhumacoincidnciaanterior.
Alistadeexpressespodecontermaisdeumaexpressoouatumafaixadevalores(Ex:10
To20),comcadaexpressoseparadaporvrgula.Asexpressesdevemserdomesmotipode
dadodaexpresso_de_teste.Apsaexecuodoblocodecomandos,ocontrolepassaparaa
prximalinhadepoisdoEndSelect.
ExemplodeSelectCaseavaliandoconstantes:
Select Case tipoDesenho
CaseLINHA
'executacomandosparalinha
CaseCIRCULO
'executacomandosparacrculo
CaseCURVA
'executacomandosparacurva
CaseElse
'avisaaooperadorqueoelementoinvlido
EndSelect

ExemplodeSelectCaseavaliandovalores:
SelectCasecorElemento
Case0To2,6,8'casocores0,1,2,6ou8
'executaesteblocodecomandos
Case3To5'casocores3,4ou5
'executaesteblocodecomandos
Case9'casocor9
'executaesteblocodecomandos
EndSelect

140

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

Comando de repetio While ... Wend


FormadocomandoWhile...Wend:
While(expresso_de_teste)'enquantoexpressoforTrue
'
'executaesteblocodecomandos
'
Wend'fimenquanto
Este comando avalia a expresso_de_teste noincio, se oresultado for True, o bloco de
comandos ser executado e o controle volta para o While para uma nova avaliao da
expresso.SenoocomandoapsoWendserexecutado.permitidoaninharlaosWhile...
Wend.
ExemplodeWhile...Wend:
Subexemplo_While_Wend
'
DimnomeArqAsString
DimsPastaAsString
DimnrArqAsInteger
'
nrArq=0
'inicializacontadordearquivos
sPasta=CurDir()
'obtmapastacorrente
nomeArq=Dir$(sPasta,0)
'obtemnomedoprimeiroarquivo
'
While(nomeArq<>"")
'enquantotivernomearquivo
'
'aqui,podemosexecutaralgumatarefasobreoarquivo
'
nomeArq=Dir$()
'retornanomedoprximoarquivoou""
nrArq=nrArq+1
'incrementanrdearquivos
Wend
'fimenquanto
'
MsgBoxStr$(nrArq)+"arquivos,napasta:"+sPasta
'
EndSub

Nesteexemplo,obtemosapastacorrenteetodososnomesdearquivos,comatributonormal,
nela existentes. As funes CurDir, Dir e Str$ so internas ( do Basic ). Note que na
primeirachamadadafunoDir,passamosdoisparmetrosenasprximaschamadas,dentro
dolao,nopassamosnenhumparmetro.

Comando de repetio For ... Next


FormageraldocomandoFor...Next:
FORContador=valor_inicialTOvalor_finalSTEPvalor_incremento
'executablocodecomandos
IF(expresso)THEN'parasairdolaoantesdoContadoratingirovalor_final
EXITFOR'useocomandoExitFor
ENDIF'fimse
Introduo ao OpenOffice.org Basic

141

Apndice Linguagem Basic

Verso 2

NEXTContador'aqui,Contadoropcional
OcomandoFor...Nextfuncionadaseguintemaneira:
Ovalor_inicialatribudovarivelContador,depoiseletestaocontadorcomovalor_final,
seoresultadodotesteforTrue,oscomandosdentrodolaoseroexecutados,emseguida
Contadorserincrementadocomvalor_incrementoeumnovotesteserexecutado,atquese
obtenhaumvalorFalseparaoteste,conformeasregras:
Paravalordoincrementopositivo,otesteserTrueseContador<=valor_final.
Paravalordoincrementonegativo,otesteserTrueseContador>=valor_final.
SeaclusulaSTEPforomitidaovalor_incrementoser1.
OtestecomIFdeveserusadosequisermossairdolaoantesqueContadorbatacomo
valor_final.
ExemplodeFor...Next:
'Inicializarumvetorde100elementos
'
Subexemplo_For_Next
DimVetor(1To100)AsInteger
DimIAsInteger
'
'paraIvariandode1a100comincremento1
ForI=1To100
'Iusadocomondicedovetoretambmnaexpresso
Vetor(I)=I*2
NextI'vaiparaaprximaavaliaodeI
'exiberesultadodasomado1oeltimoelementos
MsgBoxStr$(Vetor(1)+Vetor(100))
'
EndSub

Aqui,definimosumvetorcom100elementos,comondiceinicialem1eofinalem100(se
vocnoespecificarondiceinicial,oOOoBasicadotaozero).Depois,entramosnolaoe
atribumosvalores(I*2)paraoselementosdovetor.Terminamosexibindoasomados
primeiroeltimoelementosdovetor.
OcomandoFor...Nextmuitoeficienteedeveserusadosemprequesoubermosonmero
derepetiesdolao.
PodemosaninharcomandosFor...Next(muitotilparaoperaescommatrizes).

Comando de repetio Do ... Loop


Empregado para executar um bloco de comandos um nmero indefinido de vezes. Este
comandopodeserusadode5maneirasdiferentes.
Primeira,laoinfinito:
DO'faa
'executablocodecomandos
'testeparasairdolao,semotesteolaoserinfinito
IF(expresso)THEN
142

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

EXITDO'saidolao
ENDIF
LOOP'retornaparaoDo
Segunda,testenoinciodocomandocomWHILE
DOWHILE(expresso) 'faaENQUANTOexpressoforTrue
'executablocodecomandos
LOOP'retornaparaoDo
Terceira,testenoinciodocomandocomUNTIL:
DOUNTIL(expresso)'faaATqueaexpressosejaTrue
'executablocodecomandos
LOOP'retornaparaoDo
Quarta,testenofinaldocomandocomWHILE:
DO'faa
'executablocodecomandos
LOOPWHILE(expresso)'ENQUANTOexpressoforTrue
Quinta,testenofinaldocomandocomUNTIL:
DO'faa
'executablocodecomandos
LOOPUNTIL(expresso)'ATqueexpressosejaTrue
Emtodasasmaneiraspodemoscolocarumtestenointeriordolao,paraabandonlocomo
comandoEXITDO.NotequenasformasiniciadassomentecomoDO,olaoserexecutado
pelomenosumavez.OsComandosDo...Looppodemseraninhados.
ExemplodeDo...Loop,comotestedaexpressonoincio:
DoWhile(NotEof())'faaenquantonoforFimdeArquivo
'leiaalinha
'processealinha
Loop'fimdolao

ExemplodeDo...Loop,comotestedaexpressodentrodolao:
Do'faa
'obtemnomePonto
IfIsNull(nomePonto)Then'senomedopontofornulo
ExitDo'saiadolao
EndIf'fimse
'processaoponto
Loop'fimlao

Os Comandos LABEL, GOTO e GOSUB, devem ser evitados. Um uso importante do


GOTO com o comando ON ERROR. Para obter mais detalhes sobre estes comandos,
consulteaajudaonline.

Introduo ao OpenOffice.org Basic

143

Apndice Linguagem Basic

Verso 2

9.4 Organizao do Programa


NoOOoBasic,umprogramaorganizadoemprocedimentos(subrotinasoufunes).O
pontodeentradadamacro,procedimentoprincipal,daresponsabilidadedoprogramador.
Subrotinas e funes podem ser intrnsicas (vem com o OOo Basic) ou definidas pelo
usurio.Umasubrotinanoretornanenhumvalor,jumafunoretornaumvalor,logoelas
devemserusadascompartedeumaexpresso.Umprocedimentopodeserchamadodentro
deoutrosprocedimentosdeumamacro.
Qualquerblocodecdigopassveldereutilizaonamacrocorrenteounoutraqualquer,deve
serimplementadocomoumprocedimentodefinidopelousurio,esteocritriobsico.Por
exemplo,senumamacro,precisarmosdeterminaromenordentretrsvaloresmaisdeuma
vez,devemoscriarumafunoprpriaparaestatarefa.

Comandos
UmcomandoumacombinaodeelementosdoBasic,escritodeacordocomasregrasde
sintaxedalinguagem.Algunspodemocorreremqualquerpartedoprograma,outrosno.Os
comandossoosresponsveispelafuncionalidadedosprocedimentos.
Normalmenteumcomandocabenumaslinha,casocontrriopodemosusarosublinhado,
paraindicarqueocomandocontinuanaprximalinha.Ocaracteredecontinuaonopode
serusadodentrodeumacadeia(string).Vejaoexemplo:
Informe$=Estaumalinhadecomandoquecontinua+_
naprximalinha
Numamesmalinha,podemosescrevermaisdeumcomando,usandoocaracteredoispontos,
comoseparadordecomandos.Abaixo,temostrscomandosdeatribuio:
i=0:j=1:sinal=False

Sub-rotinas
SubrotinasdevemserdefinidaspelocomandoSUB...ENDSUB,daseguintemaneira:
SUBNome_Da_Rotina(Lista_De_Parmetros)
'
'DeclaraodevariveisLocais
'Comandosdasubrotina
'
ENDSUB
A Lista_de_Parmetros, so os valores, separados por vrgula, que a rotina recebe para
executaroseutrabalhoedevemconteraespecificaodetipo.Porexemplo:
SUBMinhaSub(par1AsInteger,par2AsDouble,par3AsString)

144

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

Seumdosparmetrosforumavariveldamacrooseunomenalistadasubrotinapode(e
deve)serdiferentedonomedavarivelnamacro.
Exemplodesubrotinaquetrocaosvaloresdeduasvariveis:
SUBTrocaValores(valor1AsDouble,valor2AsDouble)
'
DimtempAsDouble
'
temp=valor1
valor1=valor2
valor2=temp
'Notequeapesardenoretornarvalores,asvariveispassadas
'comoparmetrosforamalteradaseestasalteraessero
'visveisnarotinaquechamarTrocaValores
'
ENDSUB

Exemplodesubrotinaquerecebetrsparmetroseosimprimeapsformatao:
SubImprimePonto(nomePto$,coordX#,coordY#)
DimcadeiaAsstring
'formataacadeia,incluindovrgulas,usacontinuaodelinha(_)
cadeia=Ltrim$(Rtrim$(nomePto))+,+Str$(coordX)+_
,+Str$(coordY)
'imprime
Printcadeia
'
EndSub

O comando EXIT SUB pode ser usado dentro de uma subrotina para abandonla
imediatamente.

Funes
AdefiniodeumafunofeitaentreoscomandosFUNCTION...END FUNCTION,
comoabaixo:
FUNCTIONNomeFuncao(ListaParametros)AsTipoRetornado
'declaraodasvariveislocais
'comandosdafuno
NomeFuncao=expresso_Retorno

'NOESQUEA!

ENDFUNCTION
Notequeumafunoretornaovalordeumaexpressonumavariveldenomeigualaonome
dafuno.
O comando EXIT FUNCTION pode ser usado dentro de uma funao para abandonla
imediatamente.
Exemplodeumafunoquecalculaovolumedeumaesfera,apartirdoseuraio:
Introduo ao OpenOffice.org Basic

145

Apndice Linguagem Basic

Verso 2

FUNCTIONVolumeEsfera(raioAsDouble)AsDouble
'
DimdiametroAsDouble
'
diametro=2*raio
VolumeEsfera=(PI/6)*diametro^3
'NOTE:nomedafunoVolumeEsfera;nomedavarivel:VolumeEsfera
'
ENDFUNCTION

Ateno, uma funo no pode retornar uma MATRIZ.

Passagem de Parmetros
Apassagemdeparmetrosparasubrotinasefunespodeserfeitadeduasmaneiras,por
referncia(padro)ouporvalor.Quandoumparmetro(varivel)passadoporreferncia,
qualqueralteraoemseucontedoserrefletidanarotinachamadora.Seapassagemforpor
valor, as alteraes na varivel sero descartadas quando o procedimento terminar a sua
execuoeovalororiginalserpreservado.Matrizessopassadassempreporreferncia.
Parapassarumparmetroporvalor,nadefiniodoprocedimento,useapalavraBYVAL,
antesdonomedoparmetro,ou,seBYVALomitida,coloqueavarivelentreparnteses,na
chamada,vejaabaixo:
SUBImprimePonto(BYVALcadeia$,X#,Y#)
cadeia=Ltrim$(Rtrim$(cadeia)+,+Str$(X)+,+Str$(Y)
Printcadeia
'amudanaemcadeia,serdescartadanotrminodaSub
ENDSUB

Chamada de Procedimentos
Achamadaaumprocedimentodependedoseutipo,sesubrotinaoufuno.Comoumasub
rotinanoretornavalores,elanoprecisaserusadacomopartedeumaexpresso.Juma
Funo(sempreretornaumvalor),deveserusadanumaexpresso.
Formasdechamadasdesubrotina:
'UsandoocomandoCALLcomousemparnteses
CALLImprimePonto(nomePonto,coordX,coordY)
CALLImprimePontonomePonto,coordX,coordY
'SemocomandoCALL,comousemparnteses.
ImprimePonto(nomePonto,coordX,coordY)
ImprimePontonomePonto,coordX,coordY
Seasubrotinanotiverparmetrosnoprecisousarosparnteses.
Formasdechamadadefunes:
'chamaafunoareaCirculoearmazenaovalordaareanavariavelareCirc
146

Introduo ao OpenOffice.org Basic

Verso 2

Apndice Linguagem Basic

areCirc=areaCirculo(raio)
'chama2funcoes,areaCirculo()eStr$()ovalorretornadoseratribudoacadeia
cadeia=Str$(areaCirculo(raio))
'chama2funcoes,Sqr()eDistancia()ovalorretornadoseratribudoaraizDist
raizDist=Sqr(Distancia(x1,y1,x2,y2))
Exemplodechamadasdesubrotinasefunes:
SubchamadaProcedimentos
CallUneCadeiasSub("Meu","exemplosub1")
CallUneCadeiasSub"Meu","exemplosub2"
UneCadeiasSub("Meu","exemplosub3")
UneCadeiasSub"Meu","exemplosub4"
'
Dimcad$
cad$=UneCadeiasFunction$("Meu","exemplofunction1")
MsgBoxcad$
EndSub
SubUneCadeiasSub(cad1$,cad2$)
MsgBox(cad1$+cad2$)
EndSub

FunctionUneCadeiasFunction$(cad1$,cad2$)
UneCadeiasFunction$=cad1$+cad2$
EndFunction

Neste exemplo, a subrotina principal chamadaProcedimentos ( a rotina que deve ser


executada), ela chama a Sub UneCadeiasSub e a funo UneCadeiasFunction, ambas
definidas pelo programador. As quatro formas de chamada da Sub UneCadeiasSub so
equivalentes.

Modelo Geral de uma Macro


Aorganizaogeraldeumamacro,podeseguiromodeloabaixo,noqueforaplicvel:

COMENTRIOS(BreveDescrio,NomedaMacro,Autor,Data,Chamada,Outros)
DECLARAODEVARIVEISPBLICAS(Public...)
DECLARAODEVARIVEISPRIVADAS(Private...)
DEFINIODECONSTANTESSIMBLICAS(Const...)
DEFINIODOPROCEDIMENTOPRINCIPAL(SubMain)
DEFINIODASSUBROTINASDAMACRO(Sub...EndSub)
DEFINIODASFUNESDAMACRO(Function...EndFunction)

Nesteapndice,cobrimosapenasobsicosobrealinguagemBasic.Sevocconseguiuchegar
nesteponto,acreditequeestaptoaexplorarsozinhooutraspotencialidadesdalinguagem.

Introduo ao OpenOffice.org Basic

147

Apndice Linguagem Basic

Verso 2

OOpenOffice.orgBasictemumagrandequantidadedecomandosefunes,todosmuito
bemdocumentados naAjudaonline,distribuda comopacote. EstandonoIDEBasic,
bastapressionarateclaF1eummundodeinformaesseapresentarsuafrente.

148

Introduo ao OpenOffice.org Basic

Verso 2

Mais informaes

10 Mais informaes

10.1 Na rede
OpenOffice.org:OlardoOpenOffice.org
http://www.openoffice.org
http://www.openoffice.org.br
ProjetodeDocumentaodoOpenOffice.org:
http://documentation.openoffice.org
OpenOffice.orgforDevelopershttp://website.openoffice.org/developer
EsteolocalparaquemestinteressadoemdesenvolvimentocomoOpenOffice.org.Aqui,
vocencontra:

OpenOffice.org1.0.2Developer'sGuide(~12Mb)

ManualdeRefernciadaAPIdoOpenOffice.org(~8Mb)

StarOffice6.0BasicProgrammer'sGuide(~1Mb)

StarOffice5.2Programmer'sTutorial(~1Mb)

ExemplosdoDeveloper'sGuide(~1Mb)

OOoDocs.Orghttp://www.ooodocs.org
Documentao,fruns(inclusivesobreMacros)enotciasdoOpenOffice.org.
OOOForum.Orghttp://www.oooforum.org
FrunsdoOpenOffice.org,inclusivesobreMacroseAPI.
OOExtrashttp://ooextras.sourceforge.net
Repositriodemodelos,macroseassistentesparaoOpenOffice.org.Baixetodasasmacrose
estudeocdigofonteparaaprendermais.
Pitonyak.orgwww.pitonyak.org/
AndrewPitonyakeseuscolaboradoresmerecemanossagratido.Estapginacontmum
excelentedocumentosobremacrosesobrealinguagemBasic.Consulteaperiodicamente.
EDVSystemeKienleinhttp://kienlein.com/pages/oo.html
ContmoDevGuide,comexemplosdoDeveloper'sGuideeomduloInspectumaexcelente
ferramentaparaanlisedeobjetos.OutroachadooDbMonitor,umaplicativoOOoBasic
completo,paraacessoaBancosdeDados.

Introduo ao OpenOffice.org Basic

149

Mais informaes

Verso 2

10.2 Com o autor


Aceitosolicitaesparacorreeseinclusodenovostpicos.Qualquercontribuioser
muitobemrecebida,nestecaso,oscrditosserodoscontribuidores.
SevoctiveralgumadvidasobreoOpenOffice.orgBasic,talvezeupossalheajudar.Por
favor,antesdeumcontatodireto,posteasuadvidanumfrumapropriado,assimvoc
estarcontribuindoparaoaumentodoknowhowdacomunidade.
Sevocdesejarentraremcontatocomigo,envieumamensagempara:
noelsonduarte@globo.com

10.3 Histrico, alteraes, ...


Porfazer:
1) CaptulosobreFormulrios;
2) CaptulosobreControlesdeDilogosPersonalizados;
3) SeosobreImportar/ExportarDocumentos,nocaptulo5;
4) SeessobreListenerseEventos;
5) SeessobreInterneteCorreioEletrnico.
Em25/08/2003Liberaodaverso2comasalteraesabaixo:
1) IncludooCaptulosobreBancodeDados;
2) ReestruturaodocaptuloIntroduoaAPIdoOpenOffice.org;
3) IncludooApndicesobreaLinguagemBasic,sugestodeGustavoBuzzattiPacheco;
4) IncludaaseoMovimentandoDados,nocaptulodoCalc;
5) IncludaaseoDadosdeFontesExternas,nocaptulodoCalc;
6) AdicionadaaseoDesenhos,nocaptuloDocumentosdoWriter;
7) AdicionadaaseoSeleoduranteaexecuodamacro,emDocumentosdoCalc;
8) CorreonaseoCompartilhandoumaMacro,sugeridaporIsmaelFanlo;
9) CorreesdiversassugeridasporGustavoBuzzattiPacheco;
10)Maislinksdeinformaeseagradecimentos.
Em06/07/2003:PublicaodaIntroduonaHomePagewww.ioobasic.kit.net.
Em02/07/2003:Publicaodaverso1,nositedoOpenOffice.orgProjetoBrasil.
Em02/04/2003:InciodaIntroduoaoOpenOffice.orgBasic.

150

Introduo ao OpenOffice.org Basic

Verso 2

Crditos, Agradecimentos, Licena

11 Crditos, Agradecimentos, Licena

11.1 Crditos
Autordolayoutgrficodomodelo:MirtoSilvioBusico<m.busico@ieee.org>
Autordotextoexplanatriodomodelo:GianlucaTurconi<luctur@openoffice.org>

11.2 Agradecimentos
ASunMicrosystems,IncpeloapoioparaacriaoedesenvolvimentodoOpenOffice.org.
A SunMicrosystems,Inc,maisumavez,peladisponibilizaodadocumentaosobrea
APIdoOpenOffice.org,semaqualestetrabalhonoseriapossvel.
A todos os voluntrios que, com os seus trabalhos, contribuem para o crescimento do
OpenOffice.org.
Aos coordenadores do OpenOffice.org Projeto Brasil, pela publicao da Introduo,
principalmente,aGustavoBuzzattiPacheco,peloapoioesugestes.
AIsmaelFanlopelatraduodaverso1destedocumentoparaoEspanhol.

11.3 Licena
permitidaacpia,distribuioe/oumodificaodestedocumento,sobostermosdaGNU
Free Documentation License, Version 1.1 ou uma verso posterior publicada pela Free
SoftwareFoundation.Umacpiadalicenaacompanhaestedocumento,consulteoarquivo
FDL.TXT.Sevocnorecebeuumacpiadestearquivo,porfavorinformeaoautorouao
webmasterdositequedisponibilizouestedocumento.
Copyright2003NoelsonAlvesDuarte.

Introduo ao OpenOffice.org Basic

151

Você também pode gostar