Resoluciones de Año Nuevo: Migre Sus Proyectos a Windows 10

Además de todas las expectativas que tenemos con la llegada de un nuevo año, nuevos proyectos, nuevos clientes, nuevos productos, 2020 también trae, justo en su primer mes, el final del ciclo de vida de Windows 7 (https: // www. microsoft.com/windows/windows-7-end-of-life-support-information).

https://solinkit.com/wp-content/uploads/2019/09/windows7notification.0-1080x675.jpg

RAD Studio ofrece soporte de primera clase para Windows 10, y la migración de sus proyectos para soportar las últimas tecnologías del sistema operativo de Microsoft tiende a ser bastante fluida.

Modernice las aplicaciones VCL para soportar Windows 10 con controles de interfaz de usuario actualizados, API de WinRT, características relacionadas con HighDPI y compatibilidad con la Windows Store.

Para mostrarle todo lo posible con Windows 10 y ayudarlo con la inspiración, ¡aquí hay una lista de seminarios con nuestros mejores expertos en Windows 10!

Hay un total de doce geniales videos en total:

 

RAD Studio 10.3 Test Drive, Versión 3

Para competir en el mundo acelerado de las aplicaciones, debe reducir el tiempo de desarrollo y llegar al mercado más rápido que sus competidores. Nuestros clientes nos dicen que desarrollan aplicaciones 5 veces más rápidas utilizando nuestros IDE.

¡Haga una prueba de 30 días gratis de RAD Studio Architect Edition haciendo clic aquí!

 

Resoluções de Ano Novo: Migrar seus Projetos para Windows 10

Além de todas as expectativas que temos com a chegada de um novo ano, novos projetos, novos clientes, novos produtos, 2020 traz também – logo em seu primeiro mês – o final do ciclo de vida do Windows 7 (https://www.microsoft.com/pt-br/windows/windows-7-end-of-life-support-information).

https://solinkit.com/wp-content/uploads/2019/09/windows7notification.0-1080x675.jpg

O RAD oferece suporte de primeira classe para Windows 10, e a migração de seus projetos para suportar as mais recentes tecnologias do sistema operacional da Microsoft tende a ser bastante suave!

Modernize os aplicativos VCL para oferecer suporte ao Windows 10 com controles atualizados da interface do usuário, APIs do WinRT, recursos relacionados ao HighDPI e suporte da Windows Store.

Para mostrar tudo o que é possível com Windows 10, ajudar com a inspiração e também com a transpiração, segue abaixo um playlist de webinars com nossos melhores especialistas em Windows 10!

São ao todo um total de doze ótimos vídeos:

 

Test Drive do RAD Studio 10.3, versão 3

Para competir no mundo dos aplicações em ritmo acelerado, você deve reduzir o tempo de desenvolvimento e chegar ao mercado mais rapidamente do que seus concorrentes. Nossos clientes nos dizem que desenvolvem aplicativos 5x mais rapidamente usando nossos IDEs.

Faça um teste grátis por 30 dias do RAD Studio Architect Edition clicando aqui!

Feliz Aniversário Delphi! #ILoveDelphi

ilovedelphi

Chegamos a mais um aniversário do Delphi, e podemos atestar que o aniversariante encontra-se em ótima forma ao completar seus 22 anos, um jovem na verdade!

Neste tempo todo, poucas tecnologias tiveram tamanha capacidade de se manter tão atualizadas, inovadoras e seguir ditando tendências. A começar pelo conceito do RAD, criado pela então Borland, e presente nas principais ferramentas da atualidade, até os dias atuais, com um dos melhores suportes para desenvolvimento cross-platform disponível no mercado!

Para marcar o dia, algumas fotos de pequenos tesouros e lembranças que mantenho da minha participação nesta história, afinal lá se vão 15 anos nesta industria vital!

ps: aos mais mais novos, é recomendado assistir este vídeo para entender a frase acima 😉

Foram centenas de treinamentos ministrados, consultorias e sistemas desenvolvidos. Apresentações em todas as capitais do país, e muitas cidades do interior também, e a incrível experiência de trabalhar ao menos por uma semana em cada país da América Latina e América Central, visitando clientes e fazendo eventos. É impressionante o que um compilador é capaz de fazer!

Mas além de um compilador, temos as pessoas. Sim, em tempos de pragmatismos e racionalização de tudo, talvez seja este o fator que nos permitiu chegar tão longe, todas verdadeiramente apaixonadas pelo que fazem.

Seria uma tremenda injustiça citar qualquer nome, cada qual contribuiu com o seu melhor, empurrando a ferramenta para frente, empurrando minha vida para frente… cada qual sabe o quanto sou grato por tudo!

Obrigado Delphi!

Multi-tier com Delphi XE6 e FireDAC JSON Reflection

Introdução

Durante o Delphi Tour prometemos falar mais sobre o novo suporte a Reflection no FireDAC para o desenvolvimento de aplicações Multi-tier.

Este novo suporte foi introduzido ainda na versão XE5 Update 2, como você pode observar neste post introdutório do Marco Cantu.

Vamos detalhar um pouco mais este framework e também mostrar como adicionar compressão de dados a este cenário, ideal para conexões “não muito boas” (leia-se conexõe 3G…).

Este demo pretende ilustrar um guia inicial de boas práticas com FireDAC Reflection. Ele também será utilizado em posts futuros mostrando deployment, inclusive para Apache:

Visão Geral do Projeto Exemplo

O exemplo base que utilizaremos aqui encontra-se disponível nos demos do Delphi em “C:UsersPublicDocumentsEmbarcaderoStudio14.0SamplesObject PascalDataSnapFireDACJSONReflect”, mas vamos disponibilizar uma cópia atualizada contendo as adições deste post.

Esta é a estrutura do projeto exemplo:

A aplicação server é criada através do wizard “DataSnap WebBroker Application”. Para o exemplo estamos utilizando uma aplicação “Stand Alone” VCL (a partir do XE6 pode ser também FireMonkey), porém você ainda tem as opções Apache e IIS, além de uma aplicação do tipo “console”.

Nosso servidor vai acessar uma base exemplo do Interbase (EMPLOYEE). Serão basicamente três consultas SQL, as quais serão “exportadas” via JSON para a aplicação cliente. Abaixo você pode observar a conexão FireDAC (FDConnection) e as três consultas (FDQuery). Caso não conheça FireDAC, este webinar pode lhe ajudar: http://forms.embarcadero.com/LA14Q1BRBDEApplicationstotheFuture

Conforme comentado acima, os datasets resultantes serão exportados como JSON para a aplicação cliente. Abaixo segue o código exemplo de uma das funções criadas no servidor, todas as demais seguem o mesmo padrão de codificação:

function TServerMethods1.GetDepartmentNames: TFDJSONDataSets;
begin
 FDQueryDepartmentNames.Active := False;

 Result := TFDJSONDataSets.Create;
 TFDJSONDataSetsWriter.ListAdd(Result, FDQueryDepartmentNames);
end;

Observe que você não precisa se preocupar em converter o DataSet para JSON manualmente, a classe auxiliar “TFDJSONDataSetsWriter” possui um método (Add) que vai automaticamente serializar o DataSet em formato JSON e adicioná-lo ao Result, que por sua vez trata-se de um TFDJSONDataSets (basicamente uma lista de DataSets em formato JSON). Todas estas novas classes estão declaradas na unit “Data.FireDACJSONReflect”.

Por tratar-se de uma lista de DataSets, você pode retornar em um mesmo método diversos DataSets, como por exemplo:

function TServerMethods1.GetDepartmentEmployees(
  const AID: string): TFDJSONDataSets;
begin
  FDQueryDepartmentEmployees.Active := False;
  FDQueryDepartmentEmployees.Params[0].Value := AID;

  FDQueryDepartment.Active := False;
  FDQueryDepartment.Params[0].Value := AID;

  Result := TFDJSONDataSets.Create;

  TFDJSONDataSetsWriter.ListAdd(Result, sDepartment, FDQueryDepartment);
  TFDJSONDataSetsWriter.ListAdd(Result, sEmployees, FDQueryDepartmentEmployees);
end;

Outro método que gostaria de comentar é o responsável por aplicar as alterações retornadas pelo “client” diretamente no banco de dados:

procedure TServerMethods1.ApplyChangesDepartmentEmployees(
  const ADeltaList: TFDJSONDeltas);
var
  LApply: IFDJSONDeltasApplyUpdates;
begin
  LApply := TFDJSONDeltasApplyUpdates.Create(ADeltaList);

  LApply.ApplyUpdates(sDepartment, FDQueryDepartment.Command);

  if LApply.Errors.Count = 0 then
    LApply.ApplyUpdates(sEmployees, FDQueryDepartmentEmployees.Command);

  if LApply.Errors.Count > 0 then
    raise Exception.Create(LApply.Errors.Strings.Text);
end;

A aplicação cliente envia um “TFDJSONDeltas” para o server. Basicamente temos que instanciar um “IFDJSONDeltasApplyUpdates” e aplicar as alterações nos Datasets originais através do método “ApplyUpdates”.

Para a aplicação cliente, qualquer plataforma pode ser utilizada. Ou seja, o código do exemplo se aplica tanto a VCL (Windows 32/64), bem como ao FireMonkey (Windows, OS X, iOS e Android)!

Uma vez criada sua aplicação cliente, você deve utilizar o wizard “DataSnap REST Client Module” para gerar o código do proxy que conterá as chamadas para sua aplicação servidora. Em outras palavras, você cria uma aplicação na plataforma desejada (desktop ou mobile) e utiliza o wizard acima para gerar o código necessário para conectá-la a aplicação servidora.

Estamos utilizando Visual LiveBindings para efetuar a ligação dos controles visuais. Por esta razão é necessário definir os fields dos FDMemTables para então fazer a ligação em tempo de design. Neste caso, o tipo de dado dos campos não é importante, mas o nome deve ser exatamente o mesmo retornado pelo servidor.

Vamos entender agora como fazer a chamada para a aplicação servidora, abaixo temos o código que retorna a lista de departamentos e preenche o TListView “ListViewDepartments”:

procedure TDepartmentsClientForm.ButtonDepartmentsClick(Sender: TObject);
begin
  GetDepartmentNames;
end;
procedure TDepartmentsClientForm.GetDepartmentNames;
var
  LDataSetList: TFDJSONDataSets;
begin
  try
    LDataSetList := ClientModule2.ServerMethods1Client.GetDepartmentNames();
    UpdateDepartmentNames(LDataSetList);
  except
    on E: TDSRestProtocolException do
      HandleRestException(ClientModule2.DSRestConnection1, 'Get Departments error', E)
    else
      raise;
  end;
end;
procedure TDepartmentsClientForm.UpdateDepartmentNames(const ADataSetList: TFDJSONDataSets);
begin
  FDMemTableDepartments.Active  := False;
  FDMemTableDepartments.AppendData(
    TFDJSONDataSetsReader.GetListValue(ADataSetList, 0));
end;

Como podem observar, o método “GetDepartmentNames” faz uma chamada ao servidor (através da classe proxy gerada pelo wizard “DataSnap REST Client Module”) retornando um “TFDJSONDataSets”, ou seja, uma lista de datasets em formato JSON. Resta então, utilizando a classe auxiliar “TFDJSONDataSetsReader”, reverter o processo de serialização, adicionando o resultando em um FDMemTable. O TFDMemTable pode ser comparado a um TClientDataSet, isto é, um dataset em memória. Os dados armazenados em um TFDMemTable podem ser alterados, e retornados ao servidor para atualização no banco de dados, fazendo-se uma chamada ao método correspondente:

procedure TDepartmentsClientForm.ButtonApplyUpdatesClick(Sender: TObject);
begin
  ApplyUpdates;
end;

function TDepartmentsClientForm.GetDeltas: TFDJSONDeltas;
begin
  Result := TFDJSONDeltas.Create;
  TFDJSONDeltasWriter.ListAdd(Result, sEmployees, FDMemTableEmployee);
  TFDJSONDeltasWriter.ListAdd(Result, sDepartment, FDMemTableDepartment);
end;

procedure TDepartmentsClientForm.ApplyUpdates;
var
  LDeltaList: TFDJSONDeltas;
begin
  LDeltaList := GetDeltas;
  try
    ClientModule2.ServerMethods1Client.ApplyChangesDepartmentEmployees(LDeltaList);
  except
    on E: TDSRestProtocolException do
      HandleRestException(ClientModule2.DSRestConnection1, 'Apply Updates error', E)
    else
      raise;
  end;
end;

Otimizando a Transferência dos Dados

Para aplicações onde todas as camadas (server e client) estão desenvolvidas em Delphi ou C++ Builder, podemos ainda aplicar uma compressão de dados para otimizar seu tempo de transferência. Obviamente, a diferença somente será perceptível em um ambiente com alguma restrição de banda (3G por exemplo).

Tanto o Delphi, quanto o C++ Builder, trazem uma implementação da ZLib, biblioteca para compressão de dados: http://docwiki.embarcadero.com/Libraries/XE6/en/System.ZLib. O mais interessante é que nossa implementação da ZLib está disponível para todas as plataformas suportadas, ou seja, você pode compactar uma informação em seu servidor Windows e descompactar em sua aplicação mobile iOS ou Android!

Você pode facilmente adicionar a compressão de dados em seus métodos JSON utilizando os “class methods” que estamos disponibilizando abaixo, os quais tornam o uso da ZLib bastante simples:

unit DSSupportClasses;

interface

uses System.Classes, System.ZLib, System.SysUtils;

type
  TDSSupportZLib = class(TObject)
  private
    { private declarations }
  protected
    { protected declarations }
  public
    { public declarations }
    class function ZCompressString(aText: string): TBytes;
    class function ZDecompressString(aText: TBytes): string;
  end;

implementation

{ TDSSupport }

class function TDSSupportZLib.ZCompressString(aText: string): TBytes;
var
  strInput: TBytesStream;
  strOutput: TBytesStream;
  Zipper: TZCompressionStream;
begin
  SetLength(Result, 0);
  strInput := TBytesStream.Create(TEncoding.UTF8.GetBytes(aText));
  strOutput := TBytesStream.Create;
  try
    Zipper := TZCompressionStream.Create(TCompressionLevel.clMax, strOutput);
    try
      Zipper.CopyFrom(strInput, strInput.size);
    finally
      Zipper.Free;
    end;
    Result := Copy(strOutput.Bytes, 0, strOutput.size);
  finally
    strInput.Free;
    strOutput.Free;
  end;
end;

class function TDSSupportZLib.ZDecompressString(aText: TBytes): string;
var
  strInput: TBytesStream;
  strOutput: TBytesStream;
  UnZipper: TZDecompressionStream;
begin
  Result := '';
  strInput := TBytesStream.Create(aText);
  strOutput := TBytesStream.Create;
  try
    UnZipper := TZDecompressionStream.Create(strInput);
    try
      try
        strOutput.CopyFrom(UnZipper, 0);
      except
        on E: Exception do
        begin
          raise Exception.Create('Error Message: ' + E.Message);
        end;
      end;
    finally
      UnZipper.Free;
    end;
    Result := TEncoding.UTF8.GetString(strOutput.Bytes, 0, strOutput.size);
  finally
    strInput.Free;
    strOutput.Free;
  end;
end;

end.

Porém, nenhuma implementação adicional será necessária em seu projeto. O que fizemos foi modificar a unit “Data.FireDACJSONReflect”, onde estão implementadas as classes base do FireDAC JSON Reflection, adicionando a compressão/descompressão nos métodos de serialização JSON. Assim, basta adicionar esta versão da unit a seu projeto e fazer um “Build”. Compressão/descompressão adicionadas!

Downloads e referências

EMBARCADERO CONFERENCE BRASIL!!!

Aproveitando a ocasião, já estamos preparando a conferência deste ano, e a página para submissão de palestras já está no ar! Se você tem algo interessante para mostrar, em Delphi e C++ Builder, ou ainda um caso de sucesso utilizando nossas ferramentas, estamos esperando por sua inscrição:

http://www.embarcaderoconference.com.br/palestrantes/

RAD Studio World Tour en México

Acaba de terminar el RAD Studio World Tour en México: Guadalajara y México DF, con una gran afluencia en ambos lugares.

Un montón de preguntas y mucha discusión acerca de Windows 8, sobre desarrollo móvil con HTML5, así como la actualización a Delphi y C + + Builder XE3 y la migración de VCL a FireMonkey para aprovechar las ventajas visuales de FM2.

Un gran “gracias” de mi parte y de Diego Navarro a nuestra comunidad de valiosos usuarios en Guadalajara y Ciudad de México, así como para nuestro socio GOPAC por hacer del evento un gran éxito.

Eliseo González, uno de nuestros MVPs en México publicó un resumen de la presentación y también algunas fotos más!

RAD Studio World Tour in Mexico

Just finished the RAD Studio World Tour in Mexico: Guadalajara and Mexico DF, with full rooms in both places.

A ton of questions and lots of discussion about Windows 8 Development and also Mobile with HTML5, as well as upgrading to Delphi and C++ Builder XE3 and migrating from VCL to FireMonkey to leverage the visual advantages of FM2.

A big “Thank You” from me and Diego Navarro to our valuable user community in Guadalajara and Mexico City, as well for our partner GOPAC by the very successful event.