Delphi Academy Latinoamérica – Nuevos Temas

banner_spanish

Delphi Academy ha sido un gran éxito! Estamos en el episodio número 5, y debido a tal receptividad, ya tenemos más 5 episodios en la agenda, a saber:

* 01/07 – Visualización de Datos con FireMonkey 3D
* 15/07 – Comprender y utilizar layouts FireMonkey
* 29/07 – Uso de efectos, animaciones y transiciones en FireMonkey
* 12/08 – Acceso a datos con FireDAC
* 26/08 – La migración de BDE y DBX a FireDAC

Si quieres puedes encontrar lo que ha pasado, todos los episodios están disponibles en este enlace: http://embt.co/DelphiAcademyLatAmReplay. En esta playlist se encuentran los siguientes temas:

  • Control de una aplicación Windows desde una aplicación móvil con AppTethering
  • LiveBindings: desde lo básico hasta técnicas avanzadas
  • Integración de servicios en la nube con REST/JSON
  • Introducción a NoSQL con MongoDB y FireDAC
  • Uso del Windows Runtime (WinRT) y la Universal Windows Platform (UWP) en Windows 10

En la descripción de cada uno de los videos, hay un enlace para los ejemplos (y también la presentación en PDF). O usted puede todavía encontrar todos los ejemplos directamente aquí: http://cc.embarcadero.com/Author/4821.

Y no termina ahí! Usted está invitado a contribuir con sugerencias sobre los temas que le gustaría ver en Delphi Academy. Deje sus comentarios sobre este artículo y haremos todo lo posible para servirle!

Antes de terminar, una vez más, estás invitado a las próximas presentaciones. Simplemente haga clic aquí http://embt.co/DelphiAcademyLatAm y regístrate, recordando que debe registrarse para cada uno de los temas de interés.

Delphi Academy Brasil – Novos Tópicos

banner_form

O Delphi Academy tem se mostrado um grande sucesso! Estamos no episódio de número cinco e mais de mil desenvolvedores já passaram por lá! Devido tamanha receptividade, já programamos mais cinco episódios, confiram na agenda abaixo:

  • 28/06 – Visualização de Dados com Firemonkey 3D
  • 12/07 – Compreendendo e utilizando FireMonkey Layouts
  • 26/07 – Usando efeitos, animações e transições no FireMonkey
  • 09/08 – Acesso a Dados com FireDAC
  • 23/08 – Migrando de BDE e DBX para FireDAC

Se você quiser dar uma olhada no que já passou, todos os episódios estão disponíveis neste link: http://embt.co/DelphiAcademyReplay. Neste playlist você vai encontrar os seguintes tópicos:

  • Controle uma Aplicação Windows a partir de uma Aplicação Mobile com AppTethering
  • LiveBindings – de Formulários Visuais ao Código
  • Integração de Serviços Cloud com REST/JSON
  • Introdução a NoSQL com MongoDB e FireDAC
  • Utilizando Windows Runtime (WinRT) e Universal Windows Platform (UWP) no Windows 10

Na descrição de cada um dos vídeos há um link para os exemplos (e também o PDF da apresentação). Ou você ainda pode encontrar todos os exemplos diretamente aqui: http://cc.embarcadero.com/Author/4821.

E não queremos parar por aí! Você está convidado a contribuir com sugestões sobre temas que gostaria de ver no Delphi Academy. Deixe seu comentário neste artigo e faremos o possível para atendê-lo!

Antes de encerrar, mais uma vez fica o convite para as próximas apresentações. Basta clicar aqui http://embt.co/DelphiAcademy e se inscrever, lembrando que você deve se cadastrar para cada um dos tópicos de seu interesse.

 

Bluestacks como emulador Android para Delphi/C++ Builder

Um tema recorrente nas rodas de conversa sobre mobile é a performance (ou não performance) do emulador Android do Google (utilizado por default pelo Delphi e C++ Builder).

Eis que surge uma solução muito interessante (e de ótima performance): a utilização de máquinas virtuais com Android.

Uma delas é o BlueStacks (http://www.bluestacks.com/). A instalação não tem segredo algum, basicamente um NNF (Next-Next-Finish).

Se você está utilizando um PC com Windows, basta reiniciar o “adb” (debug bridge, parte do SDK do Android), e sua VM Android já estará disponível para a IDE do Delphi ou C++ Builder, devidamente listada como um emulador.

Reiniciando o adb, diretamente via comando de linha:

adb.exe kill-server
adb.exe devices

Caso esteja rodando seu Delphi em uma VM Windows, em um equipamento MAC, o ideal é instalar o BlueStacks no sistema root, ou seja, no OSX. Neste caso, para que a IDE (dentro da VM Windows) consiga “ver” o emulador, é necessário um pequeno truque utilizando o Putty (emulador de terminais), descrito com riqueza de detalhes neste post do Jim McKeeth: http://delphi.org/2013/09/debugging-against-a-remote-android-emulator/. É exatamente a mesma técnica a ser aplicada ao BlueStacks.

E por fim, mas não menos importante:

O BlueStacks é um emulador Intel (não ARM), porém vem equipado com o LibHoudini (camada de emulação ARM para processadores mobile Intel). Este projeto é mantido pela própria Intel, para resolver a disponibilidade de apps para Android/Intel. Em outras palavras, este emulador roda normalmente apps ARM (geradas pelo Delphi e pelo C++).

O único detalhe é, antes de tentar executar a aplicação, vá até a opção deployment, e desmarque o assembly de checagem automática de plataforma, incorporado pela IDE a sua aplicação:

<missing image>

E aqui o resultado, uma app Delphi com IBLite rodando no BlueStacks:

<missing image>

Lembrando que alguma incompatibilidade ainda pode aparecer (não testei todas as apps que tenho), e que não é oficialmente suportado pela Embarcadero neste momento, recomendo a todos que estão desenvolvendo para mobile reservar algum tempo para testar, em algumas ocasiões me pareceu ainda mais rápido que um device físico!

Até a próxima!

Dados no dispositivo é uma necessidade!

Você já teve uma app que parou de funcionar em seu smartphone ou tablet porque você ficou sem conexão? Existe algo mais frustrante que perder algo crítico que está quase pronto devido a uma perda de conexão de rede? Por que não ter uma app com dados locais, ou ao menos com um cache de dados locais? Aí você me pergunta: e a segurança desses dados? Já ouviu sobre criptografia AES de 256 bit? Devem ser necessários ao menos 10 bilhões de anos para quebrar esse tipo de esquema!

Então por que não utilizamos mais desta técnica? Qual a razão de nos preocuparmos com perdas de dados como esta onde um laptop foi perdido, ou esta de uma importante companhia da área de saúde, se os dados estivessem propriamente protegidos com um mecanismo de criptografia de 256 bit?

Normalmente “protegemos” nossos dados utilizando um usuário/senha e mantendo os dados remotos… porque não colocar os dados no device e ter uma aplicação mais robusta? Dessa maneira podemos nos livrar do medo da temida 1 barra de conectividade, ou dispositivos perdidos ou roubados. Por que não usar a criptografia AES de 256 bits para proteger o seu bem mais precioso… os seus dados?

Interbase DB é um banco de dados (server ou embedded) que suporta criptografia de 256 bit para proteger campos, linhas ou todo o banco de dados de olhos curiosos indesejados. SQLite por sua vez, não possui este nível de granularidade de criptografia, normalmente comportando-se como um arquivo texto. Interbase ocupa muito pouco espaco (3 MB), tornando-o perfeito para devices, smartphones, tablets, IoT, equipamentos médicos, etc. Por falar nisso, o Interbase atualmente suporta iOS, Android, Windows, Linux e OSX.

A coisa mais legal é que o InterBase usa o mesmo formato de dados através de todas estas plataformas diferentes. Por que é tão legal você pergunta? Você pode literalmente copiar o arquivo de banco de dados do iOS para o Android para o Windows, etc., sem modificar um único bit de dados. Considere o tempo que você vai ganhar testando em diferentes plataformas!

Vamos lá arquitetos de dados e desenvolvedores de software, não tenham medo de colocar os dados no dispositivo com o InterBase DB e usar a criptografia AES de 256 bits para os dados que você não pode se dar ao luxo de perder. Comece por fazer o download da versão de avaliação gratuita e siga a página de webinars e exemplos do Interbase.

Delphi e C++ Builder XE8 – Detalhes da Nova Versão

Introdução

A Embarcadero está promovendo o lançamento da release de número 8 da série XE do RAD Studio (Delphi e C++ Builder). Neste artigo vou detalhar as principais novidades do produto, o qual chega mais completo do que nunca! Disponível nas edições Professional, Enterprise, Ultimate e Architect, o RAD Studio XE8 é o ambiente mais completo para criação de aplicações conectadas para Windows, MAC, iOS e Android, com excelente performance, e produtividade incomparável.

* veja mais em https://youtu.be/1b4_Mz3Ry34 (What’s New In RAD Studio XE8).

Novos Compiladores para iOS 64 bit

O XE8 adiciona dois novos compiladores para iOS 64 bit, um para Object Pascal e outro para C++, suportando assim as versões mais recentes do iOS. Além disso, também é possível “empacotar” sua aplicação no formato “Universal App”- o qual contém dos dois binários 32 e 64 bit em uma única app – exigência da Apple para as novas submissões para sua loja virtual.

* veja mais em https://youtu.be/6lc6cdL4Ts4 (iOS Universal 32-bit and 64-bit Apps for Delphi XE8).

Multi-Device Previews

Com o novo multi-device preview você consegue, em tempo de design, visualizar a interface de sua aplicação em todas as plataformas mobile e desktop, utilizando múltiplos tamanhos e formatos de tela, elevando sua produtividade de maneira incrível!

Adicionalmente, é possivel criar “devices” adicionais através de um wizard, possibilitando customizar a apresentação de sua aplicação para qualquer dispositivo ou formato desejado. Nesta área também podemos citar melhorias gerais na criação e aplicação de estilos customizados para todas as plataformas suportadas.

* veja mais em https://youtu.be/aV6GOHk_b6Y (Multi-Device Preview for Delphi XE8).

Novos Controles para FireMonkey

Foram adicionadas implementações nativas para um maior número de controles iOS, um trabalho que se iniciou no XE7. Com isso, você pode renderizar os controles FireMonkey suportados diretamente através de controles nativos da plataforma iOS, permitindo integração direta com outras apps e recursos daquele sistema operacional. A renderização nativa iOS está disponível para os seguintes controles: TMemo, TListView, TSwitch, TEdit e TCalendar.

Outras novidades são o MapView (mapas interativos para mobile, mapeados diretamente para as APIs nativas como Google Maps e MapKit do iOS) e também o novo TWebBrowser, agora disponível na versão Desktop para Windows e OSX.

Temos também um novo ImageList para FireMonkey, e melhorias no suporte a multimedia, captura de fotos em diferentes resoluções, etc. Outras novidades importantes são melhorias no suporte a notificações locais, com sons customizados e repetição, e um novo mecanismo de detecção da melhor “view” a ser utilizada para cada tipo de device.

* veja mais em https://youtu.be/l4tLWUNxa2o (New Platform Controls for Delphi XE8), https://youtu.be/T4P379vyOMQ (Camera and Share Sheet with Delphi XE8), https://youtu.be/oBxZBMpcY4g (Web Browser with Delphi XE8) e https://youtu.be/DRgTajC_zE0 (Notifications with Delphi XE8).

Novo HTTP Client Library

A nova implementação do cliente HTTP traz uma implementação nativa do protocolo HTTP e HTTPS para todas as plataformas (iOS, Android, Windows e OSX), em VCL e FireMonkey. O grande benefício é que esta nova biblioteca é implementada utilizando o SDK de cada plataforma, o que vai conferir a sua aplicação o mesmo nível de segurança e performance nativamente disponível, além de acesso direto a proxies, headers, etc:

Conectividade e IoT com Beacons

Além de um novo componente específico para Bluetooth tradicional (TBluetooth), e melhorias no suporte a Bluetooth Low Energy (através do já existente TBluetoothLE), no XE8 passamos a suportar nativamente “Beacons”. Beacons (ou iBeacons) são dispositivos utilizados em aplicações de localização e proximidade. Este recurso traz incríveis possibilidades para as suas aplicações, e está se tornando uma tendência mundial em aplicações para lojas, hospitais e eventos.

* veja mais em https://youtu.be/fMHS55id7fo (Beacons, Bluetooth and App Tethering with Delphi XE8).

Novo AppAnalytics

O AppAnalytics (ou Usertility) faz parte da aquisição da TwoDesk software, juntamente com o Castalia (já integrado na IDE, mais informações a seguir). Disponível para VCL e FMX, o AppAnalytics permite a captura de todas as estatísticas e informações de sua aplicação enquanto ela está sendo utilizada por seu usuário, possibilitando assim que você tome ações corretivas antes mesmo de uma solicitação de seu cliente chegar. Também é possível observar quais são as funcionalidades mais ou menos utilizadas, e entender o comportamento de seu usuário.

Extremamente simples, basta adicionar um componente a sua aplicação VCL ou FMX, e definir o nível de captura de informação. Tais informações serão enviadas para um serviço hospedado pela Embarcadero, onde através de um usuário você terá acesso a um portal com consultas e relatórios sobre os dados emitidos por sua aplicação. Teremos um nível de acesso básico gratuíto, e um nível completo através de assinatura. Maiores informações sobre planos e etc. estarão disponíveis nas próxima semanas.

* veja mais em https://youtu.be/QiPTRyWC2cI (AppAnalytics for Delphi XE8).

Novidades no EMS: Enterprise Mobility Services

O EMS, introduzido no XE7, agora conta com novos recursos como:

  • Notificações push
  • Pooling de conexões
  • Exportação dos dados analíticos de usuários e APIs
  • Nova aplicação cliente para gestão de usuários
  • Suporte a credenciais remotas como Active Directory
Trata-se de uma solução middleware robusta pronta para distribuição imediata, permitindo conexão de suas aplicações mobile ou desktop, para troca de informações, notificações push e armazenamento de dados. O EMS é um produto independente do RAD Studio, e tem seu licenciamento definido por número de usuários finais da aplicação.
* veja mais em https://youtu.be/IXJC3kh2nps (Enterprise Mobility Services for Delphi XE8).

Mais Produtividade!

São muitas as adições na IDE para aumentar ainda mais a sua produtividade. Vamos a elas:

  • Mais de 20 novas funcionalidades na IDE (através da integração definitiva do plugin Castalia): Project Statistics, Clipboard History, Multi-Paste Support, Modeless and Context-Sensitive Refactorings, Stack Bookmarks, Parenthesis Matching, Flow Control Highlighting, Structural Highlighting, Code Navigation Toolbar, Smart Keys and Smart Symbol Search, Code Analysis, e mais
  • GetIT, nosso novo package manager, para download e instalação automática de componentes
  • Migration Tool, para migração de todas as configurações entre versões da IDE
  • Integração com Mercurial Version Control, além dos já existentes GIT e SubVersion
  • Integração com DUnitX Test Framework
* veja mais em https://youtu.be/gDwNmmrr6TA (IDE Productivity for Delphi XE8).

Novidades no FireDAC

O FireDAC no XE8 passa a suportar conexões com base de dados Big Data, neste momento oferecendo suporte para Teradata, um dos mais utilizados no mercado (futuramente outros bancos como SAP Hana serão adicionados). Também estamos adicionando suporte para os novos ChangeViews do Interbase (um recurso incrível e exclusivo do Interbase) e ferramentas/script para migração de DBX para FireDAC (similar aos já disponíveis para migração de BDE para FireDAC).

Além disso, suporte a “update notification”, driver atualizado para SQLite v3+, novo componente TBatchMove, e otimizações de performance por todo o framework.

* veja mais em https://youtu.be/ELIPxZJwDKk (IBLite & FireDAC with Delphi XE8).

Box2D Engine

Outra importante adição ao produto é o engine Box2D. Trata-se de um mecanismo de física com suporte a animações gráficas em 2D, ideal para criação de jogos e programas de animação. Portado a partir do Box2D Open Source project, a biblioteca está disponível tanto para C++ quanto para Object Pascal.

* veja mais aqui http://docwiki.embarcadero.com/RADStudio/XE8/en/Using_Box2D_in_Delphi_Applications e aqui http://box2d.org/.

Interbase XE7

Obviamente este é um artigo sobre o RAD Studio XE8, mas gostaria de aproveitar a oportunidade para citar alguns dos avanços do Interbase em sua última versão, XE7:

  • Linux 64bit & new Linux Platforms (Ubuntu 14, RHEL 6 & 7, SUSE 11)
  • 64bit Transaction ID’s
  • New Change Views
  • Speed: New Processor and Indexes Management
  • Backup and Disaster Recovery
  • New developer API’s
  • ODS Update (16)
  • OpenSSL update
* veja mais aqui https://youtu.be/KNl6IRsQc4Y (CodeRage Brasil III: Interbase XE7 Change Views: captura automática de alterações de dados).

Conclusão

Este artigo oferece uma visão geral das principais novidades do RAD Studio XE8 (Delphi XE8 e C++ Builder XE8), e serve de ponto de partida para você explorar o produto. Para uma visão completa de todas as features, com links direto para a documentação de cada nova funcionalidade, recomendo os seguintes links:

* What’s New in Delphi and C++Builder XE8:

http://docwiki.embarcadero.com/RADStudio/XE8/en/What’s_New_in_Delphi_and_C%2B%2BBuilder_XE8

* RAD Studio XE8 PlayList no YouTube:

https://www.youtube.com/playlist?list=PLwUPJvR9mZHhpbLDfeUdW9uB5AqR_LiMG

* Download da versão trial (RAD Studio, Delphi e C++ Builder):

http://www.embarcadero.com/br/downloads

E finalmente, mas não menos importante, fiquem ligados em nossos canais no Facebook, em breve divulgaremos datas para os eventos presenciais e online que estaremos realizando sobre o XE8: fb.com/DelphiBrasilfb.com/EmbarcaderoBR.

Tour de RAD Studio XE7 en México y Colombia

Este post es sólo para registrar nuestro tour por Colombia y México, mostrando el nuevo RAD Studio XE7!

En nombre de nuestros socios, GOPAC (http://www.gopac.com.mx) y IT Tools (http://www.ittools.co), y también de Embarcadero (http://www.embarcadero.com/es), me gustaría decir un “muchísimas gracias” a todos los miembros de nuestra gran comunidad!

En este enlace se pueden descargar todas las muestras (y algunas más):

http://cc.embarcadero.com/item/30002

Y aquí se tiene una copia de la presentación:

http://www.slideshare.net/fernandoluizrizzato/rad-studio-xe7-live-world-tour-esp

Y, por supuesto, algunas fotos de nuestras paradas!

Delphi Tour 2014: Participe!

Você está convidado a conhecer de perto todas as novidades do RAD Studio XE6 (Delphi, C++ Builder e HTML5 Builder) durante o Delphi Tour 2014!

Razões para participar? Vou citar apenas algumas!

Você sabia que…

… seus aplicativos VCL serão capazes de acessar sensores,  utilizar novos componentes e funcionalidades como o Visual LiveBindings, e ainda novos estilos da VCL?

… você pode criar aplicações móveis complementares, e aplicativos de controle remoto, que se conectam com seus aplicativos de desktop VCL, via novos componentes para Tethering?

… você pode monetizar seus aplicativos móveis com o novo suporte para a compra de aplicativos e de publicidade no ​​iOS e Android?

… você pode usar a nova integração de serviços em nuvem para incorporar as notificações push, o armazenamento de arquivos em nuvem e a funcionalidade de gerenciamento de usuários em seus aplicativos via BaaS (Backend as a Service), utilizando os provedores mais populares do mercado?

… agora você conta com recursos exclusivos em C++, incluindo a capacidade de criar aplicações Android e iOS a partir de um único projeto, e suporte para pacotes de 64 bits para Windows?

Entusiasmado tanto quanto eu? Então não deixe para depois, pois as vagas são limitadas. Faça já sua inscrição para a cidade mais próxima!

http://www.embarcaderobr.com.br/tour/

Aguardamos sua presença!

Lanzamiento Oficial del RAD Studio XE6!

RAD Studio XE6 acaba de llegar. Es la consolidación de la estrategia multi-dispositivos de Embarcadero, ya que en esta versión estamos trayendo el compilador C++ para Android. Así, el RAD compilará para Windows 32/64 bits, OS X, iOS y Android, tanto en Object Pascal como en C++. De esta manera usted puede elegir el lenguaje que más le guste, las características son 100% iguales para ambos lenguajes en todas las plataformas soportadas.

Novedades Principales

Hay muchas nuevas características en esta versión, la primera de las cuales ya hemos citado anteriormente, el compilador de C++ para Android. Vamos a explorar un poco más todo lo que es nuevo para la VCL, FireMonkey Desktop y FireMonkey Mobile.

1.- VCL

La VCL ha recibido importantes mejoras en el rendimiento y la estabilidad, está optimizado para Windows 7 y 8.1 (recuerde que debe migrar las aplicaciones que se ejecutan en Windows XP debido a la interrupción del soporte por parte de Microsoft), migración simplificada a FireDAC desde BDE y otros frameworks, además de nuevos componentes y funciones, tales como el soporte “full” de los estilos (incluidos los menús y los bordes), Taskbar Preview (Win7 y Win8), sensores para GPS y acelerómetros para la tableta de Windows,Tethering App for VCL (hablaremos más sobre en este post) y la Integración Service Cloud (BAAS) (más detalles a continuación)!

2.- FireMonkey

FireMonkey es quizás la zona donde se ha realizado el mayor número de optimizaciones, tenemos nuevos componentes, una Grid totalmente reformada, ListView con nuevas características visuales, WebBrowser con nuevos métodos y con carga de archivos locales, la plantilla y el soporte oficial de Google Glass, y el nuevo framework que harán de su aplicación móvil muy profesional, como el soporte para In App Purchasing y Advertising, tanto para iOS como para Android, con el mismo componente y código fuente (¡aquellos que ya la han desarrollado en cualquier otro entorno de desarrollo saben cuán duro es el trabajo!).

3.- App Tethering para VCL y FireMonkey

La función de Tethering permite que dos aplicaciones, incluso en diferentes plataformas (VCL o FireMonkey), ejecutadas en Windows, OSX, iOS o Android, intercambien datos directamente, sin ninguna aplicación de servidor en el medio. Esto significa que puede tomar partes de su aplicación VCL de escritorio actual (por ejemplo) y llevarlos al mundo de los móviles, y permitir que estas partes intercambien datos y realizen directamente las acciones. ¿No es increíble? Esta función está disponible para las aplicaciones en una misma red (WiFi en esta versión).

4.- Cloud Service (BaaS) Integration

Tanto Delphi XE6, como C++ Builder XE6, trae soporte completo para el Baas (Backend as a Service). Si esto es un tema nuevo para ti, recomendamos estos sitios: http://www.kinvey.com y https://parse.com. El Baas presenta una plataforma común para el intercambio y el almacenamiento de datos, y estos son dos de los principales proveedores en el mercado. En el futuro se añadirán otros proveedores.

Con este soporte, se pueden almacenar y recuperar datos directamente desde estos proveedores de servicios sin la necesidad de construir su propio servidor o incluso una capa intermedia, o la creación de una base de datos en la nube. Sólo suscríbete al servicio! Este soporte también está disponible para VCL, por lo que puede enviar datos desde una aplicación móvil, y luego procesarlas en el servidor de aplicaciones o de escritorio, sólo para nombrar una de las posibilidades.

Esta integración también proporciona soporte para “Push Notifications”, lo que abre un gran gama de posibilidades para su aplicación móvil.

5.- In app purchasing y advertising

A través de este framework (TBannerAd y TInAppPurchase) puede agregar fácilmente a través de un solo componente para Android y iOS, el soporte a versiones de demostración y de pago de su aplicación, directamente integrado a tiendas virtuales como AppStoreGooglePlay. También le permite añadir y vender publicidad directamente en su aplicación, en ambas plataformas, y de manera unificada.

Observe en la imagen inferior el anuncio que se muestra en la aplicación Delphi.

Versión de prueba, Licencias y Bonus Pack

Recomiendo a todos descargar la nueva versión y probarlo, en realidad es una release muy estable y rico en características. Puede obtener la versión de prueba (que es 100% funcional durante el período de evaluación) en este enlace:

https://downloads.embarcadero.com/free/rad-studio.

Junto al XE6 estamos lanzando un nuevo tipo de actualización para los usuarios de la última versión, denominada Recharge Plan. Es decir, si usted es un usuario de la versión XE5, el precio de upgrade se reduce en gran medida, lo que le permite mantenerse al día!

Durante el lanzamiento se ofrecerá un Bonus Pack, que consiste en:

– TMS Modern Windows UI Pack

– VCL Premium Style Pack

– FireMonkey Premium Style Pack

Conclusiones

Bueno, esto es todo por un primer post sobre RAD Studio XE6Del mismo modo que empezamos este artículo, con esta versión se completa la estrategia multi-dispositivo de Embarcadero, con el desarrollo multiplataforma realmente nativo, proporcionando una alta productividad y rendimiento a través de Object Pascal o C++, todo ello integrado en un único entorno de desarrollo.

Acessando classes Java e Objective-C com Delphi XE5

Olá pessoal,

Hoje vamos falar um pouco sobre acesso a classes nativas Java e Objective-C em Delphi XE5 para aplicações mobile.

Introdução

A ampla maioria das funcionalidades (visuais e não visuais) necessárias a uma aplicação mobile em Delphi ou C++ Builder estão representadas através de componentes e classes do FireMonkey e da RTL.

Porém, existem SDKs e bibliotecas específicas as quais não possuem sua representação no framework. Na maioria dos casos são na verdade classes e métodos que executam uma função específica daquele sistema operacional (iOS ou Android), ou ainda acessar um pacote de terceiros, como leitores de códigos de barra, apenas para citar um exemplo.

A boa notícia é que o Firemonkey é totalmente aberto para integrações, então vamos mostrar alguns exemplos do que pode ser feito.

Criando “Wrappers”

Os wrappers são a maneira de incorporar uma classe Java ou Objective-C em um projeto Delphi ou C++ Builder. Como referência, considere os links abaixo, um sobre Java e outro sobre iOS:

http://www.pclviewer.com/android/androidJNI.html

http://blogs.embarcadero.com/fernandorizzato/index.php/2013/06/26/codigo-de-barras-no-delphi-para-ios/

Alguns exemplos

Através de exemplos postados em blogs e portais, e também criando alguns outros, centralizamos em uma única app alguns wrappers que me chamaram a atenção, organizando seu código de maneira a tornar o entendimento o mais simples possível. O exemplo disponibilizado contempla:

– Abertura de URLs e execução de outras ações pré-definidas

– Status da rede, internet, 3G, etc.

– Envio de e-mail

– Leitura de código de barras (iOS e Android)

– Toast Message (exclusivo do Android)

Código Fonte

Vou postar abaixo, a título de ilustração, a unit responsável por obter o status de rede, porém você pode baixar o projeto completo neste link: http://cc.embarcadero.com/item/29811

unit NetworkState;
interface
uses
{$IFDEF IOS}
  Macapi.ObjectiveC, Macapi.CoreFoundation, Macapi.Dispatch,
  iOSApi.CocoaTypes, iOSApi.Foundation, Posix.SysSocket;
{$ENDIF}
{$IFDEF ANDROID}
System.SysUtils, FMX.Helpers.Android, Androidapi.JNIBridge,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes;
{$ENDIF}
{$IFDEF IOS}
const
  libSystemConfiguration =
    '/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration';
  kSCNetworkFlagsConnectionAutomatic = 8;
  kSCNetworkFlagsConnectionRequired = 4;
  kSCNetworkFlagsInterventionRequired = 16;
  kSCNetworkFlagsIsDirect = 131072;
  kSCNetworkFlagsIsLocalAddress = 65536;
  kSCNetworkFlagsReachable = 2;
  kSCNetworkFlagsTransientConnection = 1;
  kSCNetworkReachabilityFlagsConnectionAutomatic = 8;
  kSCNetworkReachabilityFlagsConnectionOnDemand = 32;
  kSCNetworkReachabilityFlagsConnectionOnTraffic = 8;
  kSCNetworkReachabilityFlagsConnectionRequired = 4;
  kSCNetworkReachabilityFlagsInterventionRequired = 16;
  kSCNetworkReachabilityFlagsIsDirect = 131072;
  kSCNetworkReachabilityFlagsIsLocalAddress = 65536;
  kSCNetworkReachabilityFlagsReachable = 2;
  kSCNetworkReachabilityFlagsTransientConnection = 1;
  kSCNetworkReachabilityFlagsIsWWAN = $40000;
{$ENDIF}
type
{$IFDEF IOS}
  SCNetworkReachabilityFlags = UInt32;
  SCNetworkReachabilityRef = ^__SCNetworkReachability;
  __SCNetworkReachability = record
  end;
  SCNetworkReachabilityContext = record
    version: CFIndex;
    info: Pointer;
    retain: function(info: Pointer): Pointer;
    release: procedure(info: Pointer);
    copyDescription: function(info: Pointer): CFStringRef;
  end;
  SCNetworkReachabilityContextPtr = ^SCNetworkReachabilityContext;
  SCNetworkReachabilityCallback = procedure(target: SCNetworkReachabilityRef;
    flags: SCNetworkReachabilityFlags; info: Pointer);
  TReachability = class;
  Reachability = interface(NSObject)
    ['{B405394F-57B1-4FF1-83D9-8FBFA38FFD7B}']
    function startNotifier: LongBool; cdecl;
    procedure stopNotifier; cdecl;
    function isReachable: LongBool; cdecl;
    function isReachableViaWWAN: LongBool; cdecl;
    function isReachableViaWiFi: LongBool; cdecl;
    function isConnectionRequired: LongBool; cdecl;
    function connectionRequired: LongBool; cdecl;
    function isConnectionOnDemand: LongBool; cdecl;
    function isInterventionRequired: LongBool; cdecl;
    function currentReachabilityStatus: NSInteger; cdecl;
    function reachabilityFlags: SCNetworkReachabilityFlags; cdecl;
    function currentReachabilityString: NSString; cdecl;
    function currentReachabilityFlags: NSString; cdecl;
  end;
  ReachabilityClass = interface(NSObjectClass)
    ['{39EC0490-2787-4BB9-95EA-77BB885BFD01}']
    function reachabilityWithHostname(hostname: NSString): Pointer; cdecl;
    function reachabilityForInternetConnection: Pointer; cdecl;
    function reachabilityWithAddress: Pointer; cdecl;
    function reachabilityForLocalWiFi: Pointer; cdecl;
  end;
  TReachability = class(TOCGenericImport<ReachabilityClass, Reachability>)
  end;
function SCNetworkReachabilityCreateWithAddress(allocator: CFAllocatorRef;
  address: psockaddr): SCNetworkReachabilityRef; cdecl;
  external libSystemConfiguration name _PU +
  'SCNetworkReachabilityCreateWithAddress';
function SCNetworkReachabilityCreateWithAddressPair(allocator: CFAllocatorRef;
  localAddress: psockaddr; remoteAddress: psockaddr): SCNetworkReachabilityRef;
  cdecl; external libSystemConfiguration name _PU +
  'SCNetworkReachabilityCreateWithAddressPair';
function SCNetworkReachabilityCreateWithName(allocator: CFAllocatorRef;
  nodename: PChar): SCNetworkReachabilityRef; cdecl;
  external libSystemConfiguration name _PU +
  'SCNetworkReachabilityCreateWithName';
function SCNetworkReachabilityGetTypeID: CFTypeID; cdecl;
  external libSystemConfiguration name _PU + 'SCNetworkReachabilityGetTypeID';
function SCNetworkReachabilityGetFlags(target: SCNetworkReachabilityRef;
  var flags: SCNetworkReachabilityFlags): Boolean; cdecl;
  external libSystemConfiguration name _PU + 'SCNetworkReachabilityGetFlags';
function SCNetworkReachabilitySetCallback(target: SCNetworkReachabilityRef;
  callout: SCNetworkReachabilityCallback;
  var context: SCNetworkReachabilityContext): Boolean; cdecl;
  external libSystemConfiguration name _PU + 'SCNetworkReachabilitySetCallback';
function SCNetworkReachabilityScheduleWithRunLoop
  (target: SCNetworkReachabilityRef; runLoop: CFRunLoopRef;
  runLoopMode: CFStringRef): Boolean; cdecl;
  external libSystemConfiguration name _PU +
  'SCNetworkReachabilityScheduleWithRunLoop';
function SCNetworkReachabilityUnscheduleFromRunLoop
  (target: SCNetworkReachabilityRef; runLoop: CFRunLoopRef;
  runLoopMode: CFStringRef): Boolean; cdecl;
  external libSystemConfiguration name _PU +
  'SCNetworkReachabilityUnscheduleFromRunLoop';
function SCNetworkReachabilitySetDispatchQueue(target: SCNetworkReachabilityRef;
  queue: dispatch_queue_t): Boolean; cdecl;
  external libSystemConfiguration name _PU +
  'SCNetworkReachabilitySetDispatchQueue';
{$IFDEF CPUARM}
function FakeLoader: Reachability; cdecl;
  external 'libReachability.a' name 'OBJC_CLASS_$_Reachability';
{$ENDIF}
{$ENDIF}
{$IFDEF ANDROID}
JConnectivityManager = interface;
JNetworkInfo = interface;
JNetworkInfoClass = interface(JObjectClass)
  ['{E92E86E8-0BDE-4D5F-B44E-3148BD63A14C}']
end;
[JavaSignature('android/net/NetworkInfo')]
JNetworkInfo = interface(JObject)['{6DF61A40-8D17-4E51-8EF2-32CDC81AC372}']
{ Methods }
function isAvailable: Boolean;
cdecl;
function isConnected: Boolean; cdecl;
  function isConnectedOrConnecting: Boolean; cdecl;
  end;
TJNetworkInfo = class(TJavaGenericImport<JNetworkInfoClass, JNetworkInfo>)
end;
JConnectivityManagerClass = interface(JObjectClass)
  ['{E03A261F-59A4-4236-8CDF-0068FC6C5FA1}']
{ Property methods }
function _GetTYPE_WIFI: Integer;
cdecl;
function _GetTYPE_WIMAX: Integer; cdecl;
  function _GetTYPE_MOBILE: Integer; cdecl;
  { Properties }
  property TYPE_WIFI: Integer read _GetTYPE_WIFI;
  property TYPE_WIMAX: Integer read _GetTYPE_WIMAX;
  property TYPE_MOBILE: Integer read _GetTYPE_MOBILE;
  end;
[JavaSignature('android/net/ConnectivityManager')]
JConnectivityManager = interface(JObject)
  ['{1C4C1873-65AE-4722-8EEF-36BBF423C9C5}']
{ Methods }
function getActiveNetworkInfo: JNetworkInfo;
cdecl;
function getNetworkInfo(networkType: Integer): JNetworkInfo; cdecl;
end;
TJConnectivityManager = class(TJavaGenericImport<JConnectivityManagerClass,
  JConnectivityManager>)
end;
{$ENDIF}
type
  TMobileNetworkStatus = class(TObject)
  public
    constructor Create;
    destructor Destroy; override;
    function isConnected: Boolean;
    function IsWiFiConnected: Boolean;
    function IsMobileConnected: Boolean;
  end;
implementation
{$IFDEF ANDROID}
function GetConnectivityManager: JConnectivityManager;
var
  ConnectivityServiceNative: JObject;
begin
  ConnectivityServiceNative := SharedActivityContext.getSystemService
    (TJContext.JavaClass.CONNECTIVITY_SERVICE);
  if not Assigned(ConnectivityServiceNative) then
    raise Exception.Create('Could not locate Connectivity Service');
  Result := TJConnectivityManager.Wrap
    ((ConnectivityServiceNative as ILocalObject).GetObjectID);
  if not Assigned(Result) then
    raise Exception.Create('Could not access Connectivity Manager');
end;
{$ENDIF}
{$IFDEF IOS}
function GetInternetReachability: Reachability;
begin
  Result := TReachability.Wrap
    (TReachability.OCClass.reachabilityForInternetConnection);
end;
{$ENDIF}
constructor TMobileNetworkStatus.Create;
begin
end;
destructor TMobileNetworkStatus.Destroy;
begin
  inherited;
end;
function TMobileNetworkStatus.isConnected: Boolean;
{$IFDEF ANDROID}
var
  ConnectivityManager: JConnectivityManager;
  ActiveNetwork: JNetworkInfo;
{$ENDIF}
begin
{$IFDEF IOS}
  Result := GetInternetReachability.isReachable;
{$ENDIF}
{$IFDEF ANDROID}
  ConnectivityManager := GetConnectivityManager;
  ActiveNetwork := ConnectivityManager.getActiveNetworkInfo;
  Result := Assigned(ActiveNetwork) and ActiveNetwork.isConnected;
{$ENDIF}
end;
function TMobileNetworkStatus.IsMobileConnected: Boolean;
{$IFDEF ANDROID}
var
  ConnectivityManager: JConnectivityManager;
  MobileNetwork: JNetworkInfo;
{$ENDIF}
begin
{$IFDEF IOS}
  Result := GetInternetReachability.isReachableViaWWAN;
{$ENDIF}
{$IFDEF ANDROID}
  ConnectivityManager := GetConnectivityManager;
  MobileNetwork := ConnectivityManager.getNetworkInfo
    (TJConnectivityManager.JavaClass.TYPE_MOBILE);
  Result := MobileNetwork.isConnected;
{$ENDIF}
end;
function TMobileNetworkStatus.IsWiFiConnected: Boolean;
{$IFDEF ANDROID}
var
  ConnectivityManager: JConnectivityManager;
  WiFiNetwork: JNetworkInfo;
{$ENDIF}
begin
{$IFDEF IOS}
  Result := GetInternetReachability.isReachableViaWiFi;
{$ENDIF}
{$IFDEF ANDROID}
  ConnectivityManager := GetConnectivityManager;
  WiFiNetwork := ConnectivityManager.getNetworkInfo
    (TJConnectivityManager.JavaClass.TYPE_WIFI);
  Result := WiFiNetwork.isConnected;
{$ENDIF}
end;
initialization
{$IFDEF IOS}
{$IFDEF CPUARM}
if False then
  FakeLoader;
{$ENDIF}
{$ENDIF}
end.

Notas Importantes

1- No exemplo que faz acesso ao status da rede/internet/3G, quando utilizado para iOS, faz-se necessário importar o framework “SystemConfiguration” no SDK Manager do Delphi ou C++ Builder. Detalhes de como fazê-lo estão neste post: http://delphi.radsoft.com.au/2013/10/adding-other-ios-frameworks-to-the-sdk-manager/

2- A leitura de código de barras para iOS faz uso da biblioteca ZBar, já inclusa neste projeto. Maiores detalhes e novas versões, aqui: http://zbar.sourceforge.net/

3- A leitura de código de barras para Android faz uso do aplicativo Zebra Crossing: https://play.google.com/store/apps/details?id=com.google.zxing.client.android

Outras fontes de pesquisa

Provavelmente você deve estar se perguntando o que mais é possível fazer, então vou listar abaixo algumas URLs interessantes que servirão como ponto de partida:

https://www.embarcadero.com/rad-in-action/programming-devices-and-gadgets

http://blogs.embarcadero.com/davidi/2014/01/09/43215

http://www.fmxexpress.com/tag/sdk/

É isso aí… abraços e até o próximo!

Traga suas aplicações para o Futuro!!!

Recentemente tivemos um Webinar sobre migração de aplicações Delphi para o XE5.

Caso o tenha perdido, já é possível acessar o replay através deste link:

http://forms.embarcadero.com/LA14Q1BRBDEApplicationstotheFuture

Também estão disponíveis os exemplos apresentados aqui:

http://cc.embarcadero.com/item/29777

Abraços e até o próximo!