Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos...

18
16/09/2016 Artigos file:///T:/Restrito/Revistas/201609/PDF.aspx 1/18 XML – Coleções e Serialização – parte I Há muito tempo o formato XML sempre foi uma importante “base de troca” de informações entre aplicações, configuração de aplicações, persistência de informações do sistema, serialização de objetos do sistema, etc, enfim são muitas as possibilidades que este tipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService, ele tem grande valor pra interagir com sistemas diferentes, solicitando e retornando as informações de consulta de outras aplicações, que podem estar escritas em outras linguagens, em outras plataformas, etc. Então, é um formato independente de tudo que “conversa” entre aplicações pro intercâmbio de dados, compartilhando entre si estas informações, muito útil hoje em dia. O que trazemos hoje é uma idéia de serialização do XML pro Delphi, lendo e salvando estes formatos e principalmente alimentando um objeto de TDataSet através da manipulação de TCollection e TCollectionItem – e com isso conseguiremos fazer com que o XML vire um “banco de dados”, podendo editar, inserir, etc; o foco aqui é portanto gerenciar esta linguagem de marcações, disponibilizando em um formato de visualização de detalhe de banco de dados pra manipulação em coleções, ilustrando o conceito de serialização, onde vamos ver como podemos empregar o XML pra salvar objetos do próprio Delphi , como salvar uma imagem ﴾TImage﴿ em um XML e também carregar um menu a partir de um XML, e muito mais! Portanto, vamos começar a nossa aventura. Primeiros passos

Transcript of Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos...

Page 1: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 1/18

XML – Coleções e Serialização – parte I

Há muito tempo o formato XML sempre foi uma importante “base de troca” de informações entre aplicações, configuração deaplicações, persistência de informações do sistema, serialização de objetos do sistema, etc, enfim são muitas as possibilidades que estetipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService, ele temgrande valor pra interagir com sistemas diferentes, solicitando e retornando as informações de consulta de outras aplicações, quepodem estar escritas em outras linguagens, em outras plataformas, etc. Então, é um formato independente de tudo que “conversa”entre aplicações pro intercâmbio de dados, compartilhando entre si estas informações, muito útil hoje em dia.

O que trazemos hoje é uma idéia de serialização do XML pro Delphi, lendo e salvando estes formatos e principalmentealimentando um objeto de TDataSet através da manipulação de TCollection e TCollectionItem – e com isso conseguiremos fazer comque o XML vire um “banco de dados”, podendo editar, inserir, etc; o foco aqui é portanto gerenciar esta linguagem de marcações,disponibilizando em um formato de visualização de detalhe de banco de dados pra manipulação em coleções, ilustrando o conceito deserialização, onde vamos ver como podemos empregar o XML pra salvar objetos do próprio Delphi , como salvar uma imagem ﴾TImage﴿em um XML e também carregar um menu a partir de um XML, e muito mais! Portanto, vamos começar a nossa aventura.

Primeiros passos

Page 2: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 2/18

Foram utilizados os componentes e classes tradicionais do Delphi 7, como XMLDoc, msxmldom, xmldom e XMLIntf. Também foi

testado a classe TNativeXML que roda em Delphi 5 adiante, pois as demais não compilam nesta versão. Demais implementaçõesparticulares, como serializações de objetos, foram implementadas em unit´s próprias pra isso e citadas e parcialmente descritas noescopo deste artigo.Lendo um menu – carregando o XML

Vamos iniciar com um exemplo bem interessante de serializações de objetos, que é a persistência de um menu em um XML. Elevai ler as seguintes tag´s pra montar o menu:

<MENU> ‐ nó principal;<ENTRY> ‐ corresponde a cada entrada do menu, tendo como nós filhos as tag´s CAPTION, VISIBLE, ID, SHORTCUT e CHECKED ﴾todaselas são do objeto de TMenuItem﴿.

Assim sendo, basta chamar a função que irá ler este XML e carregar o menu. Vamos mostrar como funciona esta operação emdetalhes abaixo:

1. O XML é preenchido contendo os dados do menu;2. A aplicação lê o XML, carregando item por item do menu em tempo de execução.

Segue um exemplo abaixo, relacionado aos dois itens acima, e o fonte responsável por isso:

<?xml version="1.0" encoding="ISO­8859­1"?> <MENU> <ENTRY CAPTION="Arquivo" VISIBLE="1" ID="None" SHORTCUT="None" CHECKED="0"> <ENTRY CAPTION="Abrir" VISIBLE="1" ID="Abrir" SHORTCUT="Strg+A" CHECKED="0"></ENTRY> <ENTRY CAPTION="Salvar"VISIBLE="1" ID="Salvar" SHORTCUT="Strg+F" CHECKED="0"></ENTRY> </ENTRY>

<ENTRY CAPTION="Visualizar" VISIBLE="1" ID="None" SHORTCUT="None" CHECKED="0"> <ENTRY CAPTION="Barra de Ferramentas" VISIBLE="1" ID="ShowToolbar"SHORTCUT="None" CHECKED="1"></ENTRY> <ENTRY CAPTION="Seperator" VISIBLE="1"></ENTRY> <ENTRY CAPTION="Opções" VISIBLE="1" ID="ShowOptions" SHORTCUT="Strg+O"CHECKED="0"></ENTRY> </ENTRY>

procedure TForm1.CreateMenuFromXMLFile;function Get_Int(S: string): Integer; begin Result := 0; try Result := StrToInt(S); except end; end;

procedure AddRecursive(Parent: TMenuItem; Item: IXMLNode); var I: Integer; Node: TMenuItem; Child: IXMLNode; Address: TMethod; begin Node := TMenuItem.Create(Parent); if (Uppercase(Item.Attributes['CAPTION']) <> 'SEPERATOR') then begin Node.Caption := Item.Attributes['CAPTION']; if (Uppercase(Item.Attributes['ID']) <> 'NONE') then begin Address.Code := MethodAddress(Item.Attributes['ID']); Address.Data := Self; if (Item.ChildNodes.Count ­ 1 < 0) then Node.OnClick := TNotifyEvent(Address); end; if (Uppercase(Item.Attributes['SHORTCUT']) <> 'NONE') then Node.ShortCut := TextToShortCut(Item.Attributes['SHORTCUT']); Node.Checked := (Item.Attributes['CHECKED'] = '1'); end else Node.Caption := '­'; Node.Visible := (Item.Attributes['VISIBLE'] = '1');

Page 3: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 3/18

if Parent <> nil then Parent.Add(Node) else MainMenu.Items.Add(Node);

for I := 0 to Item.ChildNodes.Count ­ 1 do begin Child := item.ChildNodes[i]; if (Child.NodeName = 'ENTRY') then AddRecursive(Node, Child); end; end;

var Root: IXMLMENUType; Parent: TMenuItem; I: Integer; Child: IXMLNode; XMLFile: string;begin XMLFile := 'menu.xml'; XMLDocument.FileName := ExtractFilePath(Application.ExeName) + XMLFile; if not FileExists(XMLDocument.FileName) then begin MessageDlg('Menu­XML­Document not found!', mtError, [mbOK], 0); Halt; end; XMLDocument.Active := True;

Screen.Cursor := crHourglass; try Root := GetXMLMenu(XMLDocument); Parent := nil;

for I := 0 to Root.ChildNodes.Count ­ 1 do begin Child := Root.ChildNodes[i]; if (Child.NodeName = 'ENTRY') then AddRecursive(Parent, Child); end; finally Screen.Cursor := crDefault; end;end;

Page 4: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 4/18

Figura 1 – Tela de exemplo de um programa que carrega o menu via XML

Assim, o menu é finalmente carregado. É interessante, pois a aplicação “não conhece” o menu até que ela seja carregada.Enquanto isso, o menu é editado em qualquer editor XML. E muitas coisas podem ser feitas no meio do caminho, como salvar este XMLem outro lugar e criptografar ele, ou seja, dar mais segurança nele concedendo um perfil próprio pra manutenção de perfis, e por aí vai.Serialização com TNativeXmlEsta classe TNativeXML é utilizada principalmente para serialização; segue um print abaixo em que uma imagem ﴾objeto do tipoTImage﴿ é convertida pra XML ﴾tag Picture﴿.

//serialização do objeto – XML de gravaçãovar Doc: TNativeXml; Writer: TsdXmlObjectWriter;begin // Create XML document with root named "Root" Doc := TNativeXml.CreateName('Root'); try // Display resulting XML in memo Doc.XmlFormat := xfReadable; // Create Object writer Writer := TsdXmlObjectWriter.Create; try // Write the image object as child of the XML document's root node Writer.WriteComponent(Doc.Root, Image1, Self); finally Writer.Free; end; mmXml.Clear; mmXml.Lines.Text := Doc.WriteToString; // now that the xml snippet is available.. btnLoadImage.Enabled := True; finally Doc.Free; end;

Page 5: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 5/18

Figuras 2 e 3 – Telas mostrando a geração do XML da classe TImage serializada e o carregamento (desserialização) do XML pro formulário de volta,respectivamente.

//desserialização do xml pra classe TImage.var Doc: TNativeXml; Reader: TsdXmlObjectReader; OldPos: TPoint;begin // You could also call "ObjectLoadFromXmlString" here, but this code demonstrates // how to do it manually

// Create XML document Doc := TNativeXml.Create(Self); try // Read the XML from the memo Doc.ReadFromString(mmXml.Lines.Text); // Create Object reader Reader := TsdXmlObjectReader.Create; try // Read the image object as child of the XML document's root node

Page 6: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 6/18

OldPos := Point(Image2.Left, Image2.Top); Doc.Root.Attributes[0].Value := 'Image2'; Reader.ReadComponent(Doc.Root, Image2, Self); // We must set the image to the location it was otherwise it exactly covers // Image1 Image2.Top := OldPos.Y; finally Reader.Free; end; finally Doc.Free; end;

Com isso, é possível neste nosso caso armazenar qualquer objeto e seus estados persistindo em um XML, podendo clonar

estes objetos se desejado e desserializar, isto é, recuperar este objeto do XML reconstruindo ele totalmente antes de ser lidonovamente. Com esta classe TNativeXML ambos os processos são facilitados, graças as procedures WriteComponent e ReadComponent.

function TsdXmlObjectReader.ReadObject(ANode: TXmlNode; AObject: TObject; AParent:TComponent): boolean;var i, Count: Integer; Item: TCollectionItem; PropInfo: PPropInfo; PropList: PPropList; S: TStringStream; AReader: TReader; AChildNode: TXmlNode; AComponentNode: TXmlNode; AClass: TComponentClass; AComponent: TComponent; C: TComponent; CA: TComponentAccess; Coll: TCollection;begin Result := True; if not assigned(ANode) or not assigned(AObject) then exit;

// Start loading if AObject is TComponent then begin CA := TComponentAccess(AObject); CA.Updating; CA.SetComponentState(CA.ComponentState + [csLoading, csReading]); end; try// If this is a component, load child components if AObject is TComponent then begin C := TComponent(AObject); AChildNode := ANode.NodeByName('Components'); if assigned(AChildNode) then begin for i := 0 to AChildNode.NodeCount ­ 1 do begin AComponentNode := AChildNode.Nodes[i]; AComponent := C.FindComponent(string(AComponentNode.AttributeByName['Name'])); if not assigned(AComponent) then begin AClass := TComponentClass(GetClass(string(AComponentNode.Name))); if not assigned(AClass) then begin DoDebugOut(Self, wsFail, sUnregisteredClassType); Result := False; Exit; end; AComponent := AClass.Create(TComponent(AObject)); AComponent.Name := AComponentNode.AttributeByName['Name'].Value;$ifdef useForms // In case of new (visual) controls we set the parent if (AComponent is TControl) and (AObject is TWinControl) then TControl(AComponent).Parent := TWinControl(AObject);$endif end; ReadComponent(AComponentNode, AComponent, TComponent(AObject));

Page 7: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 7/18

end; end; end;// If this is a collection, load collections items if AObject is TCollection then begin Coll := TCollection(AObject); Coll.BeginUpdate;try Coll.Clear; for i := 0 to ANode.NodeCount ­ 1 dobegin Item := Coll.Add; ReadObject(ANode.Nodes[i], Item, AParent); …

Acima vimos um trecho do código‐fonte responsável por recuperar um objeto a partir do seu XML gerado ﴾desserialização﴿. É

utilizada a classe TReader para ler os dados dos objetos persistidos no XML.

// Load defined properties if AObject is TPersistent then begin AChildNode := ANode.NodeByName('DefinedProperties'); if assigned(AChildNode) then begin S := TStringStream.Create(AChildNode.BinaryString); try AReader := TReader.Create(S, 4096); try while AReader.Position < S.Size do TReaderAccess(AReader).ReadProperty(TPersistent(AObject)); finally AReader.Free; end; finally S.Free; end; end; end;

Fonte utilizando um objeto de TReader pra ler através de um stream os dados do XML de um objeto serializado.Pra finalizar esta primeira parte, vamos mostrar como ler uma variável que contém o conteúdo de um XML pra dentro de um objeto dotipo TMemo, interessante pra quando se quer armazenar em memória o XML em si e disponibilizar em um objeto GUI ﴾graphical userinterface﴿ qualquer – você pode criar uma rotina genérica e extrair em forma de metadados pra um objeto de TClientDataSet em tempode execução, por exemplo.

Uses XMLDoc; ...

procedure TForm1.btnOpenFileClick(Sender: TObject);const TestXML = '<?xml version="1.0"?>' + '<customers>' + '<people>' + '<person>' + '<name>John Smith</name>' + '<address>123 Main Street</address>'+ '<city>Sometown</city>' + '<state>NY</state>' + '<zip>12345</zip>' + '</person>' + '<person>' + '<name>Jane Doe</name>' + '<address>456 Scenic View Blvd</address>'+ '<city>Richtown</city>' + '<state>CT</state>' + '<zip>23456</zip>' + '</person>' + '</people>' + '</customers>';procedure ParseXMLToMemo;var

Page 8: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 8/18

Doc: IXMLDocument; Root: IXMLNode; PersonList: IXMLNodeList; Person: IXMLNode; i: Integer;begin Doc := LoadXMLData(TestXML);

Doc.Active := True; Root := Doc.DocumentElement; // Get <people> PersonList := Root.ChildNodes['people'].ChildNodes; Person := PersonList.First; while Assigned(Person) do begin Memo1.Lines.Add(Person.ChildValues['name']); Memo1.Lines.Add(Person.ChildValues['address']); Memo1.Lines.Add(Person.ChildValues['city']); Memo1.Lines.Add(Person.ChildValues['state']); Memo1.Lines.Add(Person.ChildValues['zip']); Person := Person.NextSibling; end;end;begin Memo1.Clear; ParseXMLToMemo;end;

Conclusão Esta foi a primeira parte do artigo que trata sobre XML – serializações, desserializações, e funções relacionadas ﴾como criação

de menu e geração de imagens através destes conceitos﴿. Mostramos na prática ambos os conceitos, com fontes abordando tambémestas implementações e geramos algumas imagens pra fixar mais facilmente na mente. Deixamos pra segunda parte deste artigo amanipulação de coleções com dataset´s juntamente com XML´s.Para este próximo tema será utilizada a classe TXMLSerializer; uma classe muito eficiente pra interagir com um dataset, carregando esalvando dados em um XML, de forma bem prática e encapsulada – vamos ver também a implementação completa de uma estruturabaseada em coleções e exibindo seus dados dinamicamente em um dbGrid, podendo suas classes de coleções serem estendidas deacordo com a finalidade ﴾exemplo: criando novos atributos dela e versionando no XML correspondente﴿ – tudo isso sem ter anecessidade de ter um banco de dados pra persistir estes dados – e é útil em várias ocasiões onde não se deseja armazenar estes dadosnele, e sim temporariamente ou negocialmente em um arquivo do tipo XML. Portanto, bons estudos e até a próxima!

Criando uma Lista de Contatos com o Ionic –Parte 1

Introdução O Ionic Framework é um framework open source para criação aplicativos mobile desenvolvidos através de páginas HTML e

códigos JavaScript. O Ionic oferece uma biblioteca de componentes HTML, CSS e JavaScript otimizados para o mundo mobile e umconjunto de ferramentas que fazem a interação de sua aplicação com o hardware de forma nativa. É construído com Sass e otimizadopara o AngularJS. No artigo anterior nós aprendemos os principais pontos do framework e no artigo de hoje vamos criar uma aplicaçãobásica.

Lista de Contatos Nosso aplicativo será uma lista de contatos que irá conter o nome, o sobrenome e o telefone das pessoas. Contará com uma

tela para exibição da lista, uma página com os detalhes e uma para adição e remoção dos contatos.

Iniciando a aplicação Para iniciar abra seu console na pasta que você deseja guardar seu projeto e entre com o comando abaixo:

Page 9: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 9/18

ionic start ListaContatos blank ‐‐v2 ‐‐ts Após alguns instantes – a instalação pode durar alguns minutos dependendo de sua conexão com a internet – a aplicação será

instalada na pasta ListaContatos. O resultado deverá ser semelhante à Figura 1.

Figura 1. Instalação do projeto Conforme já expliquei no artigo anterior o comando start serve para indicar a criação de um novo projeto, o blank é o nosso

template que no caso é um projeto em branco. Os outros dois comandos servem para indicar a versão 2.x do Ionic e que a linguagemserá a TypeScript.

A estrutura criada conta com algumas pastas importantes conforma mostra a Figura 2. Dentre elas é importante conheceralgumas, a primeira, a www contém os arquivos compilados, nela você irá incluir as imagens e recursos adicionais de sua aplicação. Apasta app contém os códigos de nossa aplicação. A pasta plugins contém as bibliotecas que utilizaremos durante o desenvolvimento epor último a resources que contém os ícones e as imagens de abertura de nosso app.

Page 10: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 10/18

Figura 2. Estrutura dos diretórios de um projeto.

Criando a listagem de contatos Se você abrir a pasta app, você verá que o comando start já criou uma página chamada home e usaremos ela para criar a tela

inicial de nossa aplicação. As páginas ficam organizadas em pastas dentro da pasta app/pages e cada página possui um arquivo HMTL,um SCSS que é responsável pelas regras CSS e um arquivo TS que possui o código TypeScript.Arquivo app/pages/home.ts deverá ter a seguinte estrutura:

import Component from '@angular/core';

import NavController from 'ionic­angular';

@Component(

templateUrl: 'build/pages/home/home.html'

)

export class HomePage constructor(public navCtrl: NavController)

Os imports no início do arquivo serve para importar as classes que serão utilizadas, a tag @component faz parte da declaração

do componente no Angular 2 e por último a classe. Por padrão todas as páginas devem terminar em Page no nome.Vamos agora adicionar um array do tipo objeto que irá armazenar os contatos da aplicação e só para testarmos iremos criar algunsobjetos no nosso construtor.

import Component from '@angular/core';

import NavController from 'ionic­angular';

@Component(

Page 11: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 11/18

templateUrl: 'build/pages/home/home.html'

)

export class HomePage

private contatos: Array<Object> = [];

constructor(public navCtrl: NavController)

this.contatos = [

"nome": "Ricardo",

"sobrenome": "Crivelli",

"telefone": "+55 14 99999­9999"

,

"nome": "João",

"sobrenome": "Silva",

"telefone": "+55 14 55555­5555"

]

Configurando a view Agora vamos configurar a view, abra o arquivo app/pages/home.html e altere‐o criando as tags para exibir os contatos.

<ion­header>

<ion­navbar>

<ion­title>

Lista de Contatos

Page 12: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 12/18

</ion­title>

</ion­navbar>

</ion­header>

<ion­content padding>

<ion­card>

<ion­card­header>

Contatos

</ion­card­header>

<ion­list>

<button ion­item *ngFor="let contato of contatos">

contato.nome contato.sobrenome

</button>

</ion­list>

</ion­card>

</ion­content>

Se você ficou assustado com esse HTML não se apavore! Esses são diretivas do Angular JS usados para facilitar nossas vidas.

Existe uma documentação muito completa com todos as diretivas ﴾chamadas de componentes no Ionic﴿ e exemplos de utilização, elapode ser acessada através do endereço http://ionicframework.com/docs/v2/components.O mais importante de toda página é a propriedade *ngFor que faz com que a tag seja repetida para cada elemento existente no arraycontatos que criamos no arquivo TypeScript. O *ngFor cria um objeto chamado contato que é substituído por um elemento do array acada repetição.

Testando Para testar se está tudo funcionando normalmente execute o comando abaixo no terminal na pasta raiz do projeto. ionic serve O comando serve para criar um servidor local que simula a aplicação, ele muito útil quando estamos criando aplicações que

não utilizam os sensores do celular, como a câmera ou o GPS ou simplesmente para testar a aparência. O comando irá compilar todosos arquivos ﴾Figura 3﴿ e irá executar o seu navegador abrindo o endereço http://localhost:8100.

Page 13: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 13/18

Figura 3. Resultado do comando ionic serve.

Se o seu código estiver correto a página aberta no navegador será semelhante à Figura 4. Uma característica muitointeressante do servidor local criado pelo Ionic é o live reload que identifica qualquer mudança nos arquivos e automaticamenterecompila todo o código e recarrega a página para exibir o conteúdo atualizado.

Figura 4. Resultado da compilação

Para testar essa funcionalidade adicione mais um contato em nosso array, salve o arquivo.

this.contatos = [

Page 14: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 14/18

"nome": "Ricardo",

"sobrenome": "Crivelli",

"telefone": "+55 14 99999­9999"

,

"nome": "João", "sobrenome": "Silva",

"telefone": "+55 14 55555­5555"

,

"nome": "Maria",

"sobrenome": "Souza",

"telefone": "+55 14 22222­2222"

]

Agora olhe o seu console, ele deve ter exibido a mensagem indicando a alteração ﴾Figura 5﴿.

Figura 5. Live reload em ação

Conclusão Nesta primeira etapa aprendemos um pouco mais sobre o Ionic Framework e seu funcionamento iniciando o desenvolvimento

de uma lista de contatos.No próximo artigo nós desenvolveremos as telas restantes para o funcionamento da aplicação. Até o próximo mês!

Microsoft Visual Studio ­ Como utilizar o Nuget

Olá amigos, no artigo deste mês irei apresentar um mecanismo muito util na plataforma .NET através do Microsoft VisualStudio, o gerenciador de bibliotecas Nuget. O principal objetivo do Nuget é garantir que todas as dlls estejam atualizadas com suasúltimas versões, evitando erros de referências nos projetos. Podemos destacar outras características deste utilitário como: a facilidadepara remoção de bibliotecas externas, criação do próprio pacote ﴾package﴿ e consequentemente torná‐lo disponível para terceiros.

Page 15: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 15/18

É importante destacar que este recurso está disponível a partir do Microsoft Visual Studio 2012. ﴾Para quem possuir aversão 2010 e desejar instalá‐lo, com o Visual Studio aberto localize o item ”Extension Manager” no menu “Ferramentas”procurando “Nuget Package Manager” na guia “Galeria Online”.﴿

Utilizando o Nuget

Depois de abrir o Microsoft Visual Studio, crie um projeto de exemplo para aprendermos a trabalhar com o Nuget, no meucaso foi criada uma “solution” do tipo “Windows Forms” denominada “WindowsFormsApplicationNuget”. Para adicionar um pacotepodemos clicar com o botão direito no item “References” escolhendo a Opção “Manage NuGet Package” ﴾Figura 01﴿ ou no Menu“Tools/ Nuget Package Manager/ Manage Nuget Package Manager for Solution” ﴾Figura 02﴿

Figura 01: Manage Nuget Packages.

Figura 02: Tools/Manage Nuget Packages.

Na próxima tela iremos nos deparar com diversas informações e opções. Na região superior direita teremos com uma caixa dediálogo para realizar a pesquisa da biblioteca. Podemos também ordenar o resultado desta pesquisa por relevância, data ou descrição.

Ao selecionar o pacote desejado, será demostrada informações como: Criado por , Id , Versão , Downloads, Descrição,Dependências , entre outras coisas. Ver Figura 03.

Page 16: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 16/18

Figura 03: Localizando o Package.

Para fins de exemplo, escolhi a biblioteca “Microsoft.Office.Interop.Excel” para trabalhar com planilhas eletrônicas. Clicando nobotão “Install“ iremos baixar a biblioteca junto com suas dependências e logo em seguida instalá‐la em nossa aplicação. ﴾Figura 04﴿

Uma vez instalada , ela faz algumas mudanças em seu projeto como se você estiver adicionando um pacote pela primeira vez ,em seguida, ele irá criar um arquivo chamado “packages.config” .

Importante: Este arquivo mantém uma lista de todos os pacotes que estão instalados no seu projeto. Ver Figura 04.

Figura 04: Arquivo Packages.config.

Outra tarefa realizada automaticamente seria a criação uma pasta chamada “packages” no diretório onde o arquivo de solução﴾ .sln ﴿ reside. Esta pasta contém uma subpasta para cada pacote instalado com o número da versão. Veja Imagem 05.

Figura 05: Pasta Packages.

O arquivo “repositories.config” contém o caminho para o “packages.config”.Utilizamos a mesma tela mencionada anteriormente na Figura 03 para remoção e atualização do package na aplicação. Por

exemplo: Para remover o pacote “Microsoft.Office.Interop.Excel”, na região esquerda, clique em “Installed Packages” e localize o mesmofinalizando com o botão “Uninstall”. Já para verificar se o mesmo possui atualizações clique na região “Updates”. Ver Figura 06.

Page 17: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 17/18

Figura 06: Removendo e Atualizando Pacotes.

Utilizando o Nuget por linha de comando

Podemos utilizar o Nuget por linha de comando clicando no menu “Tools/Nuget Package Manager/Package Manager Console”.Ver Imagem 07.

Figura 07: Package Manager Console.

Instalando um pacote:Install‐Package Microsoft.Office.Interop.Excel Atualizando um pacote:Update‐Package Microsoft.Office.Interop.Excel

Removendo um pacote:Uninstall‐Package Microsoft.Office.Interop.Excel

Podemos conferir todos os comandos comentados acima na Figura 08.

Page 18: Coleções e Serialização – parte I - The Clubtipo de arquivo é utilizado, isto não temos dúvida; seja como se fosse um arquivo local, em rede, ou através de um WebService,

16/09/2016 Artigos

file:///T:/Restrito/Revistas/201609/PDF.aspx 18/18

Figura 08: Package Manager Console.

ConclusõesNeste artigo procurei explorar este importante recurso presente no Microsoft Visual Studio, o gerenciador de bibliotecas

Nuget. Com poucos cliques temos a facilidade da instalação, atualização e remoção de qualquer biblioteca presente na plataforma .Net.Uma outra opção também abordada seria realizar estas mesmas tarefas via linha de comando.Fica aí a dica pessoal, um abraço e até o mês que vem!

Sobre o Autor

TheClub

E­mail: [email protected]