O maior evento TMS da história

Prepare-se! Em novembro de 2019 acontece o maior evento TMS da história: TMS TRAINING DAYS 2019. Membros da equipe TMS de nove países diferentes falarão sobre desenvolvimento Delphi, bibliotecas e componentes TMS, em palestras que variam do nível básico até o avançado.

Training Days em Dusseldorf (Alemanha)

Nos dias 14 e 15 de novembro acontecem dois dias de treinamento em Dusseldorf, na Alemanha. O evento acontecerá no Lindner Hotel Airport.

Veja abaixo a programação completa para os dois dias.

TMS Business Masterclass
14 de Novembro – Dusseldorf, Alemanha

Bruno Fierens

9h00: Boas-vindas e Introdução (Bruno Fierens)
Boas-vindas a todos os participantes e introdução à programação.


Wagner Landgraf

9h15: Sessão 1 – O Mundo TMS Business (Wagner R. Landgraf) 
Uma jornada pelo mundo do pacote TMS Busines. Iremos aprender sobre as soluções incluídas no TMS Business: os componentes incluídos, as bibliotecas, os casos de uso, o contexto histórico de cada um deles e as motivações para seu desenvolvimento. Produtos analisados: TMS Scripter, TMS Diagram Studio, TMS Workflow Studio, TMS Data Modeler, TMS Aurelius, TMS Sparkle, TMS RemoteDB, TMS XData, TMS Echo, TMS Logging. 
*Nível BIZ: Iniciante


10h00: Coffee break


10h30: Sobre o livro TMS Aurelius (John Kouraklis)
O autor de livros técnicos John Kouraklis fala sobre seu mais recente livro dedicado ao TMS Aurelius e as experiências relacionadas a escrevê-lo.


Wagner Landgraf

11h00: Sessão 2 – Curtindo os Bancos de Dados (Wagner R. Landgraf) 
Uma conversa sobre novas formas de lidar com bancos de dados: O que é uma framework ORM? O que você pode usar para modelar seus bancos de dados. Produtos analisados: TMS Aurelius, TMS Data Modeler.
*Nível BIZ: Intermediário


Wagner Landgraf

12h00: Sessão 3 – Sua App em Todo Lugar: REST API (Wagner R. Landgraf) 
Multicamadas, nuvem, REST, HTTP, SSL: O que, por que, quando e, principalmente, como? Aprenda o que significa um servidor REST, por que você irá se beneficiar em migrar sua aplicação para a nuvem e como fazê-lo de forma RAD. Produtos analisados: TMS XData, TMS Sparkle.
*Nível BIZ: Intermediário


13h00: Almoço


Wagner Landgraf

14h00: Sessão 4 – Os Heróis Anônimos (Wagner R. Landgraf) 
Uma análise mais profunda de três produtos TMS Business que trazem soluções para problemas que você nunca pensou que tinha. Aplicações customizadas pelo usuário, alteração de regras de negócio em runtime, sincronização de dados offline, e migração de sua aplicação para a nuvem em poucos dias. Produtos analisados: TMS Scripter, TMS Echo, TMS RemoteDB.
*Nível BIZ: Iniciante


Wagner Landgraf

15h00: Sessão 5 – Falando Sério sobre a Nuvem (Wagner R. Landgraf) 
Técnicas e conceitos avançados sobre construir servidores REST API: Segurança, processamento em background e análise de códigos do mundo real. Produtos analisados: TMS XData, TMS Sparkle.
*BIZ level: Advanced 


16h00: Coffee break


Wagner Landgraf

16h30: Session 6: Todos Juntos (Wagner R. Landgraf) 
Uma sessão bastante interativa onde serão apresentadas todas as ideias da equipe TMS para o futuro do TMS Business. Iremos discutir o roadmap, faremos um brainstorm sobre as possibilidades e teremos uma sessão de perguntas e respostas.


17h30: Encerramento


TMS DEV Intensive
15 de Novembro – Dusseldorf, Alemanha

Bruno Fierens

9h00: Boas-vindas e Introdução (Bruno Fierens)
Boas-vindas a todos os participantes e introdução à programação.


Bruno Fierens

9h15: TMS VCL UI Pack: Novidades (Bruno Fierens)
O que é de novo e porvir em controles VCL: high-DPI, VCL styles, Office styles, images.


Marion Candau

10h15: Usando o TMS Cryptography Pack para assinar arquivos PDF (Marion Candau)
Marion irá mostrar como assinar documentos PDF usando um token USB com o TMS Cryptography Pack. Serão explicados os mecanismos de criptografia e uma assinatura eletrônica, e o processo de assinatura.


10h45: Coffee break


Adrian Gallero

11h15: TMS Flexcel 7.0: Usando as novas features (Adrian Gallero)
Adrian irá mostrar como criar aplicações para exportar dados para Excel e PDF, usando as últimas novidades introduzidas no Flexcel 7. Também serão mostradas os futuros planos para o Flexcel.


12h15: Almoço


José León Serna

13h15: Novos novos produtos de impacto para o mundo Delphi (José León Serna / Bruno Fierens)
Há mais de um ano, Bruno Fierens, CEO da tmssoftware.com entrou em contato com José Leon Serna para discutir futuras oportunidades para desenvolvedores Delphi. Desde então, uma intensa colaboração começou e nessa sessão os frutos dessa parceria serão mostrados.


Roman Yankovsky

14h15: Usando TMS FixInsight para deixar seu código mais robusto (Roman Yankovsky)
Roman mostrará como usar a análise de código do FixInsight no Delphi para encontrar bugs no seu código, antes que seus clientes façam isso!


15h15: Coffee break


Roman Kassebaum

15h45: TMS WEB Core v1.3 para web, aplicações multiplataforma com Electron e PWA (Bruno Fierens / Roman Kassebaum)
Junto com Bruno Fierens, Roman Kassebaum, arquiteto da integração do TMS WEB Core com a IDE do Delphi, irá mostrar os novos recursos e possibilidades do TMS WEB Core versão 1.3.


Holger Flick

16h45: Misturando tudo: Usando TMS XData backend e TMS WEB Core + TMS FNC UI como front-end (Holger Flick)
Muitas frameworks, muitas plataformas: TMS tem todas as ferramentas. Você já leu sobre isso, mas como usar todas essas tecnologias juntas? Em resumo, você verá um exemplo prático usando TMS XData, TMS RemoteDB, TMS Web Core, VCL, and FNC.


17h45: Perguntas e Respostas e Encerramento. 


Training Day em Wevelgem (Bélgica)

No dia 18 de novembro, haverá um segundo TMS Business Masterclass em Wevelgem, Bélgica. O evento acontecerá na sede da TMS Software. É também uma oportunidade para conhecer a equipe da TMS!

As palestras serão similares à do TMS Business Masterclass em Dusseldorf no dia 14 de Novembro, portanto segue a agenda simplificada. Todas as palestras serão apresentadas por Wagner Landgraf e Bruno Fierens.

TMS Business Masterclass
18 de Novembro – Wevelgem, Bélgica

Palestrantes:

Bruno Fierens
Wagner Landgraf

9h00: Boas-vindas e Introdução (Bruno Fierens)


9h15: Sessão 1 – O Mundo TMS Business (Wagner R. Landgraf) 


10h00: Coffee break


10h30: Sessão 2 – Curtindo os Bancos de Dados (Wagner R. Landgraf)  


11h30: Sessão 3 – Sua App em Todo Lugar: REST API (Wagner R. Landgraf) 


12h30: Almoço


13h30: Sessão 4 – Os Heróis Anônimos (Wagner R. Landgraf) 


14h30: Sessão 5 – Falando Sério sobre a Nuvem (Wagner R. Landgraf) 


15h30: Coffee break


16h00: Session 6: Todos Juntos (Wagner R. Landgraf) 


17h00: Encerramento


PALESTRANTES

Adrian Gallero (Uruguay)

Adrian Gallero é um engenheiro elétrico que trabalha com Delphi desde o Turbo pascal 4. Ele trabalhou no cálculo da distribuição de linhas de energia para empresas elétricas em Montevidéu e no Rio de Janeiro. Viveu por mais de 3 anos em Madri, trabalhando no desenvolvimento de um sistema de gerenciamento de telecomunicações, e mais de um ano em Sydney desenvolvendo soluções personalizadas para uma empresa de expedição de carga.

Ele trabalha com planilhas há mais tempo do que se lembra e, em 1996, desenvolveu um pequeno componente que permitia que seus aplicativos Delphi 1 exportassem os resultados para uma planilha (para sua surpresa, ele aprendeu há um ano que a empresa elétrica ainda está usando esses aplicativos até hoje sem modificações). Esse componente cresceu ao longo dos anos: foi renomeado para FlexCel em 2001 e ingressou na família TMS em 2002. Atualmente, o FlexCel existe nas versões Delphi e .NET e contém mais de um milhão de linhas de código.


Bruno Fierens (Bélgica)

  • Estudou engenharia eletrônica na universidade de Ghent, Bélgica (1987-1992).
  • Iniciou uma carreira como engenheiro de hardware digital de P&D na Barco Graphics Belgium, projetando com FPGA, VHDL, processadores gráficos, PCI, placas complementares Silicon Graphics, controladores de impressoras de ponta, …
  • Começou a escrever software no Turbo Pascal 3.0 desde 1987 e usou todas as versões do Borland Pascal e Delphi desde então.
  • Fundou a TMS Software em 1996, desenvolvendo componentes VCL começando com Delphi 1.
  • A TMS Software se tornou o Borland Technology Partner em 1998 e desenvolveu os componentes de grid premiados pela Delphi Informant.
  • A partir de 2011, os surgiram os componentes multiplataforma FireMonkey, para Windows, macOS, Android e iOS.
  • Em 2016, a TMS Software lançou o FNC, uma arquitetura de componentes que permite usar controles visuais em aplicativos VCL, FMX e LCL.
  • Em 2018, a TMS Software lançou o TMS WEB Core, uma framework para criar aplicações Web usando o ObjectPascal.
  • Atualmente gerencia a equipe de desenvolvimento de VCL, FMX, Web, .NET, IoT, LCL, REST, node.js.
  • É palestrante frequente em conferências (Be-Delphi, DelphiTage, ITDevCon, CodeWay Tour, EKON, DevTracks, SDN, ..).
  • Disponível para consultoria e desenvolvimento de projetos personalizados.
  • Bruno Fierens foi nomeado Embarcadero MVP em 2012.
  • Área de interesse especial são design de interfaces de usuário, UX, desenvolvimento de software RAD, hardware / eletrônicos.

Holger Flick (Estados Unidos)

Desde 1996, o Dr. Holger Flick usa o Delphi como sua principal plataforma de desenvolvimento e tem sido um membro ativo da comunidade. Ele estudou ciência da computação na Universidade de Dortmund e depois escreveu sua dissertação na Universidade Ruhr, em Bochum, no campo da telemedicina. Por sua paixão e conhecimento de Delphi, ele foi nomeado “Delphi MVP” em 2016.

Em 2019, Holger mudou-se para os Estados Unidos da América (EUA) e fundou sua nova empresa FlixEngineering LLC. A empresa se concentra em consultoria, treinamento e desenvolvimento de software usando linguagens de programação orientada a objetos como Delphi, C #, Swift e Objective-C. Holger faz parte da família TMS Software, fornecendo sua experiência como evangelista e engenheiro de controle de qualidade.


John Kouraklis (Reino Unido)

John Kouraklis começou a usar computadores aos 16 anos e desde então vem usando Pascal, desde o Turbo Pascal até as últimas versões do Delphi, inicialmente como hobby depois como uma profissão durante a maior parte de sua vida adulta. Ele desenvolveu uma ampla gama de aplicações, de software financeiro a ferramentas de engenharia reversa. Nos últimos anos, ele ensina administração e programação em cursos de graduação e pós-graduação. Ele é o autor do MVVM em Delphi (Apress, 2016) e Introdução ao Delphi ORM – ORM com TMS Aurelius (julho de 2019).


José León Serna (Espanha)

Criador do Delphi para PHP / HTML5 Builder e ex-diretor de engenharia e gerente de filial da Embarcadero Technologies entre 2010 e 2016. Embora a filial da Embarcadero tenha participado do desenvolvimento de vários produtos, ele foi o principal responsável pelo RAD Studio e, mais especificamente, pelo IDE . Ele participou ativamente da concepção e implementação de uma infinidade de novos recursos, especialmente focados no desenvolvimento de vários dispositivos. Ele esteve envolvido no desenvolvimento de IDE na maior parte de sua carreira e é a área em que ele mais gosta.


Marion Candau (França)

  • PhD em criptografia
  • Desenvolvedora da Cyberens, uma empresa francesa de segurança cibernética localizada em Bordeaux.
  • Arquiteta do TMS Cryptography Pack.
  • Embarcadero MVP.
  • Ela desenvolve principalmente aplicativos relacionados à segurança cibernética e aconselha os clientes a usar ferramentas e bibliotecas criptográficas em seus próprios aplicativos.

Roman Kassebaum (Alemanha)

Roman Kassebaum é freelancer. Ele começou a trabalhar com o Delphi em 1996, depois de se formar em mestrado pela Universidade de Paderborn. Ele é um MVP do Delphi e um parceiro tecnológico da Embarcadero. Nos últimos anos, se tornou membro da grande equipe da TMS e também é um parceiro de consultoria certificado pela TMS. Roman é especialista em todos os tipos de projetos Delphi, incluindo componentes de negócios TMS e a avançada biblioteca TMS WEB Core para a qual ele criou a integração do Delphi IDE.


Roman Yankovsky (Rússia)

Roman Yankovsky é um Embarcadero MVP que trabalha com a Delphi desde o Delphi 2. Ele ingressou na equipe TMS em 2016. É gerente de produtos e arquiteto da ferramenta de análise estática FixInsight para Delphi.

Roman Yankovsky também é o autor do Delphi AST, uma framework open source para análise sintática para linguagem Delphi, que pode ser encontrada aqui: https://github.com/RomanYankovsky/DelphiAST. Essa excelente biblioteca é usada na extensão para Visual Studio OmniPascal.


Wagner Landgraf (Brasil)

  • Formado em Engenharia Eletrônica e Mestre em TI Industrial pela Universidade Tecnológica Federal do Paraná.
  • Mais de 24 anos de experiência (desde 1995) no desenvolvimento Delphi – desde Delphi 1.
  • Arquiteto e desenvolvedor principal de bibliotecas Delphi como TMS Aurelius, TMS XData, TMS RemoteDB, TMS Scripter, entre outros.
  • Gerente de produtos da TMS Software há mais de 20 anos.
  • Fundador do site landgraf.dev e da Nuvem Fiscal.

Bônus Especiais

Há também bônus especiais para os participantes do TMS Training Days!

Livro: Introducing Delphi ORM

Todos os participantes do TMS Business Masterclass em Dusseldorf (14 de novembro) receberão uma cópia gratuita do livro “Introducing Delphi ORM: Mapeamento Objeto-Relacional usando o TMS Aurelius”, escrito por John Kouraklis. Wagner Landgraf, autor do TMS Aurelius, foi um revisor técnico do livro.


Curso “Introdução ao TMS Web Core”: 50% de desconto

Todos os participantes do TMS Training Days receberão um cupom de 50% de desconto coupon para o curso online “Introduction to TMS Web Core”, da landgraf.dev. O instrutor Wagner Landgraf ensinará os conceitos desde o início: o que é um aplicativo da Web, como funciona, o que é o SPA (aplicativo de página única) e o MPA (aplicativo de página múltipla), o que é HTML, JavaScript, CSS, Bootstrap , AJAX. O código fonte completo dos exemplos é fornecido.


Descontos especiais para produtos TMS

A TMS Software também oferecerá descontos especiais para novas licenças de vários produtos TMS, para todos os participantes. Fique atento às ofertas!

Inscrição e mais informações

Você pode encontrar mais informações diretamente do site da TMS Software: TMS Training Days em Dusseldorf e TMS Business Masterclass em Wevelgen.

Valores para inscrição

Nov 14, TMS Business MasterClass: 295 EUR 
Nov 15, TMS Dev Intensive: 295 EUR
Nov 18, TMS Business Masterclass: 295 EUR

Oferta especial para os dois dias em Dusseldorf (14 e 15 de Novembro): 495 EUR 

Emissor NFC-e na nuvem? Confira na Embarcadero Conference!

No dia 22 de outubro de 2019, teremos mais uma edição da Embarcadero Conference. É o maior evento de Delphi do mundo, e acontece aqui no nosso país, em São Paulo. São centenas de participantes.

Nessa edição, assim como no ano passado, teremos sete palestras simultâneas em cada horário, todas acontecendo no mesmo auditório. Você escolhe qual palestra assistir selecionando o canal de áudio correspondente no seu fone de ouvido. A agenda completa está disponível no site do evento.

Com tantas palestras acontecendo ao mesmo tempo, dá até uma ansiedade em conseguir escolher qual palestra assistir. Mas se tem uma palestra que você não pode perder, é esta que vamos sugerir.

Nosso palestrante, Wagner Landgraf, estará apresentando a palestra “Anatomia de um emissor NFC-e na nuvem (REST API)“. Ah sim, estamos recomendando nossa própria palestra. Mas isso é uma mera coincidência, será muito interessante, acredite!

Por que “na nuvem”?

Ok, vamos dar uma palhinha aqui e adiantar algumas coisas. Uma delas é o “porquê”. Quando emitimos um documento fiscal (como NFC-e) com um sistema “na nuvem”, temos uma série de vantagens em relação à emissão do mesmo documento fiscal num sistema desktop ou mobile.

Só pra esclarecer aos mais iniciantes, um sistema “na nuvem” seria uma aplicação rodando na internet em um serviço como Amazon EC2/Lightsail, Microsoft Azure, etc. Isso ficaria acessível a de chamadas HTTP realizadas de qualquer lugar (outras aplicações desktop, outros sites, aplicações mobile, etc.). Isso traz inúmeras vantagens:

  • Um único e centralizado lugar pra configuração do ambiente de emissão (instalação de certificados, configuração de bibliotecas de criptografia, etc.)
  • Reduz o risco de problemas e custo de suporte em ficar configurando centenas de computadores nos clientes
  • Atualização e manutenção do sistema muito mais fácil – também não é necessário atualizar todos os clientes
  • Possibilidade de emitir NFC-e (e outros documentos fiscals) de qualquer plataforma (de uma aplicação desktop Windows, de uma aplicação mobile, até mesmo de um Raspberry PI, por que não?). Basta que haja conexão internet nessa plataforma.
  • Facilidade de desenvolver clientes em outras plataforma. Que tal desenvolver um PDV no mobile de forma muito fácil? Não há necessidade de portar e compilar bibliotecas complexas como emissores fiscais (ACBr por exemplo), geradores de relatório (FastReport, FortesReport), entre outros.

Dá pra falar mais um pouco?

Queremos você lá assistindo e interagindo! Mas pra atiçar um pouco a curiosidade, deixamos abaixo uma captura da tela de parte da documentação da API. Já dá pra ter uma ideia. Na conference iremos esmiuçar tudo isso!

Não é só isso…

Essa palestra será realmente interessante. Haverá mais uma surpresa que, temos certeza, causará um grande impacto em todos aqueles que trabalham com Delphi nessa área fiscal. Isso tudo é só o começo… Nos vemos na Embarcadero Conference 2019!

Bancos de Dados no Ecossistema Delphi: Webinar

No dia 10 de outubro a Softacom estará apresentando um webinar sobre “Bancos de dados no ecossistema do RAD Studio & Delphi. Processo de migração (legado para atualizado, para outro RDBMS), arquiteturas de camadas de dados (ORM), arquiteturas de acesso a dados (REST API)”.

Palestrantes

Wagner Landgraf da landgraf.dev será um dos palestrantes, falando sobre como o acesso a banco de dados evoluiu no Delphi desde suas versões iniciais, sobre Mapeamento Objeto Relacional (TMS Aurelius), Servidores API REST (TMS XData) e acesso remoto a bancos de dados (TMS RemoteDB).

Serge Pilko

Embarcadero MVP & CEO da Softacom

Wagner Landgraf

CEO da landgraf.dev / TMS Software Partner / TMS Business Product Manager

Bruno Fierens

Embarcadero MVP & CEO da TMS Software

O que você irá aprender

Para CEO / Gerentes / CTO / Diretores de TI / Gerente de Produtos:

  • Soluções Delphi atualizadas e frameworks para comunicação com bancos de dados;
  • Armadilhas na atualização do sistema e/ou migração para outro RDBMS;
  • Abordagens e práticas modernas com Delphi e RDBMS;
  • Arguments: vantagens de se utilizar Delphi e RAD Studio para sua aplicação multicamadas;

Para Desenvolvedores e Especialistas Técnicos:

  • Melhores práticas para desenvolver camadas de acesso a dados em projetos RAD Studio;
  • Como usar ORM para projetos Delphi;
  • Como desenvolver servidores REST API como um facade DB;
  • Dicas e truques para desenvolvedores diretamente dos arquitetos de frameworks e ferramentas para Bancos de Dados;

Principais Tópicos do Webinar

  • Padrões de acesso a dados 10-15 anos atrás e hoje
  • Armadilhas na migração de aplicações RDBMS legadas para versões atualizadas;
  • Prós e contras na migração para ORM em lugar de práticas tradicionais;
  • ORM para Delphi: TMS Aurelius – prós e contras da solução;
  • Prós e contras da migração para REST API em vez do uso “clássico” de acesso ao BD;
  • REST API server for Delphi ─ TMS XData. Prós e contras.

Somente para participantes do Webinar!

Não perca a chance de obter seu desconto promocional para novas licenças de produtos TMS Software e para a EKON conference!

Registration

Link para inscrição: https://www.softacom.com/en_softacom_october_webinar. *Todas as palestras em inglês.

5 Motivos para Usar Variáveis Inline no Delphi

O que é esse novo recurso de declaração de variáveis inline (inline variables) do Delphi, surgido na versão Rio 10.3?

Em resumo, é a possibilidade de se declarar uma variável em qualquer linha do seu código. Ou seja, você pode declarar uma variável da forma a seguir, dentro do bloco begin..end:

procedure Test;
begin
  var I: Integer;
  I := 22;
  ShowMessage (I.ToString);
end;

Muita gente já entendeu como esse recurso funciona, mas não entendeu por que ele é interessante. Neste artigo, vou mostrar essa nova funcionalidade com enfoque nas vantagens que ela traz.

1. Organiza seu código

A variável só passa a ser acessível a partir do ponto que ela é declarada. Pra muitas pessoas isso organiza melhor o código num método grande, pois é possível saber melhor onde aquela variável está sendo usada. Considere o seguinte código:

procedure Test;
var 
  A, B, C, D, E: Integer;
  Found, Done, Excluded: Boolean;
  Text: string;
begin
   // muitas
   // linhas
   // de 
   // código
end;

Pode ser confuso saber onde são usadas todas essas variáveis, quando elas estão sendo inicializadas, se ela já foi altera anteriormente, etc.. No código a seguir, sabemos que a variável Text por exemplo não existe no começo do código, e que ela só é utilizada ao final. Ninguém “mexeu” nela antes dessa parte do código:

procedure Test;
begin
   var A, C: Integer;
   // Não podemos usar o Text aqui!
   // linhas
   // de 
   // código
   
   var Text: string;
   // Text só pode ser usada aqui
end;

2. Minimiza bugs

Quem nunca cometeu esse deslize:

procedure Test;
var I: Integer;
begin
  for I := 0 to Count - 1 do
    Process;
  FazAlgoComI(I);
end;

Ou seja, usar a variável do for depois de terminado o loop. Isso não é seguro, e apesar do compilador emitir um warning pra isso, muitas pessoas o ignoram. Usando declaração inline do for, a variável só é válida dentro do for, e usá-la fora do bloco resultará em um erro de compilação:

procedure Test;
begin
  for var I: Integer := 0 to Count - 1 do
    Process;
  FazAlgoComI(I); // Erro de compilação!!
end;

A vantagem acima vem do fato de que o escopo das variáveis é limitado ao bloco em que elas são declaradas. Declarando as variáveis apenas dentro do escopo em que elas são usadas também minimiza a chance de erros. Por exemplo, suponha que você tem um código assim:

procedure Test;
var I: Integer;
begin
  I := CalculaAlgo;
  Persiste(I);
  // muuuuitas linha depois...
  Loga(I);
end;

Então você precisa refatorar esse código de modo que a primeira parte só aconteça em uma determinada condição. Você acha que só ali a variável I está sendo usada, e faz algo assim:

procedure Test;
var I: Integer;
begin
  if Condicao then
  begin
    I := CalculaAlgo;
    Persiste(I);
  end;
  // muuuuitas linha depois...
  Loga(I);
end;

Pronto, você esqueceu da última linha e talvez o valor de I não seja o que você espera. Alterando o escopo da sua variável para o bloco irá gerar erros de compilação caso a variável seja usada fora do bloco, o que vai lhe mostrar o problema imediatamente para você tomar uma decisão:

procedure Test;
begin
  if Condicao then
  begin
    var I: Integer;
    I := CalculaAlgo;
    Persiste(I);
  end;
  // muuuuitas linha depois...
  Loga(I); // Erro de compilação!
end;

3. Economiza digitação

Quem não quer mais produtividade? Se você puder digitar um pouco menos pra declarar uma variável, por que não? Agora é possível declarar e inicializar uma variável ao mesmo tempo:

procedure Test;
begin
  var I: Integer := 22; 
  ShowMessage (I.ToString);
end;

Mas não só isso. Há também a inferência de tipo, o que significa que na maioria dos casos você não precisa incluir o tipo da variável ao declará-la. Basta o código de inicialização para o Delphi saber qual é o tipo da variável.

Parece pouco? Imagine um caso onde o tipo da variável é uma coisa assombrosa usando generics:

procedure NewTest;
var
  MyDictionary: TObjectDictionary<string, TObjectList<TMyAmazingClass>>;
  Pair: TPair<string, TObjectList<TMyAmazingClass>>;
  List: TObjectList<TMyAmazingClass>;
begin
  MyDictionary := TObjectDictionary<string, TObjectList<TMyAmazingClass>>.Create;
  MyDictionary.Add('one', CreateList);
  Pair := MyDictionary.ExtractPair('one');
  List := Pair.Value;
  ShowMessage(List.Count.ToString);
end;

Com a declaração inline e a inferência de tipo, você pode reescrever o código desta forma:

procedure NewTest;
begin
  var MyDictionary := TObjectDictionary<string, TObjectList<TMyAmazingClass>>.Create;
  MyDictionary.Add('one', CreateList);
  var Pair := MyDictionary.ExtractPair('one');
  var List := Pair.Value;
  ShowMessage(List.Count.ToString);
end;

Melhor, não?

4. Aumenta a performance

O fato de as variáveis pertencerem a um escopo mais limitado (dentro de um bloco begin..end) pode até aumentar a performance do código!

Você pode ver mais detalhes sobre isso neste excelente artigo: Inline Variables can increase performance. Mas em resumo: a variável será inicializada apenas se e quando a execução entrar no código, e será finalizada imediatamente quando a execução sair do código. Ou seja, neste código:

procedure TestInlineVars(const ACondition: Boolean);
begin
  // BEFORE
  if (ACondition) then
  begin
    var S := 'Inline String';
    var I: IInterface := TInterfacedObject.Create;
    var F: TFoo;
    F.S := 'Managed Record';
  end;
  // AFTER
end;

As variáveis S, I e F são tipos gerenciados (string, interface e record). O compilador adiciona automaticamente código para inicializar e finalizar essas variáveis.

Se você chamar a procedure TestInlineVars milhões de vezes, isso terá um impacto grande. Porém com o código acima, essas variáveis só serão inicializadas caso ACondition seja verdadeiro e o bloco seja efetivamente executado. Menos código desnecessário sendo executado.

5. Facilita o uso de diretivas de compilação

Até em pequenas coisas esse recurso pode ajudar. Isso me chamou a atenção ao ler este post: Unexpected Benefit of Inline Variables: Conditional Blocks, que mencionou esse benefício.

Se você usa diretivas de compilação onde declara diferentes variáveis para cada situação, você tem que colocar diretivas na declaração também:

procedure DoesSomething;
var
  {$IFDEF CASE1}
  var1: Integer;
  {$ENDIF}
  {$IFDEF CASE2}
  var2: Integer;
  {$ENDIF
begin
  {$IFDEF CASE1}
  // use var1
  {$ENDIF}
  {$IFDEF CASE2}
  // use var2
  {$ENDIF}
end;

Chato, hein? Acho que assim fica mais fácil e legível:

procedure DoesSomething;
begin
  {$IFDEF CASE1}
  var1: Integer;
  // use var1
  {$ENDIF}
  {$IFDEF CASE2}
  var2: Integer;
  // use var2
  {$ENDIF}
end;

Acredito que as variáveis inline tenham ainda outros sutis benefícios, em situações específicas, que não tenha listado aqui. Caso suspeite de mais algum, deixe seu comentário. Se não concordou com os benefícios e acha que as variáveis inline não são uma boa novidade para o Delphi, comente também. Só não se esqueça de uma coisa: se não gostou, é só não usar!

O que gostei no Delphi Rio 10.3.2 update

A Embarcadero acabou de lançar uma nova versão do Delphi Rio (e consequentemente do Rad Studio e C++ Builder): a versão 10.3.2.

É uma atualização “menor” – ou seja, uma alteração no terceiro dígito do número de versão, de 10.3.1 para 10.3.2. Também significa que o codinome do produto ainda é “Rio”, e que os arquivos binários (leia-se DCU’s) são compatíveis com a versão anterior 10.3.1. Com isso, você não precisará recompilar os packages instalados no Delphi.

Por que então um artigo sobre isso? Em geral, atualizações menores contêm apenas pequenas correções e melhorias, porém não é o caso desta. Listo aqui duas novidades que pessoalmente considero significativas. Não custa lembrar que a Embarcadero recentemente publicou o Roadmap do Rad Studio – Maio de 2019 que lista o que eventualmente será incluído nas próximas versões “maiores” do Delphi. Agora, vamos às melhorias:

Suporte ao macOS 64-bit

O Delphi 10.3.2 inclui, finalmente, suporte a aplicações macOS 64-bit. Se você desenvolve aplicações para macOS com o Delphi, sabe o quanto isso é importante.

A Apple está há anos planejando e informando seus usuários de que as aplicações macOS 32-bit deixarão de funcionar. E essa hora chegou. No macOS Mojave, ao abrir aplicações 32-bit (as criadas com Delphi, por exemplo), os usuários tem recebido a seguinte mensagem:

App não está otimizado para o Mac e precisa ser atualizado

Eu diria que com uma mensagem dessa seu aplicativo não inspira muita confiança para o usuário, concorda? Ainda, na próxima versão do macOS, o macOS Catalina (10.15), as aplicações 32-bit simplesmente não funcionarão mais!

Portanto, para você que desenvolve (ou pretende desenvolver) aplicativos macOS com o Delphi, é um alívio saber que isso não é mais um problema: é só gerar os aplicativos em 64-bit e estará tudo certo!

Estabilidade e performance da IDE

Outra melhoria digna de nota é a melhora significa na estabilidade e performance na IDE. A versão inicial do Delphi Rio trouxe uma IDE renovada, com tema dark e um visual mais moderno. Mas também haviam “efeitos” visuais estranhos, lentidões, a tela era redesenhada várias vezes ao redimensionar, maximizar, entre outros problemas.

Isso foi melhorado e muito nessa nova versão. Se você já esta usando o Delphi Rio, acredito que vai sentir a diferença com uma IDE mais fluida e mais rápida em vários aspectos.

O Delphi Rio 10.3.2 já está disponível! Existem várias outras melhorias além dessas citadas. Se já estiver usando este última versão, deixe um comentário contando o que achou!

O que são memory leaks e quais suas consequências?

Um memory leak (ou vazamento de memória) acontece quando sua aplicação aloca um espaço na memória e nunca mais o libera.

Como os memory leaks acontecem em Delphi

Em uma aplicação Delphi, espaços de memória são alocados e liberados o tempo todo. Muitas vezes isso é feito automaticamente pelo compilador ou pela RTL – por exemplo, ao alocar variáveis de tipos primitivos, parâmetros que são passados a funções, etc. – e não precisamos nos preocupar com isso.

Porém, existem muitos casos em que nós alocamos memória manualmente. Um dos mais comuns acontece ao instanciar um objeto:

Obj := TMyObject.Create;

A linha de código acima irá alocar um espaço de memória e a variável Obj irá apontar para esse endereço alocado. Para liberar o espaço, pode-se usar o método Free:

Obj.Free;

Se o desenvolvedor esquecer de chamar o método Free, o espaço de memória associado ao objeto nunca é liberado. Temos um memory leak.

Consequências dos memory leaks

Você pode se perguntar: "Qual o problema? Já vi isso acontecer na minha aplicação e nunca tive nenhum problema prático!".

Realmente, em geral, não se sente muito os efeitos, quando são poucos memory leaks. Mas as consequências tem intensidades diferentes dependendo do tipo de aplicação.

Aplicações no cliente (desktop ou mobile)

Em geral, em aplicações desktop ou mobile, o efeito não é muito grave. Nos sistemas operacionais atuais, em geral a memória alocada pela aplicação é liberada quando a aplicação é encerrada, de modo a não causar instabilidade no sistema.

Mesmo assim, se sua aplicação gera muitos memory leaks, podem acontecer alguns problemas, causados pelo uso excessivo da memória:

  • Lentidão da aplicação e/ou do sistema: Acesso a disco pode ser necessário pra contornar a falta de memória.

  • Fechamento abrupto da aplicação: O sistema operacional pode forçar a finalização do sistema devido ao uso excessivo de memória. Isso é mais comum em aplicações mobile.

  • Bugs no sistema: Partes do sistema que alocam memória podem começar a falhar e causar bugs.

Aplicações no servidor

Quando se fala em aplicativos servidores, o problema fica pior. Isso porque idealmente você nunca irá fechar o servidor – você quer que ele rode para "sempre", sem se incomodar.

As consequências são praticamente as mesmas das aplicações desktop, mas como teoricamente o servidor nunca fecha, qualquer pequeno memory leak terá consequências futuramente. A memória será lentamente consumida ao longo de dias, semanas, meses, e seu servidor começará a apresentar lentidão, bugs e eventualmente irá parar de funcionar.

Como evitar os memory leaks

Existem técnicas e ferramentas para lhe ajudar a detectar e remover os memory leaks da sua aplicação. Isso será abordado em posts futuros.

E você? Já sentiu teve problemas com memory leaks na sua aplicação? Ou considera um item de baixa prioridade e tem coisas mais importantes pra se preocupar no seu código? Deixe seu comentário!