You are on page 1of 22

Delphi e OpenOffice(BROffice) - Parte 1 I - INTRODUO Vamos inicar um novo passeio; um passeio diferente, um passeio pelo mundo do software de cdigo

aberto. Abro esse artigo, no querendo dar a idia de que ser algo original. Mas de apresentar a idia da comunicao OLE entre aplicaes Delphi e a famlia de documentos BrOffice (ou OpenOffice - Writer, Calc, Base e Impress). Porque estou querendo dar nfase a essa idia? Simples! o Sistema da empresa onde trabalho, comunica-se tranquilamente com a famlia Microsoft Office, porm um de nossos clientes resolveu adotar a famlia BrOffice para sua empresa, e o mais cmico disso tudo, foi porque eu que os incentivei. Mas no tinha idia de que a parte da comunicao seria to complexa, mais complexa do que pegar e rodar uma macro no Office e rapidamente obter as propriedades que poderiam ser acessadas e as incorporar em nosso aplicativo. A minha idia no nem um pouco original, mas como falei, ela interessante porque nos remete a um novo aprendizado, e muitas vezes deixamos de implementar algo, j que a quantidade de informao rara ou, o trabalho cobrar suas dvidas em relao ao tempo perdido, tornando-o muito oneroso, tanto para sua empresa como para os clientes. Mas o mais importante de tudo tomar a iniciativa e seguir em frente. II REFERNCIAS Leio muitos artigos escritos em revistas de programao e sites relacionados ao Delphi e raramente vejo uma referncia dando crdito aos que nos ensinaram e que nos possibilitaram dar os pontaps iniciais no assunto; nesse caso, gostaria de ressaltar o documento escrito por Srgio Hernandes que est hospedado no site www.broffice.org e pode ser obtido no seguinte endereo: http://ooomacros.org/dev.php#133853. Uma segunda refernca que poder lhe dar uma luz o livro chamado: OpenOffice.org Macros Explained do escritor Andrew Pitonyak de 2004 (velho, mas todo que velho importante para nossas vidas). III - OBSERVAES IMPORTANTES No ser apresentado detalhes pertinentes ao uso dos aplicativos, isto , como salvar, abrir e editar arquivos ou executar comandos de compilao. Esses so pressupostos necessrios para os que esto interessados nesse assunto. IV PROBLEMAS No caso de encontrar erros nos procedimentos, favor relatar. No sou dono da verdade, portanto as crticas construtivas sero bem-vindas. No darei ateno para qualquer crtica rspida, pois trato todos com respeito. V APLICATIVOS Delphi 7 ou qualquer verso superior e tambm a Suite BrOffice - estou usando a verso 3.1 com o Builder 9420 - Instalao Padro. VI - DIREITOS DE CPIA Assunto autorizado somente para o site www.PlanetaDelphi.com.br. Esse contedo no pode ser copiado ou re-linkado sem prvia autorizao do seu autor ou do responsvel pelo site, nesse caso Sr. Felipe Monteiro. Toda a cpia e re-linkagem sem autorizao prvia e por escrito dos responsveis mencionados anteriormente, estaro sujeitas aos termos da lei de pirataria. Delphi e BrOffice Iniciando as aplicaes do pacote IMPORTANTE: sempre declarar na seo USES a Unit ComObj para todos os exemplos apresentados. Para que possamos executar as diversas aplicaes do pacote BrOffice, faremos uso basicamente de um procedimento chamado LoadComponentFromURL que recebe 4 parmetro e segue este formato: LoadComponentFromURL(sURL, sFrame, FlagDeBusca, Array); As tabelas abaixo,

apresentam os valores permitidos para cada um dos parmetros. Tabela 1 - URL String Primeiro Parmetro

Tabela 2 - Frames Segundo Parmetro

Flag de Busca - Terceiro Parmetro um valor constate que define o algoritmo que ser usado para encontra o quadro de destino. Use o valor 0 nesse parmetro para cancelar. Array Quarto Parmetro Nesse parmetro so passados parmetros para o descritor de mdia do arquivo, definindo diversar propriedades para o carregamento. Executando os diversos Frames - Criando o nosso primeiro aplicativo No esquea que o BROffice deve estar instalado. Nesse aplicativo, vamos simplesmente fazer com que o nosso programa execute um dos programas BROffice que o usurio desejar executar. Execute o Delphi, crie uma nova aplicao e no form adicione um componente radiogroup contendo os nomes das aplicaes (factorys) na propriedade itens, uma varivel pblica chamada aplicao e um boto. Conforme a figura abaixo.

Vamos escrever algum cdigo agora. No evento onClick do radiogroup edite o seguinte cdigo: view sourceprint? 01.Case RadioGroup1.ItemIndex of 02. 0 : Aplicacao := ''; 03. 1 : Aplicacao := 'private:factory/scalc'; 04. 2 : Aplicacao := 'private:factory/swriter'; 05. 3 : Aplicacao := 'private:factory/swriter/web'; 06. 4 : Aplicacao := 'private:factory/swriter/GlobalDocument'; 07. 5 : Aplicacao := 'private:factory/sdraw'; 08. 6 : Aplicacao := 'private:factory/smath'; 09. 7 : Aplicacao := 'private:factory/simpress'; 10. 8 : Aplicacao := 'private:factory/schart'; 11. 9 : Aplicacao := '.component:Bibliography/View1'; 12.end; Para o evento onClick do boto, edite o seguinte cdigo: view sourceprint? 01.procedure TForm1.Button1Click(Sender: TObject); 02.var 03. BrOffice, Desktop, Executar : Variant; 04.begin 05. if RadioGroup1.ItemIndex <> 0 then 06. begin 07. BrOffice := CreateOleObject('com.sun.star.ServiceManager'); //1 Linha 08. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop'); //2 Linha 09. Executar := Desktop.LoadComponentFromURL(Aplicacao, '_blank', 0, //3 Linha 10. VarArrayCreate([0,-1], varVariant)); 11. end; 12. 13. BrOffice := Unassigned; 14. Desktop := Unassigned; 15. Executar := Unassigned; 16. {Atente para as letras masculas e minsculas. Se a palavra frame por exemplo 17. for colocada em maiscula, uma exceo lhe ser apresentada.} 18.end; Vou fazer agora um pequeno detalhemento do que foi feito no evento onclick do boto. Veja que foram declaradas trs variveis do tipo Variant So elas: BrOffice, Desktop e Executar. A variant BROffice a inicializao, muito parecido com a chamada do Office, ao invs de chamar por exemplo 'Excel.Application' estar chamando um elemento chamado Service Manager do mdulo 'com.sun.star'. J a varivel Desktop criar uma instncia contendo os elementos comuns da plataforma; a varivel Executar ser encarregada de ser uma referncia a aplicao, isto quer dizer que, quando clicar no boto para executar o programa desejado, por exemplo o Calc, Executar ter todo o conjunto de mdulos pertinentes ao Calc, a partir dele, poderemos acessar as propriedades de Pastas, Planilhas e Clulas.

Por fim, vemos declaradas as trs variveis mencionadas anteriormente, porm recebendo a atribuio de Unassigned. Estamos somente limpando as variveis, mais nada. Download desta aula Delphi e BrOffice - Parte 1.rar At a prxima aula !!! Continuao - Delphi e OpenOffice(BROffice) - Parte 2 Trabalhando com Arquivos e Planilhas no Calc I REQUISITOS NECESSRIOS PARA O MDULO Ter entendido e treinado a verso do artigo apresentada como introduo. Delphi e OpenOffice(BROffice) - Parte 2 II OBJETIVOS Entender a dinmica de trabalho com planilhas e arquivos do Calc. Os principais cuidados para ter sucesso no processo de transferncia de dados OLE entre Delphi 7 e BrOffice. III IMPORTANTE Atente para os comandos, j que a linguagem case-sensitive. IV INICIANDO Vamos criar uma nova aplicao, e nela adiconaremos os seguintes componentes do Delphi: Um Edit, um SpinEdit, um StringGrid, um CheckBox, um ListBox e como no pode faltar, um boto. Deixo a formatao da tela para voc. Muitas vezes os tutoriais induzem a ter que fazer tudo dentro de uma certa configurao, eu no pretendo fazer isso agora. O que faremos nessa parte de nosso tutorial? Simples!! Atravs do spinedit, definiremos o nmero de planilhas que sero criadas em nossa aplicao, no edite o campo ndice do stringgrid, pois ele quem coloca as planilhas em ordem dentro da pasta (o mesmo que no Excel), a medida que o spinedit tem seu valor modificado o nmero de linhas incrementado ou decrementado e automaticamente gera os ndices. No campo do Edit voc poder escolher qualquer nome para o arquivo e o destino do arquivo. Quando iniciamos o processamento, podemos marcar a opo que verifica se j existe uma planilha com um dos nomes que estamos registrando (no podem haver duas planilhas com o mesmo nome na mesma pasta); e para finalizar, vamos capturar o nome das planilhas que registramos e seus respectivos ndices dentro da pasta.

Vamos inserir o cdigo em nosso sistema e iniciar as explicaes necessrias. Os eventos dos componentes esto com seus nomes sublinhados. view sourceprint? 01.procedure TForm1.FormShow(Sender: TObject); 02.begin 03. StringGrid1.Cells[0,0] := 'Indice'; 04. StringGrid1.Cells[1,0] := 'Nome da Planilha'; 05. SpinEdit1.OnChange(sender); 06.end; 07. 08.procedure TForm1.SpinEdit1Change(Sender: TObject); 09.var 10. x : Integer; 11.begin 12. If (SpinEdit1.Value = 1) then 13. begin 14. ShowMessage('Uma planilha deve estar presente obrigatoriamente na pasta'); 15. SpinEdit1.Value := 1; 16. StringGrid1.RowCount := 2; 17. end else begin 18. StringGrid1.RowCount := SpinEdit1.Value + 1; 19. For x := 1 to StringGrid1.RowCount do 20. StringGrid1.Cells[0,x] := Format('%d',[x - 1]); 21. end; 22.end; O evento onShow do formulrio simplesmente coloca os indices nas linhas quando a aplicao iniciada e atribui o nmero de linhas pelo evento onChange do SpinEdit1. Nada de phenomenal. O evento onChange do spinEdit1 tem um pequeno if limitando o nmero de planilhas existentes para um documento. Para que a pasta possa existir, ela necessita de pelo menos uma planilha. Vamos para a parte nervosa!!! view sourceprint? 01.procedure TForm1.Button1Click(Sender: TObject); 02. var 03. N, x : SHORT; 04. Remover : array[0..2] of String; 05. begin 06.

07. BrOffice := CreateOleObject('com.sun.star.ServiceManager'); 08. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop'); 09. Documento := Desktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0, 10. VarArrayCreate([0,-1], varVariant)); 11. 12. //Vai guardar o nome para excluir as planilhas originais na sequncia 13. For x := 0 to 2 do 14. Remover[x] := Documento.Sheets.getByIndex(x).Name; 15. 16. { Insere as planilhas nomeadas pelo usuarios, baseados no ndice de nosso 17. sistema } 18. For x := 1 to StringGrid1.RowCount - 1 do 19. begin 20. if CheckBox1.Checked then 21. begin 22. if not Documento.Sheets.hasByName(StringGrid1.Cells[1, x]) then 23. Documento.getSheets.insertNewByName(StringGrid1.Cells[1, x] , x - 1) 24. else 25. ShowMessageFmt('A planilha que voc inseriu com o nome de %s no ser criada' + #13 + 26. 'porque ela j existe na pasta!',[StringGrid1.Cells[1, x]]); 27. end else 28. Documento.getSheets.insertNewByName(StringGrid1.Cells[1, x] , x - 1); 29. end; 30. { remove as planilhas criadas automaticamente pelo sistema 31. veremos mais tarde como fazer a excluso ou renomear atravs de um mdulo 32. chamado de UNO } 33. For x := 0 to 2 do 34. Documento.getSheets.removeByName(Remover[x]); 35. 36. { Recupera novamente a quantidade de planilhas registrada ou inseridas e 37. apresenta o nome no ListBox } 38. N := Documento.getSheets.GetCount; 39. For x := 0 to Pred(N) do 40. lbNomes.Items.Insert(x, Format('Index da Plan: %d - Nome: %s', 41. [x, Documento.Sheets.getByIndex(x).Name])); 42. end; Vamos agora enteder o que foi programado. O primeiro bloco como podemos assim dizer, somente foi feita a declarao das variveis para criar os elementos do Broffice. No primeiro for lhe foi apresentado a seguinte situao: Documento.Sheets.getByIndex(x).Name; A varivel documento armazena as propriedades, funes e procedimentos relativos ao documento; avanamos para a propriedade da planilha (Sheets) e atravs da funo getByIndex capituramos o ndice da planilha dentro da pasta. Obviamente que a propriendade Name nos retornar o nome da planilha. O que fiz no foi pegar o nmero de planilhas na pasta, isso seria o mais correto, porm, como sabemos que a pasta sempre conter trs planilhas (a no ser que o miservel do usurio altere alguma configurao) ento no coletei esse valor. Mas esse procedimento seria o mais correto, capturar o nmero de planilhas de uma pasta e na sequncia obter seus nomes. No segundo for, iniciado o processo de inserir as planilhas que registramos no StringGrid. O que faz o CheckBox1? Ele questiona se o usurio deseja verificar se j existe o nome da planilha na pasta em que estamos trabalhando. Atravs da funo hasByName('NomeDaPlanilha') podemos verificar se ela j existe. uma funo simples e seu nico parmetro o nome da planilha. uma funo Boleana, se o nome existe, o retorno da funo True, caso contrrio, False obviamente! Como foi dito, atravs da funo hasByName verificamos se existe alguma planilha contendo o nome que passamos em nosso grid; se no existir, vamos usar uma funo nova chamada insertNewByName('NomeDaPlanilha', ndice). O primeiro parmetro da funo uma String e o segundo um valor Inteiro. Veja tambm que, um documento sempre ser um container para armazenar diversas folhas ou planilhas como sabemos. Assim getSheets() retornar todos os objetos de planilhas dentro da pasta. O ndice da funo insertNewByName sempre inicia do ZERO (0). O que estou querendo dizer , se quiser inserir uma nova planilha com o nome de 'Contabilidade', em uma pasta e que ela esteja na segunda folha, diminua o valor real menos 1 A primeira planilha tem o ndice Zero, a segunda Um, a terceira Dois e assim por diante.

Para remover uma planilha voc usar a funo removeByName('NomeDaPlanilha'), bem simples e seu parmetro uma String. Coloque o nome da planilha que deseja excluir e pronto. Em nosso exemplo, isso foi feito colocando os nomes em um array quando pressionamos o boto Executar Calc. No haveria necessidade de fazer isso, j que sabemos que sempre os nomes sero 'Planilha1', 'Planilha2' e 'Planilha3'. Logo o exemplo do primeiro for foi meramente ilustrativo conforme explicado inicialmente. Aumentando um pouco mais a complexidade!!!! No igual ao Excel.... O BrOffice uma ferramenta desenvolvida por diversos profissionais e seu objetivo e atender os diversos sistemas operacionais que esto presentes no mercado. Vamos para o segundo boto do nosso pequeno programa e que executa o comando salvar da planilha. Um detalhe importante e por isso fiz essa pequena introduo, quando salvamos um documento no BrOffice, devemos passar o caminho contendo um formato diferente, parecido com as plataformas Linux, voc sempre passar o caminho para salvar o arquivo no seguinte formato: 'file:///' + Pastas + NomeDoDocumento + extenso. Outro pequeno detalhe, as barras devem ser as barras de data e no as barras invertidas que so o padro Microsoft. Se voc pensar em salvar um arquivo em algo parecido com: C:\Meus Documentos\Minha Pasta\Subpasta\MinhaPlanilha.odt, dever converter isso para: file:///C:/Meus Documentos/Minha Pasta/Subpasta/MinhaPlanilha.odt e por esse motive inserimos a funo TranformaDeCaminhoParaURL. Veja a sua declarao em nosso pequeno sistema: view sourceprint? 1.function TForm1.TranformaDeCaminhoParaURL(nomeArq: String): String; 2.var 3. NomeFile : String; 4.begin 5. NomeFile := LowerCase(nomeArq); 6. if (Pos('file:///', NomeFile) = 0) then 7. result := 'file:///' + StringReplace(NomeFile, '\', '/', [rfReplaceAll, rfIgnoreCase]); 8.end; Deixo na sua responsabilidade de fazer as verificaes da existncia do arquivo e da pasta. No irei tratar de detalhes reais de um programa. Como falei, para que voc salve um arquivo do Calc necessrio alterar a formato de definio do caminho. O BrOffice sempre passa a idia para esse tipo de coisa como se fosse um endereo URL, logo, sempre que vocs ver URL em um parmetro j saber o que mais ou menos est sendo exigido. Sigamos agora para os eventos do segundo boto. view sourceprint? 01.procedure TForm1.Button2Click(Sender: TObject); 02.var 03. Valores : Variant; 04. Destino : String; 05.begin 06. Destino := TranformaDeCaminhoParaURL(Edit1.Text); 07. Valores := VarArrayCreate([0,0], varVariant); 08. Valores[0] := AtribuirValores('Overwrite',true); 09. Destino := Destino + '.ods'; //Extenso da planilha do broffice 10. Documento.storeAsURL(Destino, Valores); 11.end; A varivel Valores muito interessante e ela lhe dar acesso a um grande universo; essa varivel ela faz referncia a dois parmetros um chamado Name e outro chamado Value. Passa a idia de um array multidimensional, algo como Teste[0][0] e Teste[0][1], a funo VarArrayCreate cria um array de variantes, sendo ento o primeiro parmetro o tamanho do array e o segundo, o tipo de valores registrados no array. Se voc usar VarArrayCreate([0, 4], varInteger) estar fazendo uma referncia a algo assim: view sourceprint? 1.Elementos := VarArrayCreate([0,4], varInteger); 2.Elementos[0] := 1; 3.Elementos[1] := 2; 4.Elementos[2] := 100;

5.Elementos[3] := 1000; 6.Elementos[4] := 10000; O que foi feito ento em nosso boto: Criamos o array e informamos que ele conter um nico valor. Na sequncia temos a seguinte declarao: Valores[0] := AtribuirValores('Overwrite', true); Essa funo tambm foi criada e adicionada no parte inicial do nosso pequeno programa, e est registrada da seguinte forma: view sourceprint? 01.function TForm1.AtribuirValores(Nome, Valor : Variant): Variant; 02.var 03. Reflec : Variant; 04.begin 05. Reflec := BrOffice.createInstance('com.sun.star.reflection.CoreReflection'); 06. Reflec.forName('com.sun.star.beans.PropertyValue').createObject(result); 07. result.Name := Nome; 08. result.Value:= Valor; 09.end; Essa funo no foi criada por mim, mas est presente naquele documento menciaonado em nossa primeira lio. Essa funo cria uma instncia do Core do BrOffice e atribuir propriedades de valor. Voc usar muito essa funo, porque podemos atribuir os elementos de formatao de clulas e at mesmo salvar arquivos usando a estrutura UNO que veremos mais adiante. Ao usarmos a funo, atente que estamos definindo a atribuio de propriedades para o elemento ZERO Valores[0] e estamos dizendo o seguinte Valores[0][Name] := 'Overwrite' e Valores[0][Value] := true; Veja que isso somente uma representao. Isto feito, avanamos para o procedimento storeAsUrl(URL, Array); e fizemos ento: view sourceprint? 1.Documento.storeAsURL(Destino, Valores); Salva o documento na pasta especificada e dentro daquele padro que modificamos e exigido pelo BrOffice. E ento o array chamado Valores e dizendo que se existir um arquivo com o mesmo nome no local que estamos salvando ele ser sobreescrito. O recomendvel sempre fazer AtribuirValores('Overwrite', false). Isso o recomendvel. Um pequeno detalhe, estamos trabalhando com arquivos do tipo BrOffice, ento adicionei ao endereo a extenso para o arquivo tipo '.ODS' que o padro de extenso. Download O cdigo fonte se encontra anexado a este artigo. Baixe-o se achar necessrio.\ Delphi e BrOffice - Parte 2.rar At o prximo passo! Continuao - Delphi e OpenOffice(BROffice) - Parte 3 ALCANANDO AS CLULAS NO CALC I REQUISITOS necessrio ter acompanhado os dois mdulo anteriores j que apresentam o contedo introdutrio do assunto. II INTRODUO Como pudemos observar na segunda parte desse artigo, acessamos planilhas, salvamos com os nomes desejados, exclumos e inserimos planilhas. A idia bsica sempre abordarmos as partes mais externas e assim, ir avanando para as "entranhas". Bem, chegamos numa das partes mais importantes de nosso artigo cito como mais importante, porque sempre fazemos a parte da formatao quando exportamos os dados para uma planilha ou para um documento de texto. Nossos clientes adoram, mas muitas vezes no tem noo da complexidade existente para que a tarefa seja executada.

O que veremos nesse momento de nosso artigo? Faremos acesso as clulas e adiconaremos as respectivas formataes: fonte, cor da clula, tamanho da clula, alinhamento, quebra de texto, borda e angulo de inclinao de nosso texto. Ser necessrio iniciarmos tudo do zero sendo que a parte prinicpal das chamadas OLE podem ser devidamente copiadas dos mdulos anteriores. As clulas no BrOffice seguem o mesmo padro de nomenclatura do Excel, isto , nome da Coluna e nome da Linha. Na parte da programao, voc pode fazer referncia ao nome da clula ou aos ndices da Coluna e Linha; deixando mais claro, poderemos tanto usar a referncia da clula pelo processo normal (A2, B5, C6, AJ38) ou ainda por ndices (0,0 = A1, 4,2 = E3). Porm um detalhe importante deve ser posto: as referncias de nome (A2, B5 e etc) so facilmente acessadas com o mdulo UNO, sem ele, o acesso se d facilmente usando o mtodo getCellByPosition(Col, Row). O Nosso exerccio quando finalizado dever estar parecido mais ou menos com a tela apresentada abaixo:

III CODIFICANDO O que faremos a partir de agora, ser adicionarmos contedo a nossa planilha. O que estou fazendo de diferente, somente declarar as variveis do tipo variant como pblicas, devido a facilidade de executar as coisas mais facilmente. At porque o escopo de visualizao de variveis, funes e mtodos no esto sendo avaliadas nesse momento. Isso caber exclusivamente a voc. Na parte inicial de nosso sistema, defini as seguintes variveis: view sourceprint? 1.var 2. Form1: TForm1; 3. 4. BrOffice, Desktop, Documento : Variant; 5. Planilha, Celula : Variant; Declaramos tambm as unit ComObj e ShellAPI. A justificativa se d que a unit ComObj nos d o acesso aos objetos OLE, j a ShellAPI simplesmente foi adicionada com a inteno de capturar os nomes das fontes do sistema, para que a partir dai, pudssemos aplicar na formatao de nossa planilha. Nada de mais at agora. Em nossa pequena aplicao temos somente um boto, ele aplicar a mesma formatao a todos os valores das clulas e bordas que forem utilizados. Veja a primeira parte do evento onClick do boto:

view sourceprint? 01.procedure TForm1.Button1Click(Sender: TObject); 02.var 03. X, Y : SHORT; 04. Valor : String; 05.begin 06. BrOffice := CreateOleObject('com.sun.star.ServiceManager'); 07. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop'); 08. Documento := Desktop.LoadComponentFromURL('private:factory/scalc', 09. '_blank', 0, VarArrayCreate([0,-1], varVariant)); 10. 11. Planilha := Documento.getSheets.getByName('Planilha1'); 12. : Variant; Desta vez modificamos um pouco a chamada a forma como capituramos o nome da planilha, usamos um mtodo chamado getByName(Nome da Planilha), o pressuposto que o desenvolvedor saber quais planilhas esto presentes em sua pasta. Informamos ento que estaremos trabalhando com a primeira folha chamada Planilha1. Um pouco mais abaixo, como aparece no cdigo seguinte, declaramos dois laos For, porm no segundo lao, encontramos a seguinte atribuio Clula := Planilha.getCellByPosition(X, Y), onde: X representa a coluna e Y a linha. Preste a ateno para esse mtodo, pois atravs dele, poderemos obter ou atribuir valores, funes e formatao para as clulas. Um outro ponto importante a ressaltar que, voc no usar o mtodo dessa forma getCellByPosition('A', 1) isso est errado, sempre dever utilizar getCellByPosition(0, 0); essa referncia diz que estamos trabalhando com a clula A1. view sourceprint? 1.For X := cbIni.ItemIndex to CbFim.ItemIndex do 2.begin 3. For Y := 0 to Pred(SpinEdit1.Value) do 4. begin 5. Celula := Planilha.getCellByPosition(X, Y); timo, j sabemos como podemos trabalhar com as linhas e colunas, fica mais fcil ainda iniciar o processo de insero de valores em nossas clulas. Veja a sequncia de cdigo e encontramos a seguinte declarao: Celula.setString(' Aqui vai uma String'). Por padro, quando digitamos uma String em uma clula tanto no Excel como no Scalc, os valores ficam alinhados a esquerda. Para que possamos inserir valores numricos por exemplo, usaremos quase o mesmo mtodo, somente trocando de setString para setValue. Tudo igual, somente muda os valores que est sendo inserido. view sourceprint? 1.if rbTipo1.Checked then 2.begin 3. Valor := cbIni.Items.Strings[X] + IntToStr(Y + 1); 4. Celula.setString(Valor); 5.end else begin 6. Valor := IntToStr(RandomRange(-123456789, 123456789)); 7. Celula.setValue(Valor); 8.end; Nesse momento entramos nos demais elementos de formatao de Clulas. A propriedade CharFonteName onde definimos o nome da fonte que iremos trabalhar para a clula, ela recebe um valor do tipo String. Em nossa aplicao, criamos duas pequenas funes, para justamente adicionar no ComboBox2 os nomes da fontes encontrada em nosso sistema. Voc poderia usar um FontDialog para obter as propriedades de nome, tamanho, cor e estilo; isso poderia lhe trazer um certo problema, principalmente relacionados a cor, sublinhado e Estilo. A propriedade CharHeight recebe um valor inteiro e define o tamanho da fonte. As duas funes que adicionam os nomes de fontes dentro do ComboBox2 so: view sourceprint? 01.function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric; 02. FontType: Integer; Data: Pointer): Integer; stdcall; 03.begin 04. TStrings(Data).Add(LogFont.lfFaceName); 05. Result := 1;

06.end; 07. 08.procedure TForm1.CapturarNomesDeFontes; 09.var 10. DC: HDC; 11.begin 12. DC := GetDC(0); 13. EnumFonts(DC, nil, @EnumFontsProc, Pointer(ComboBox2.Items)); 14. ReleaseDC(0, DC); 15. ComboBox2.Sorted := True; 16. ComboBox2.ItemIndex := 0; 17.end; Essas funes esto presentes no exemplo do arquivo de ajuda do Delphi nome: RichEdit. view sourceprint? 1.//Nome da Fonte 2.Celula.CharFontName := ComboBox2.Text; 3. 4.//Tamanho da Fonte 5.Celula.CharHeight := StrToInt(Edit1.Text); A parte do alinhamento, tanto o horizontal como o vertical, podem ser definidos atravs das propriedades HoriJustify e VertJustify. Atente que elas apresentam diferenas de constates de uma para outra. Para HoriJustify, temos: STANDARD : o alinhamento padro tanto para nmeros como para textos, sendo a esqueda para as strings e a direita para os nmeros; LEFT : o contedo alinhado no lado esquerdo da clula; CENTER : o contedo alinhado no centro da clula; RIGHT : o contedo alinhado no lado direito da clula; BLOCK : o contedo alinhando em relao ao comprimento da clula; REPEAT : o contedo repetido dentro da clula para preench-la.

Para VertJustify, temos: STANDARD : o valor usado como padro; TOP : o contedo da clula alinhado pelo topo; CENTER : o contedo da clula alinhado pelo centro; BOTTOM : o contedo da clula alinhado pela base.

Como poder observar no cdigo fonte dessa aplicao, ver que para HoriJustify estamos usando respectivamente os seguintes valores: 0, 1, 2, 3, 4 e 5. J para as definies de VertJustify estou usando os valores: 0, 1, 2 e 3. Se a programao se der dentro do ambiente de macros do BrOffice, deveremos usar as constantes sendo obedecidos os mdulos em que so declarados. Diferentemente do que fazemos aqui onde emitimos os valores da indexao dos valores. view sourceprint? 1.//Alinhamento Horizontal 2.Celula.HoriJustify := RetornaValorDoCombobox('-', ComboBox3); 3. 4.//Alinhamento Vertical 5.Celula.VertJustify := RetornaValorDoCombobox('-', ComboBox4); Para os sublinhados, temos 18 (dezoito) tipos diferentes, e podem ser definidos como: 0 1 2 3 None // Sem sublinhado. Single // linha simples. Double // linha dupla. Dotted // linha pontilhada.

4 - DontKnow // Sublinhado desconhecido. 5 - Dash // linha tracejada. 6 - LongDash // traos longos. 7 - DashDot // trao e ponto sequenciados. 8 - DashDotDot // trao, ponto, ponto sequencia. 9 - SmallWave // Ondas pequenas. 10 - Wave // Em onda. 11 - DoubleWave // Em ondas duplas. 12 - Bold // linha em negrito. 13 - BoldDotted // pontos em negrito. 14 - BoldDash // traos em negrito. 15 - BoldLongDash // Traos longo em negrito. 16 - BoldDashDot // Trao, ponto e sequencia em negrito. 17 - BoldDashDotDot // Trao, ponto, ponto, sequencia em negrito. 18 - BoldWave // onda Negritada....

Para atribuir um tipo de sublinhado a sua fonte, use a propriedade CharUnderline, atribuindo um dos valores apresentados acima. view sourceprint? 1.//Tipo de Sublinhado 2.Celula.CharUnderline:= RetornaValorDoCombobox('-', ComboBox5); Para atribuirmos itlico, usamos a propriedade CharWeight e esto disponveis as seguintes contantes, conforme a lista abaixo: 0 - Dontknow = Camera / desconhecido. 50 - Thin = 50% do peso da fonte. 60 - UltraLight = 60% do peso da fonte. 75 - Light = 75% do peso da fonte. 90 - SemiLight = 90% do peso da fonte. 100 - Normal = 100% peso da fonte normal (100%). 110 - SemiBold = 110% do peso da fonte. 150 - Bold = 150% do peso da fonte. 175 - UltraBold = 175% do peso da fonte. 200 - Negro = 200% do peso da fonte

view sourceprint? 1.//Tipo de Itlico 2.Celula.CharWeight := RetornaValorDoCombobox('-', ComboBox6); At esse momento de nossa codificao, tudo vai de "vento em popa", porm quando falamos de cores, tanto para background das clulas, como para bordas e o contedo, a coisa muda um pouco. Podemos definir cores usando uma funo no Delphi definida como RGB(Red, Green, Blue), podendo em cada parmetro, receber um valor Short de 0 a 255. Porm, se executarmos a seguinte atribuio a uma cor no BrOffice, algo do tipo RGB(123, 066, 222), bem provvel que a cor apresentada, no seja aquela esperada. Porque isso acontece? Aqui vai uma explicao simples: porque o valor utilizado para representar uma cor no BrOffice compreendido como um nico nmero inteiro. Em cdigo pascal, poderamos dar como exemplo, o seguinte: view sourceprint? 1.Var 2. vRed : Short; //Valor entre 0 e 255 3. vGree: Short; //Valor entre 0 e 255 4. vBlue: Short; //Valor entre 0 e 255 5. vColorBR : Integer; //Valores podem variar em 16, 577 e 320 Ento, para facilitar ainda mais sua vida, voc poder usar uma das seguintes cores indexadas e conforme so apresentadas em nossa aplicao num pequeno grid de 10 X 11. Utilizando os valores aqui listados, no h erro. O Excel tambm trabalha com uma indexao de cores, porm

se voc usar o RGB as cores sairo dentro do que voc estava prevendo. No podemos dizer o mesmo para o BrOffice.

Para atribuir uma cor de fonte use a propriedade CharColor, e para o Background utilize a propriedade CellBackColor , para ambos, atribua um dos valores da tabela acima. view sourceprint? 1.//Cor da Fonte 2.Celula.CharColor := RetornaValorDoCombobox('-', ComboBox7); 3. 4.//Cor do Background da Clula 5.Celula.CellBackColor:= RetornaValorDoCombobox('-', ComboBox1); Entendido os problemas relacionados as cores e obviamente que sanadas as dvidas, voltemos a parte light da coisa. Se estiver interessado em rotacionar o texto dentro de uma clula, utilize as propriedades RotateReference e RotateAngle. A propriedade mais importante realmente RotateAngle. Voc pode fazer a atribuio como o exemplo do cdigo nessa sequncia. Onde multiplicamos o valor por 100. A propriedade aceita valores iguais ou maiores a 0,01. Eis o motivo de eu fazer a multiplicao por 100. Para um ngulo de 45, ficaria a seguinte definio por exemplo: Celula.RotateAngle := 4500; // 45 * 100. A propriedade RotateReference utilizada como referncia para a partida da rotao do contedo. Pode ser o valor 0 (ZERO) para a partir da base, 1 para partir do topo e 2 para partir do centro da clula. view sourceprint? 1.//Permite rotacionar o contedo da clula 2.if Rotacionar.Checked then 3.begin 4. Celula.RotateReference := RadioGroup1.ItemIndex; 5. Celula.RotateAngle := StrToInt(Edit2.Text) * 100;

6.end; Para quebrar o contedo do texto, defina a propriedade IsTextWarapped para True. uma propriedade booleana, portanto, aceitar somete true ou false. view sourceprint? 1.//Quebrar o contedo da Clula 2.if cbQuebrar.Checked then 3. Celula.IsTextWrapped := True; As bordas da clulas podem conter formataes diferentes, isto , podemos formatar a borda superior com espessura e cor diferente da borda inferior, assim como a borda da esquerda totalmente diferente da direita. O processo de formatao da borda tem muito mais recursos quando trabalhamos com as estruturas UNO, como veremos mais adiante. A atribuio da formatao das bordas usa na verdade, uma estrutura do mdulo table e que por consequncia, utiliza uma outra tabela onde definimos as especificaes para cor, espessura da borda interna e externa e a distncia entre elas. Para que voc possa formatar as bordas de suas clulas, ser necessrio usar a funo AtribuirBordas, Essa funo parecida com aquela que criamos nas segunda parte para podermos salvar nossos arquivos. view sourceprint? 01.function TForm1.AtribuirBordas(Cor, EspLinInter, EspLinExter, 02. DistLinha : Variant): Variant; 03.var 04. otherRef : Variant; 05.begin 06. otherRef := BrOffice.createInstance('com.sun.star.reflection.CoreReflection'); 07. otherRef.forName('com.sun.star.table.BorderLine').createObject(result); 08. result.Color := Cor; 09. result.InnerLineWidth := EspLinInter ; 10. result.OuterLineWidth := EspLinExter; 11. result.LineDistance := DistLinha; 12.end; Como pode ser visto, estamos utilizando o mdulo BorderLine. o que fazemos ento atribuindo a propriedade relativa a cada clula. Veja que atribuimos a Celula.TopBorder := AtribuirBordas(...... Estamos dizendo que a borda superior ter a configurao passada em seus parmetros. Esses parmetros podem ser diferentes para cada borda desejada. Se voc quiser somente que as bordas superiores e inferiores apaream, atribuia as propriedades somente a essas duas bordas e esquea as demais. view sourceprint? 01.//Formatao das bordas das Clulas 02. if bSup.Checked then 03. Celula.TopBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8), 04. StrToInt(Edit4.Text), 05. StrToInt(Edit5.Text), 06. StrToInt(Edit6.Text)); 07. if bEsq.Checked then 08. Celula.LeftBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8), 09. StrToInt(Edit4.Text), 10. StrToInt(Edit5.Text), 11. StrToInt(Edit6.Text)); 12. if bDir.Checked then 13. Celula.RightBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8), 14. StrToInt(Edit4.Text), 15. StrToInt(Edit5.Text), 16. StrToInt(Edit6.Text)); 17. if bInf.Checked then 18. Celula.BottomBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8), 19. StrToInt(Edit4.Text), 20. StrToInt(Edit5.Text), 21. StrToInt(Edit6.Text)); 22. 23. end;

24. end; 25.end; Estimados amigos, na sequncia vamos nos aprofundar ainda mais em nossas planilhas. Novamente volto a frizar que se erros ou inconscistncias ocorrerem, enviem-me um printscreen da tela e se possvel o cdigo fonte para que possa analisar e buscar as respecitvas solues. Gostaria tambm de acrescentar que isso tudo fruto de testes e mais testes, portanto podem haver outras variantes de cdigo que realizam a mesma tarefa de forma mais complexa ou mais simples. Cdigo fonte acompanha este exerccio. Delphi e BrOffice - Parte 3.zip Continuao - Delphi e OpenOffice(BROffice) - Parte 4 CLULAS Formataes Adicionais I INTRODUO No artigo anterior tivemos o privilgio de formatar as clulas dentro de um padro desejado. Nesse momento, vamos avanar para algumas questes ainda relacionadas com a formatao das clulas. A parte da inicializao j conhecida. O que gostaria de atentar aqui o seguinte: o usurio deve primeiro criar o documento pressionando o boto 1 passo Executar o Scalc. O cdigo desse boto est definido da seguinte forma: view sourceprint? 1.procedure TForm1.Button1Click(Sender: TObject); 2.begin 3. BrOffice := CreateOleObject('com.sun.star.ServiceManager'); 4. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop'); 5. Documento := Desktop.LoadComponentFromURL('private:factory/scalc', 6. '_blank', 0, VarArrayCreate([0,-1], varVariant)); 7. Planilha := Documento.getSheets.getByName('Planilha1'); 8.end;

As variveis esto definidas como pblicas para que possamos us-las em toda a aplicao. Vamos ento iniciar a continuao da formatao. Codificaremos a mesclagem de clulas. No incomum adicionar uma clula contendo um texto que seja um detalhamento de informaes, algo como: ABCDE Sistema de Automao Comercial Relatrio SPED para Contabilidade e para finalizar, um tom de cinza no fundo. A mesclagem exige duas clulas ou mais e pode estar dentro de um intervalo do tipo A2:F2 ou ainda A2:A10; podemos ento executar essa tarefa na horizontal ou vertical, ou em ambos os casos, onde define-se o intervalo B5:G15. Vejamos: view sourceprint? 1.procedure TForm1.Button2Click(Sender: TObject); 2.begin 3. Faixa := Planilha.getCellRangeByPosition(StrToInt(e1.Text), StrToInt(e2.Text), 4. StrToInt(e3.Text), StrToInt(e4.Text)); 5. Faixa.merge(true); 6.end; A varivel Faixa do tipo Variant, no poderia ser diferente nesse momento. O comando simples e exige que se tenha quatro valores, ao invs de usarmos getCellByPosiotion onde temos somente uma clula, definiremos o comando como getCellRangeByPosition(Col_Ini, Row_Ini. Col_fim, Row_Fim) . Tambm importante ressaltar que ao executar o Calc estou selecionando sempre a primeira planilha. Para completar nosso comando, executamos o mtodo Merge(boolean). E a mgica est feita. Em nosso exemplo, voc poder fazer a mesclagem diversas vezes, bastando para isso, mudar os valores e pressionar o boto mesclar clulas. Quando o usurio do Excel digita um valore muito extenso, o contedo da clula passa a ser representado por cerquihas (#), no BrOffice a mesma coisa, s que no to enftico com o Excel que preenche a clula inteira com cerquilhas. Eu nunca prestei muita ateno no Excel com relao a essa questo do ajuste de largura, sempre que terminava a insero de dados nas colunas mandava que a cada clula preenchida, o comando AutoFit fosse executado. O Calc usa um comando chamado OptimalWidth. um mtodo booleano. Em nosso exemplo, vamos trabalhar

com o ajuste de largura para todas as colunas da planilha ou somente para a coluna desejada. O seguinte comando foi registrado no boto Ajuste a Coluna. view sourceprint? 01.procedure TForm1.Button3Click(Sender: TObject); 02.var 03.x : short; 04.begin 05. Texto[0] := 'Escrevendo um texto grande'; 06. Texto[1] := 'Luis Fernando Verssimo'; 07. Texto[2] := 'The Amazing Race'; 08. Texto[3] := 'Repblica Federativa dos Estados Unidos do Brasil'; 09. Texto[4] := 'Um bilho de Cruzeiros'; 10. 11. if RadioButton1.Checked then 12. Planilha.columns(SpinEdit1.Value).OptimalWidth := True 13. else begin 14. For x := 0 to 4 do 15. begin 16. Celula := Planilha.getCellByPosition(x, x + 1); 17. Celula.setString(Texto[x]); 18. end; 19. Documento.getSheets.getByName('Planilha1').getColumns.OptimalWidth := True; 20. end; 21.end; O array Texto somente para preencher as clulas com um contedo relativamente extenso. Mas no primeiro if encontramos a atribuio: Planilha.columns(SpinEdit1.Value).OptimalWidth := True. Todas as planilhas possuem uma propriedade columns(Indice) que faz referncia a uma coluna. Ento acessamos o membro e definimos o ndice. A propriedade OptimalWidth definida para True. Se o usurio de nossa aplicao escolher ajustar os tamanhos de todas as colunas da planilha, o valor da varivel array Texto ser inserida em 5 colunas diferentes atravs do for. Mas na seqncia de nosso cdigo quem far o ajuste de todas as colunas. O cdigo Planilha.getColumns.OptimalWidth := True; Para que o ajuste fosse feito em todas as colunas da planilha, usamos o mtodo getColumns que retorna todas as colunas e atribumos ento OptimalWidth e pronto. Esse comando interessante porque ao invs de fazermos tudo individualmente, faz-se uma vez s e o efeito recai sobre todas as colunas. Ainda tratando do tamanho de uma clula, podemos ajustar a largura da coluna ou a altura da linha, no esquea que quando fazemos isso, a coluna desde a primeira linha at a ltima ficar com a mesma largura, o mesmo diz respeito a linha. Vejamos ento a terceira parte que est relacionada as dimenses em nossa aplicao. Para podermos aumentar ou diminuir as dimenses de uma clula usaremos os membros novamente da planilha, nesse caso, getColumns e getRows. O mtodo getColumns retorna todas as colunas de uma planilha e getRows retorna todas as linhas. Como consequncia usamos um segundo mtodo para informar qual das linhas ou colunas iremos alterar atravs de getByIndex(Indice) e ento as propriedades width e height. Ambas, recebem um valor inteiro em centsimos de milmetros (1/100 mm). view sourceprint? 01.procedure TForm1.Button5Click(Sender: TObject); 02.begin 03. Planilha.getColumns.getByIndex(cbIni.ItemIndex).width := StrToInt(Edit1.Text); 04.end; 05. 06.procedure TForm1.Button6Click(Sender: TObject); 07.begin 08. Planilha.getRows.getByIndex(SpinEdit2.Value - 1).height := StrToInt(Edit2.Text); 09.end; Usando o Excel como referncia mais uma vez, quando estamos exportando valores para uma planilha, acabamos aproveitando para definir a mscara como o valor da clula ser apresentado. Faramos algo do tipo: Selection.NumberFormat := '$#,##0.00'. No BrOffice no ser diferente, ser usado a mesma propriedade. Veja a seguir: view sourceprint?

01.procedure TForm1.Button4Click(Sender: TObject); 02.var 03. i : Integer; 04. cel : variant; 05.begin 06. for i := 0 to 1000 do 07. begin 08. Cel := Planilha.getCellByPosition(1, i); 09. Cel.setValue(i); 10. Celula := Planilha.getCellByPosition(0, i); 11. Celula.setValue(i); 12. Celula.NumberFormat := i; 13. end; 14.end; Existe uma recomendao, infelizmente no lembro quem agora fez a meno do limite que numberFormat poderia alcanar, mas que um valor confortvel estaria at mil, e eis o motivo do porque que meu lao for foi definido at esse valor. O que fao nesse processo colocar o valor da varivel i na coluna A e aplicar uma mscara atravs do mtodo NumberFormat. Atente que o formato da clula passa a ser relativo ao contador do lao for I. Fao isso, simplesmente para coletar os formatos disponveis (formatos padro) e que podero ser aplicados em qualquer situao. Na caixa de texto adicionada ao nosso programa, voc encontrar a forma e o ndice para NumberFormat. Existe uma forma alternativa de verificar se existe uma mscara que voc precisa trabalhar, se ela no existir poder ser adicionada nessa listagem, mas no nosso foco no momento. A visibilidade de uma coluna pode ser aplicada de uma forma bastante simples, para isso estaremos trabalhando com o mtodo IsVisible que recebe um valor booleano. O cdigo abaixo dispensa qualquer explicao j que foi detalhado at o mtodo getByIndex. Defina o ndice da coluna e atribua True ou False. view sourceprint? 1.procedure TForm1.Button7Click(Sender: TObject); 2.begin 3. if rbInv.Checked then 4. Planilha.getColumns.getByIndex(ComboBox1.ItemIndex).isVisible := False 5. else 6. Planilha.getColumns.getByIndex(ComboBox1.ItemIndex).isVisible := True; 7.end; Para encerrarmos essa paste de nossos estudos com chave de ouro, vamos adicionar cabealho e rodap a nossa planilha. Gostaria de ressaltar que, deve ter pelo menos um valor em qualquer clula para que o cabealho ou rodap possam ser visualizados em sua folha de impresso ou at mesmo em sua visualizao de impresso. O cabealho e rodap do BrOffice possui o mesmo sistema do Excel: separado em 3 faixas a esquerda, a direita e centralizado na pgina. Na sequencia, veja os cdigos definidos para a insero desses elementos em nosso documento: view sourceprint? 01.//Insere o cabealho na planilha 02.procedure TForm1.Button8Click(Sender: TObject); 03.var 04. Estilo, Padrao, Cabecalho : Variant; 05.begin 06. Estilo := Documento.StyleFamilies.getByName('PageStyles'); 07. Padrao := Estilo.getByName('Default'); 08. Padrao.HeaderIsOn := True; 09. Cabecalho := Padrao.RightPageHeaderContent; 10. Case rgAlign.ItemIndex of 11. 0 : Cabecalho.LeftText.setString(Edit3.Text); 12. 1 : Cabecalho.CenterText.setString(Edit3.Text); 13. 2 : Cabecalho.RightText.setString(Edit3.Text); 14. end; 15. Padrao.RightPageHeaderContent := Cabecalho; 16.end; 17.

18.//Insere o rodap na planilha 19.procedure TForm1.Button9Click(Sender: TObject); 20.var 21. Estilo, Padrao, Rodape : Variant; 22.begin 23. Estilo := Documento.StyleFamilies.getByName('PageStyles'); 24. Padrao := Estilo.getByName('Default'); 25. Padrao.FooterIsOn := True; 26. Rodape := Padrao.RightPageFooterContent; 27. Case rgAlign1.ItemIndex of 28. 0 : Rodape.LeftText.setString(Edit4.Text); 29. 1 : Rodape.CenterText.setString(Edit4.Text); 30. 2 : Rodape.RightText.setString(Edit4.Text); 31. end; 32. Padrao.RightPageFooterContent := Rodape; 33.end; Tanto para o cabealho como para o rodap foram utilizadas as mesmas variveis (Estilo e Padrao). Essa parte do sistema poderia ficar relativamente mais curta, j que a varivel Estilo receber o estilo sendo usado atualmente em seu documento. Na varivel Padro aplicado o estilo chamado Default. Podem ser criados estilo diferentes de acordo com cada usurio. Se for usar um outro estilo, verifique os nomes dos estilos existentes. O que que muda do Cabealho para o Rodap? Olhe a terceira linha de cada um dos eventos, para o cabealho temos Padrao.HeaderIsOn, essa uma propriedade booleana e informa que ser aplicado o cabealho; para o rodap usaremos Padrao.FooterIsOn. Na quarta linha de cada um dos cdigos vemos a seguinte atribuio: Cabecalho := Padrao.RightPageHeaderContent; e Rodape := Padrao.RightPageFooterContent; As variveis cabealho e rodap recebem as caractersticas, as informaes j contidas ou atribudas anteriormente. Na seqncia, o Case verifica o tipo de alinhamento definido pelo usurio, que poder ser: a esquerda, a direita e centralizado, sendo LeftText, CenterText e RightText. E obviamente o contedo que uma string, passada por setText(String contendo o texto). E finalizando, inserimos efetivamente as informaes atravs da atribuio da linha de comando Padrao.RightPageHeaderContent := Cabecalho; e Padrao.RightPageFooterContent := Rodape; um jogo de enviar e receber propriedades. Espero que at esse momento essas informaes tenham lhe sido teis. Nos prximos passos avanaremos para frmulas, ordenaes, criao de macros, impresso, margens e etc. Se desejar baixar o cdigo fonte: Delphi e BrOffice - Parte 4.rar Abraos e at o prximo mdulo. Continuao - Delphi e OpenOffice(BROffice) - Parte 5 CLULAS Usando Funes ou definindo frmulas I INTRODUO Em nosso ltimo artigo, vimos como configurar uma clula em suas diversas propriedades, tais como: visibilidade, formato, mesclagem, largura e altura. Vimos tambm a parte do cabealho e rodap da nossa planilha. Agora, vamos partir para a questo de como trabalhar com frmulas e funes. As chamadas para o aplicativo j so de seu conhecimento e entendo que no h mais necessidade de enfocar, portanto, se voc no acompanhou as explicaes anteriores, recomendo que volte um ou dois tutoriais para poder prosseguir nessa 5 parte. II ATRIBUINDO FUNES OU FRMULAS At nosso ltimo tutorial no tratamos de como fazer o processo mais importante: executar operaes de clculo no CALC. Formatar somente um recurso visual que ajuda na visualizao dos dados prontos para nossos usurios. A parte do clculo muito simples. Vejamos no cdigo abaixo:

view sourceprint? 1.procedure TForm1.btExecutarClick(Sender: TObject); 2.begin 3. AtribuirVariaveis; 4. Planilha.getCellByPosition(0,0).Value := StrToFloat(A1.Text); //A1 5. Planilha.getCellByPosition(0,1).Value := StrToFloat(A2.Text); //A2 6. Planilha.getCellByPosition(0,2).Value := StrToFloat(A3.Text); //A3 7. Planilha.getCellByPosition(0,3).Formula := F1.Text; 8.end; A diferena bsica apresentadas nos tutoriais anteriores que agora estamos dizendo que trabalhamos com valores atravs da atribuio Planilha.getCellByPosition(0,0).Value. Para que um clculo seja executado definido ao invs de value o atributo Formula. No confunda com uma funo. O BROffice possui uma lista das funes mais utilizadas, no as confunda com as frmulas que voc cria. Nesse segundo momento, vamos verificar como usar as funes. Um detalhe importante eu devo deixar claro, se voc tentar aplicar as funes usando o nome em portugus, algo como: SOMA(X:Y), MULT(X:Y) e assim por diante, provavelmente obter um erro pelo nome da funo. Esses nomes devem ser passados em Ingls. Para ter acesso a todas as funes, acesse o site: http://wiki.services.openoffice.org/wiki/Documentation/How_Tos/Calc:_Functions_listed_by_category

view sourceprint? 01.procedure TForm1.buExecFuncaoClick(Sender: TObject); 02.begin 03. AtribuirVariaveis; 04. Planilha.getCellByPosition(0,0).Value := StrToFloat(A4.Text); //A1 05. Planilha.getCellByPosition(0,1).Value := StrToFloat(A5.Text); //A2 06. Planilha.getCellByPosition(0,2).Value := StrToFloat(A6.Text); //A3 07. Case cbFuncao.ItemIndex of 08. 0 : Planilha.getCellByPosition(0,3).Formula := '=SUM(A1:A3)'; //soma 09. 1 : Planilha.getCellByPosition(0,3).Formula := '=AVERAGE(A1:A3)'; //mdia 10. 2 : Planilha.getCellByPosition(0,3).Formula := '=MAX(A1:A3)'; //mximo 11. 3 : Planilha.getCellByPosition(0,3).Formula := '=MIN(A1:A3)'; //mnimo 12. 4 : Planilha.getCellByPosition(0,3).Formula := '=PRODUCT(A1:A3)'; //multiplica 13. end; 14.end; III PROPRIEDADES DO DOCUMENTO Aproveitando o gancho para no ficar muito em cima de uma coisa s, vamos aproveitar para adicionar propriedades do autor ao documento. As propriedades podem ser acessadas no menu Arquivo do BrOffice e no submenu > Propriedades. Para atribu-las ao seu documento, devemos usar a varivel Documento e no a Planilha. Voc pode definir outras poucas propriedades do

documento, porm as que estou passando abaixo, so as mais comuns. Em nosso tutorial, acrescentei mais uma procedure chamada Propriedades e que est definida na seguinte forma:

view sourceprint? 01.procedure TForm1.Propriedades; 02.begin 03. if chProp.Checked then 04. begin 05. Documento.DocumentInfo.Author := edAut.Text; //Autor do documento 06. Documento.DocumentInfo.Title := edTit.Text; //Ttulo do documento 07. Documento.DocumentInfo.Subject := edAss.Text; //Assunto do documento 08. Documento.DocumentInfo.Keywords := edKeyW.Text; //Palavras-Chave do documento 09. Documento.DocumentInfo.Description := mmDesc.Text; //Descrio do contedo 10. end; 11.end; E aqui na sequncia, a forma como fica quando executamos o nosso aplicativo contendo as descries preenchidas, veja:

Essa mais uma parte de nosso tutorial. Espero agora que mesmo sendo pouca contedo apresentado, eles tenham sido de grande valia para implementar em suas aplicaes. Se desejar baixar o cdigo fonte: Delphi e BrOffice - Parte 5.zip Abraos e at o prximo mdulo.

You might also like