Monday, November 26, 2007

Filtros em TADODataSet

Descobri recentemente que o TADODataSet e seus descendentes, baseados no ADO Recordset, têm uma peculiaridade na utilização de filtros.

O filtro

  (campo1 = valor1 OR campo1 = valor2) AND campo2 = 'ABCD'

simplesmente não funciona!!!

Não pode haver agrupamento de cláusulas usando o OR e posteriormente agrupando-as com outras cláusulas usando o AND. Teria que reescrever o filtro com:

  (campo1 = valor1 AND  campo2 = 'ABCD')
OR (campo1 = valor2 AND campo2 = 'ABCD')


Isto complica bastante a vida do desenvolvedor que, como eu, criou um "editor visual genérico" de filtros que se aplica a qualquer descendente do TDataSet.
Maneira rápida de fugir do problema: Utilize um ClientDataSet ligado num DataSetProvider, que por sua vez está ligado no ADODataSet (ou ADOQuery) original. E passe a usar o ClientDataSet no lugar do ADODataSet. O primeiro - e também o segundo - exemplo de filtro funciona perfeitamente no ClientDataSet!
Mais uma vez o ClientDataSet se mostrando superior ao ADO Recordset.

Sunday, November 25, 2007

Serialização de Objetos - Parte I

Quem trabalha com C# ou Java certamente irá encontrar em seu caminho a serialização de objetos, de forma mais ou menos rotineira. O interessante é que existem várias bibliotecas em Delphi que implementam métodos e classes para trabalhar com serialização, mas dificilmente encontramos código escrito utilizando este conceito. Uma destas bibliotecas era a Globus que foi depois incorporada pela gigante JEDI JVCL.

O conceito é simples: a partir de uma instância de uma classe qualquer – geralmente descendente de TPersistent – obtêm-se um XML que permita “reconstruir” esta instância mantendo-se todas as suas propriedades. Isto é conseguido fazendo extenso uso da RTTI (Run Time Type Information) para obter todas as propriedades Published da classe (somente as propriedades Published da classe geram informação de RTTI).

O processo de geração do XML que representará a classe é também simples: Percorre-se a lista de todas as propriedades Published da classe, convertendo cada property em um Tag correspondente, da forma:

<nome da propriedade>valor da propriedade</nome da propriedade>

Um TEdit por exemplo poderia ser representado pelo seguinte XML:

<TEdit>
    <Left>27</Left>
    <Top>59</Top>
    <Width>121</Width>
    <Height>21</Height>
    <Tag>1</Tag>
    <Visible>True</Visible>
</TEdit>

Atualmente venho utilizando a JVCL (classe TXMLSerializer) para serializar objetos. De fato, crei uma nova classe baseada na TXMLSerializer da JVCL, para ficar isolado de possíveis mudanças na JVCL - uma vez que da versão 2 para a 3 já ocorreram mudanças significativas, e não posso me dar ao luxo de reescrever código de produção sempre que a JVCL mudar.

O melhor de tudo é que migrei o TXMLSerializer para Delphi.NET (BDS 2006) - possuo um único código fonte para Win32 e .NET - e assim consigo serializar objetos entre aplicações Win32 e .NET, sem problemas, e sem precisar das monstruosidades dos parsers XML da MS, nem no ambiente Win32 nem no ambiente .NET.

Mais sobre este assunto depois!

 

Descobrindo se uma classe descende de uma outra

Criei uma pequena função que me permite dizer se uma classe é descendente de uma outra, utilizando o nome da classe ancestral.

Você pode se perguntar: "Mas qual o objetivo disso? Não é mais fácil usar o operador is?" Por exemplo:

if ActiveControl is TEdit then
  TEdit(ActiveControl).SelectAll;

A resposta é: Depende! O operador is faz uma checagem de tipo dinâmica, mas requer que o TEdit seja conhecido em tempo de compilação e consequentemente requer que o código da classe TEdit esteja linkado no executável. O código acima só compila se a unit StdCtrls (onde está a declaração da classe TEdit) esteja na cláusula uses da unit.

Agora, imagine que você tenha um método onde inúmeras classes podem ser passadas como parâmetro e você não deseja - ou não possa - linkar todas as possíveis classes. Exemplo:

Procedure DoSomething(Instance: TPersistent);

Bem provavelmente você pode pensar: "Mas de quê me serve um método assim se desconheço a classe e não poderei usá-la diretamente?" A resposta é que bem provavelmente você irá utilizar a RTTI diretamente para obter e modificar as propriedades dos objetos referenciados por Instance, assim como faz o nosso conhecido Object Inspector.

Precisei utilizar esta função em algumas classes para saber, por exemplo, se um determinado DataSet era descendente direto do TCustomADODataSet padrão do Delphi, ou de um outro DataSet com linhagem totalmente diferente (TQuery, TSQLQuery), sem ter que linkar com as units ADODB, DBTables e SqlExpr, o que aumentaria consideravelmente o tamanho do meu executável.

Isso me permitiu criar classes de um framework que trabalhavam igualmente bem com ambos os DataSets, SEM QUE O CÓDIGO DE NENHUM DELES FOSSE LINKADO NO MEU EXECUTÁVEL FINAL.

O código é simples e por isto dispensei comentários. Simplesmente faço um loop onde comparo o nome da classe da instância passada como parâmetro com o nome da classe procurada. Se não for igual, passo para o ancestral imediatamente superior e refaço a comparação. Repito até que o resultado seja verdadeiro ou eu chegue ao topo da árvore da hierarquia do objeto.

function PertenceAClasse(const Instance: TObject; ParentClassName: string): boolean;
var
  ParentClass: TClass;
  ObjClassName,
  TargetClassName: string;
begin
    Result := False;
    ObjClassName := UpperCase(Instance.ClassName);
    TargetClassName := UpperCase(ParentClassName);
    ParentClass := Instance.ClassType;
    repeat
      if ObjClassName = TargetClassName then
      begin
        Result := True;
        break;
      end;
      ParentClass := ParentClass.ClassParent;
      if ParentClass <> nil then
       ObjClassName := UpperCase(ParentClass.ClassName);
    until (ParentClass = nil);
end;

Wednesday, November 14, 2007

DataSnap.NET... Thats cool!

Navegando pelos blogs de papas como Dan Miser encontrei o seguinte link

http://tondrej.blogspot.com/2004/10/datasnapnet.html

Really COOL guys!

Há exatos 2 anos venho batendo nesta tecla com o pessoal da CodeGear. Conversei inclusive com o Ramesh Theivendran na Borcon 2005 em SP. Imagine um servidor 100% .NET servindo clientes DataSnap, no matter what, ou seja, clientes Win32 ou .NET.
Imagine poder portar o servidor de aplicações para .NET e manter os clientes ainda em Win32? Migrar quando for mais conveniente?
Além de todo o horizonte que me abriria, iria matar os desenvolvedores VB e C# de inveja, é ou não é?

Porém... O post no blog é de 2004!!! E hoje, mais do que em 2004 EMHO, esta tecnologia seria bem vinda. Vou tentar contato com o autor para saber em que pé ficamos.

Ainda sobre a M$

Esta é só para descontrair... mas fala sério.... como é possível um cara que se deixa fotografar assim acabar se tornando o homem mais rico do mundo? Obviamente falta-lhe "tato" - para dizer pouco - quando se deixou clicar assim, certo? E então? Qual o segredo do sucesso? hehehehe

Here we go Vista?

  • Mood:
A M$ sempre consegue me surpreender. Geralmente pelo lado negativo. O Windows Vista é um destes casos. Na sua instalação e configuração padrão eu achei tão ruim, fiquei tão pouco a vontade que fico pensando se algum dia, quando for forçado a usá-lo, não vou sentir vontade de mudar de profissão... ou talvez ir para a turma do pinguim.

É muito muito chato, muito muito cheio de frescura visual que CANSA, e muito muito pouco produtivo. Depois de usá-lo por algum tempo me senti desiludido! Sinceramente! Senti igual quando tive que admitir que o ICQ estava morto, para glória do MSN Messenger, que até hoje não faz o que o ICQ fazia em 1998... Well, nesta área de TI parece que quase tudo novo piora um pouco o que já existia.

Fico impressionado como o XP alcançou rapidamente um nível de maturidade, para mim, excelente (não sou expert em segurança de SO!). Em mais de 2 anos que o uso não me lembro de ter "dado pau", travado, etc. Como plataforma para DESENVOLVIMENTO Windows, dificilmente será desbancado. Mas é isto. Resistirei enquanto puder!

E despistadamente alguns fabricantes de computadores/notebooks que vêm com Vista O&M instalado estÃo fazendo downgrade do SO... despistadamente para que a turma de Redmont não ouça...

Tuesday, November 13, 2007

Desenvolvimento Windows, futurologia & outras leituras de interesse.

Alguns links que têm muita informação para quem desenvolve aplicações Windows em Delphi. Onde estamos, para onde vamos? Muito bom material.

Is Microsoft expanding the war?
Steve Trefethen

Giving Up on Microsoft
Jeff Atwood

Desktop Applications are Dead
Eugueny Kontsevoy

Desktop Applications are not dead!
Antonio Cangiano

E aí? Morreu ou não morreu?

Wednesday, November 7, 2007

Apresentação na Borcon 2007

Arquitetura multi-camadas e multi-clientes Delphi. Win32 e Intraweb

Aí está o link para o dowload da minha apresentação na Borcon 2007 que teve o título acima.

Recebi alguns e-mails solicitando este material uma vez que o DVD que a Borland/CodeGear distribuiu no evento não continha nenhuma palestra.
Achei isto uma falha terrível da organização. O "evento" em si não termina no final do terceiro dia de apresentação. Todo mundo quer ver o material, inclusive consultar outras palestras que não puderam assistir ao vivo.

Download da palestra

Tuesday, November 6, 2007

SystemBuilder da Squadra

A empresa Squadra, de Belo Horizonte, há alguns anos era muito conhecida entre os desenvolvedores Delphi. Era parceira Borland e criava ferramentas para desenvolvimento Delphi como por exemplo o SystemBuilder.

Bem... até hoje está lá no site deles para vender o SystemBuilder versão 3.x, para Delphi 5, 6 e 7. O demo que tem para download é 3.2. O software é protegido contra execução não autorizada, cópia, etc pelo HandProt, outra ferramenta da Squadra.

Um conhecido meu tem um sistema que se utilizou o System Builder para ser desenvolvido e me pediu para estudar a possibilidade de EVOLUÇÃO do sistema. Putz... que arapuca! Como a Squadra parou de desenvolver o SystemBuilder (não há versão para IDE superior ao Delphi 7), e também não tornou o fonte aberto (está aí uma boa idéia pessoal da Squadra!), não há como migrar o sistema para BDS 2006 por exemplo sem ter que reescrevê-lo.

Outra chatisse do SystemBuilder é sua proteção contra cópia. Se você tem um computador desktop e um notebook, prepare-se: Ou compre duas licenças ou use somente um deles. Nos idos de 1997 quando a Squadra vendia o SystemBuilder ainda vá lá. Mas hoje??

Resumo da ópera: Resolvi pegar os .dcu do SystemBuilder e, digamos, dissecá-los, para não dizer disassemblá-los!
Descobri duas coisas bem interessantes: O HandProt me pareceu bem escrito, com segurança redundante, proteção contra debugging, etc. Já o SystemBuilder... Só precisa de um patch de 6 bytes em 1 DCU e voilá! Não que eu tenha feito isto, certo?

Em breve vou detalhar como é feito isto.

Caros leitores, mais sobre Squadra, System Builder e Handprot aqui:

Borcon 2007

Semana passada estive na Borcon 2007, em São Paulo. Estive como participamente e como palestrante - 1st time! Minha palestra foi "Arquitetura multi-camadas e multi-clientes Delphi. Win32 e Intraweb". Pelo feedback que tive parece que foi bem recebida pelos colegas!

Algumas percepções minhas sobre a Borcon este ano:
  • Da CodeGear: David I, Steve Shaughnessy (DBX) e o CEO Jim Douglas. Muito boas apresentações de todos eles. E muito bom ver o CEO vindo ao Brasil falar para a comunidade Delphi.
  • Muito ECO IV, ASP.NET, DBExpress 4 e Blackfish, tudo do novo RAD Studio 2007.
  • O novo DBExpress foi apresentado pelo arquiteto responsável pelo mesmo Steve Shaughnessy. A nova arquitetura do DBX me pareceu 10!
  • Gostei muito do Blackfish, e acredito que desenvolvedores ASP.NET e Desktop que utilizam o Delphi vão gostar também. O deploy é muito simples e acredito que vai ser a "preferência" para este tipo de desenvolvedor. Ainda não sei dos detalhes de LICENÇAS ($) para deploy do Blackfish. Espero que a CodeGear não limite a sua utilização como fez com o Midas, quando foi lançado. Entre pagar pelo Blackfish ou usar o MySQL que já tem em 99% dos web hosts... qual será a opção?
  • Fiquei muito pensativo sobre um gráfico que o Jim mostrou em sua apresentação, onde Delphi e C++ estão no lado do desenvolvimento "Desktop, small & middle-sized", deixando o Enterprise para o "managed code", C#, Java, etc. Levando por este lado a CodeGear quer nos dizer aplicações Win32 (e futuramente 64) acabaram no ambiente corporativo??? Até aí tudo bem... But... O RAD Studio 2007 é puro Delphi e C++. Aí pergunto: O preço do RAD Studio é compatível com ESTE MERCADO???

More comments later