sábado, 11 de junho de 2011

Comandos básicos SQL (inserir / alterar / deletar)


Crie uma tabela com o nome de teste.db, e coloque os seguintes campos:
COD = auto_increment
NOME = alpha = 255 caracteres
Neste artigo irei mostrar de forma fácil e rápida, os comandos básicos para: (inserir,alterar,deletar).
Primeiramente vamos aos comandos:

Para inserir dados, com comandos SQL
('insert into tabela (nome_capo) values ('+''''+edit.Text+''''+');

Para selecionar dados, com comandos SQL
('select * from tablea where = campo "'+edit.Text+'"');

Para deletar dados, com comandos SQL
('delete from tabela where campo = '+''''+edit.Text+''''+'');

Para atualizar dados, com comandos SQL
('update tabela set campo = '+''''+edit.Text+''''+' where campo = '+''''+edit1.Text+''''+'');

Agora vamos passo a passo:
Primeiramenta crie um novo aplicativo em: File >New >Application

Após ter criado, coloque no form os componentes: 3 componentes "TButton", 1 componente "TEdit", 1 "TDBGrid", 1 "TDataSource", 1 "TSQLQuery".

No componente, TDataSource, na propriedade DataSet, coloque o valor "query1".
Pronto, as configurações dos componentes já foram feitas, agora vamos colocar os comandos no projeto.

Você colocou 3 componentes "TButton".
Faça as seguintes configurações nas propriedades do 3 "TButton".

Button1: Caption = Inserir
Name = btn_inserir
Button2: Caption = Alterar
Name = btn_alterar
Button3: Caption = Deletar
Name = btn_deletar

Agora de um duplo clique sobre o Botão "Inserir","btn_inserir".
Irá aparecer o editor do delphi, onde serão colocados os comandos.
Neste botão "Inserir", você coloca o seguinte comando:

query1.Active := False;
query1.SQL.Clear;
query1.SQL.Add('insert into teste (nome) values ('+''''+edit1.Text+''''+') ');
query1.ExecSQL;

Bom, estas linhas de comando acima irá inserir o dado em uma tabela.

Agora no botão "Alterar", você coloca as seguinte linhas de comandos:

query1.Active := False;
query1.SQL.Clear;
query1.SQL.Add('update teste set nome = '+''''+edit1.Text+''''+' where = COD');
query1.ExecSQL;

As linhas de comandos acima irão fazer com que altere um certo dado, este é o comando básico.

Agora no botão "Deletar", você coloca as seguintes linhas de comandos:

if MessageDlg('AVISO: Confirma Exclusão?', mtInformation, [mbYES, mbNO], 0) = mrYES then
begin
query1.Active := False;
query1.SQL.Clear;
query1.SQL.Add('delete from teste where COD = '+''''+edit1.Text+''''+'');
query1.ExecSQL;
end

Bom ai está, como inserir, aletrar e deletar dados de uma tabela, com comandos básicos. 

Objetos Distribuídos


Um dos maiores paradigmas da indústria de informática, nos dias de hoje, é o novo conceito de processamento cliente/servidor, onde existe...
uma mudança das aplicações codificadas em segmentos, partes ou componentes. Estas aplicações são separadas logicamente em três camadas: usuário, regras de negócio e dados.

A aplicação está dividida ao longo de linhas locais/remotas de dados, o que torna a infra-estrutura de redes das empresas um dos grandes fatores críticos de sucesso no desenvolvimento e implantação de um sistema. O cliente, tipicamente um PC, fornece a interface gráfica enquanto os servidores fornecem um conjunto de serviços.


Esses componentes, conhecidos como objetos, são distribuídos nas redes gerando um novo paradigma dentro de um já existente: a revolução do cliente/servidor. O resultado final é a quebra das aplicações em componentes, onde a reutilização e o baixo custo de implementação são os grandes benefícios obtidos.


Um objeto é essencialmente um componente com inteligência que opera entre sistemas operacionais heterogêneos, desenvolvido em várias linguagens de programação. Na área de desenvolvimento de sistemas, o conceito de objetos está alterando totalmente a arquitetura, desenvolvimento, empacotamento, distribuição e manutenção de software.


Então, qual a diferença entre um objeto clássico e um objeto distribuído? Um objeto clássico possui propriedades e métodos e é gerado através de uma linguagem de programação como Delphi, C++, VB, entre outras.


Esses objetos fornecem reusabilidade de código através de herança, encapsulamento e polimorfismo, propriedades fundamentais da teoria orientada a objetos. Contudo, esses objetos só vivem dentro de um programa; apenas o compilador que os criou conhece a sua existência.


O mundo externo os desconhece e não tem formas de acessá-los. Um objeto distribuído também é uma classe que pode publicar (tornar disponível) tanto suas propriedades quanto seus métodos, mas a linguagem e o compilador usados para criar objetos distribuídos são totalmente transparentes para a implementação desses. Esses objetos têm uma interface definida onde os compiladores geram um código a mais para serem acessados por outros objetos de forma totalmente transparente, isto é, o invocador desconhece o local do objeto invocado, o sistema operacional que esse executa, podendo estar fisicamente na mesma máquina (processo) ou em alguma máquina remota.


Um dos fatores críticos para a implementação de um sistema com componentes distribuídos é a transparência da sua localização física, podendo operar num processador local, num processo diferente ou num processador remoto. Porém, um componente não pode operar no vácuo, e por isso precisa de uma base denominada "barramento" de objetos distribuídos (ORB - Object Request Broker). Esse barramento oferece serviços que permitem a interligação entre os diversos componentes nas diferentes plataformas. É necessário utilizar esse serviço porque a interação entre componentes é requisito básico para a construção de uma aplicação de negócio. Os componentes estão sempre adicionando novos serviços, que são herdados durante sua compilação ou execução e alcançam altos níveis de colaboração entre si.


Nos dias de hoje, existem na indústria dois grandes padrões para desenvolvimento de objetos distribuídos que separam a interface de um objeto de sua implementação: DCOM (Distributed Component Object Model) e CORBA (Common Object Request Broker Architecture).


Os elementos principais da especificação CORBA são a linguagem de definição das interfaces dos objetos que serão criados e colocados à disposição na rede (IDL - Interface Definition Language) e um repositório (IR - Interface Repository) que representa as interfaces (ou classes) de todos os objetos disponíveis no sistema distribuído.


Como criarmos objetos para CORBA e/ou DCOM? Ambos têm o objetivo de fornecer uma transparência de localização de objetos e sua implementação, o que exige definição de interface entre os componentes. Essa interface deve ser publicada (tornada pública) e serve como mecanismo de ligação e acionamento entre esses componentes. A interface dos componentes é especificada em IDL, uma linguagem puramente declarativa que não define nada sobre a implementação desses componentes.

DCOM, além de separar a interface de um objeto de sua implementação, é uma extensão de COM (Component Object Model), parte da família Windows de sistemas operacionais, baseada na infra-estrutura de OLE e Active X. COM/DCOM é um framework baseado na construção de objetos para desenvolvimento que usa uma variedade de linguagens e ferramentas totalmente independentes de linguagem de programação, sendo parte implícita dos sistemas operacionais da Microsoft Windws NT e Windows 95.

Os fatores para uma comparação entre DCOM e CORBA são suporte para plataforma e linguagem, custo e integração.


Com relação à integração é importante a construção de "pontes" entre CORBA e DCOM, que permitirá distribuir objetos entre servidores e estações na Internet/intranet. O OMG definiu os mapeamentos entre COM e CORBA de tal forma que objetos COM podem invocar objetos CORBA e objetos CORBA invocam objetos COM.

segunda-feira, 30 de maio de 2011

Obter caminho de qualquer aplicação Delphi


Saudações, caros delphianos! Quando estamos desenvolvendo uma aplicação executável (.EXE) e necessitamos obter o caminho completo da mesma, costumamos utilizar o método ExtractFilePath, da biblioteca SysUtils, passando por parâmetro o nome do executável de nossa aplicação, como segue

  strPath := ExtractFilePath(Application.ExeName);

Pois bem, mas e se precisarmos fazer o mesmo em uma aplicação ISAPI (.DLL), como IntraWeb ou WebBroker?

Na biblioteca SwSystem, podemos encontrar a variável gsAppPath que contém o caminho da DLL da aplicação. O melhor disso tudo é que podemos utilizar esta variável em qualquer tipo de aplicação, inclusive executáveis!

IBX & Firebird - Out of Memory em relatório com muitos registros


Olá amigos! Certo dia me deparei com um belo "Out of Memory" em uma máquina de 4GB de RAM e uma base de 500MB. O erro aparecia quando o cliente tentava tirar um relatório de vendas de 01/01/2009 à 31/12/2009. Cheguei a pensar que pudesser ser configuração do FB, mas fiz os testes por fora do sistema e não tive problemas com o select. Sendo assim, o problema estava no programa em trazer muitos registros pra ele.

Pensei: se é um relatório, uma vez impresso o registro, pra que armazena-lo em memória? Então fiz o teste com a propriedade "Unidirectional = True" no IBQuery e adivinha?! "Adios" out ouf memory!

Essa semana um amigo me procurou para dizer que teve o mesmo problema e encontrou a dica no site da lista de discussão da firebase, onde a postei originalmente. Então decidi publica-la aqui também para que possa ajudar mais pessoas com este problema.

terça-feira, 24 de maio de 2011

CRM - Compreendendo o assunto


Ouve-se muito falar em CRM. Mas, o que é CRM? Uma técnologia? Um conceito? Uma ferramenta? Veja neste material e esclareça suas dúvidas!
Prezados amigos desenvolvedores, já faz um tempo desde o primeiro artigo, fiquei muito atarefado com a implantação do projeto 2.0 da NF-e.
Um amigo me perguntou um dia desses: “Bruno, ouço falar tanto de CRM, como faço para integrar essa tecnologia nos meus sistemas?”

Primeiro vamos entender o cenário:
O mundo passou por profundas e importantes transformações, sobretudo nos últimos anos, impulsionadas pelo crescimento da Internet. Ao ganhar mais um poderoso canal de comercialização e de comunicação, o setor corporativo precisou rever conceitos e se reestruturar.
Na era digital, tudo é muito rápido. O concorrente está a um simples clique no mouse. Não basta mais oferecer somente um produto ou um serviço de qualidade.
O Customer Relationship Management (CRM), que em Português significa Gerenciamento da Relação com o Cliente, é um sistema integrado de gestão da interação com o cliente, constituído por um conjunto de procedimentos e de processos organizados e integrados a BPM (Business Process Management, ou modelo de gestão de negócios). “Lembrando que quando falo em sistema não necessariamente quero me referir a softwares”.
Os processos e os sistemas de gestão de relacionamento com o cliente permitem que se tenha controle e conhecimento de todas as suas informações de maneira integrada, principalmente com o acompanhamento e registro de todas as interações com a empresa, que ficam disponíveis a todos os setores que necessitem dessa informação. O produto final irá guiar as tomadas de decisões.
A gestão do relacionamento com o cliente permite o registro em tempo real de todos os contatos realizados por ele com a companhia, de forma centralizada. Esses registros independem do canal de comunicação usado (voz, fax, e-mail, chat, SMS, MMS, entre outros) e servem para reunir informações úteis e catalogáveis. Qualquer informação relevante para as tomadas de decisões pode ser registrada e analisada periodicamente, para que sejam produzidos relatórios gerenciais dos mais diversos interesses.

CRM não é tecnologia
Como a implementação de sistemas de CRM requer o emprego de tecnologias, o mercado, no primeiro momento, passou a interpretar o CRM como se fosse uma. Desde que o conceito ganhou as atenções da mídia, o segmento tecnológico de soluções especializadas movimentou-se com força e rapidamente. Atualmente, existe uma infinidade de pacotes vendidos como CRM, mas que, na verdade, contemplam apenas uma parte dele. CRM é muito mais do que um conjunto de software. É um processo contínuo que compreende, além do uso da tecnologia, uma estratégia de negócios e uma mudança de cultura dentro da organização. Pela complexidade, não se implementa CRM de uma única vez e nem de forma padronizada. Assim como os clientes são diferentes, também cada empresa difere das demais.
Um exemplo do uso do CRM bem aplicado aconteceu comigo no dia 21 do mês passado (data do meu aniversário). Recebi um e-mail da Americanas.com contendo um cartão virtual me parabenizando e me dando R$ 15,00 de desconto no total de qualquer compra naquele dia. Resultado: acabei comprando... rsrs
Em resumo, nós podemos desenvolver e integrar nossas soluções, baseadas no conceito CRM, porém precisamos do envolvimento das empresas no que diz respeito a alimentação e gerenciamento das informações.

Parâmetros de instalação para o Firebird 2.5


Meus caros, após muito procurar, localizei no código fonte do Firebird 2.5, junto ao script do Inno Setup, um documento de texto que mais tarde vim a saber por ele mesmo que há como exibi-lo chamando o arquivo de instalação Firebird-1.5.6.5026-0-Win32.exe com o parâmetro /HELP, o que seria super intuitivo se eu não tivesse já tentado isso e deparado com uma caixa de seleção de idioma e cancelado crendo que não teria efeito algum.

Todo este material é transcrição do documento em inglês, cujo não achei referência em local algum até agora, seja nos sites especializados com firebird ou mesmo o portal da HK-Software, desenvolvedora do nosso querido IBExpert. Este documento que encontrei estava em inglês, fiz a interpretação do mesmo em português e testei  parâmetro por parâmetro e aqui está o resultado.

De cara já digo que meus parâmetros padrões são: /FORCE /VERYSILENT /NORESTART /LOG="C:\LOGFB.TXT" /SAVEINF="C:\SAVEINF.TXT" /NOCANCEL

Configuro o Inno Setup para executar o Firebird-1.5.6.5026-0-Win32.exe com estes parâmetros e voilà, o firebird está instalado no ponto de bala sem exibir mensagem alguma ao usuário, sem pedir configuração alguma e finaliza no jeito para que minha aplicação acesse o banco usando o servidor recém instalado.

Mas vamos ao que interessa, os..

Parâmetros de instalação do firebird 2.5

/SP-
Retira a confirmação "This will install... Do you wish to continue?" iniciando diretamente a instalação.

/SILENT
Não exibe o assistente de instalação, porém exibe o progresso.

/VERYSILENT
Não exibe o assistente nem o progresso de instalação.

/SUPPRESSMSGBOXES

Instrui a instalação para não questionar o usuário, mas só possui efeito quando combinado com SILENT ou VERYSILENT, a resposta padrão nas seguintes situações são:

Sim para "Keep newer file?" - Manter os arquivos mais recentes
Não para "File existis, confirm overwrite." - Confirme sobrescrever arquivo existente.
Abort em situações "Abort/Retry"
Cancel em "Retry/Cancel"
Sim (=continue) para "DiskSpaceWarning / DirExists / DirDoesntExist  / NoUninstallWarning / ExitSetupMessage / ConfirmUninstall situation.
Sim (=restart)  para "FinishedRestartMessage/UninstalledAndNeedsRestart"

Cinco mensagens não são suportadas:

     "About Setup"
     "Exit Setup?"
     "FileNotInDir2" exibida quando o seup requer um novo disco a ser inserido e o disco não é encontrado.
     Qualquer mensagem de erro exibida antes da instalação ou desinstalação
     Qualquer mensagem exibida pelo suporte a [Code] do script de instalação.

/LOG

Cria um arquivo de log no diretório TEMP detalhando a instlação dos arquivos e as ações Run do processo de instalação. Isso pode ser uma ajuda de depuração úteis. Por exemplo, se você suspeitar quee um arquivo não está sendo substituído quando você acreditar que deveria ser (ou vice-versa), o arquivo de log vai dizer se o arquivo foi realmente ignorada, e por quê. O arquivo de log é criado com um nome único baseado na data atual e não vai substituir ou incrementar arquivos existentes.

As informações contidas no arquivo de log é de natureza técnica e portanto, não se destina a ser compreensível pelos usuários finais. Também não é projetado para ser analisável por programação, o formato do arquivo sofre alterações constantes.

/LOG="filename"

Igual ao log, exceto pelo fato de poder especificar um caminho e nome do arquivo para o arquivo de log. Caso o arquivo indicado já exista ele é substituído. Se o arquivo não puder ser criado, a instalação será abortada com uma mensagem de erro.

/NOCANCEL

Desabilita o botão de cancelar, faz efeito somente com /SILENT.

/NORESTART

Instrui a instalação a não reiniciar mesmo que isso seja necessário.

/RESTARTEXITCODE=exit code

Especifica o código de saída personalizado que a instalação irá retornar quando uma reinicialização é necessária. Use juntamente com '/ NORESTART.

Veja mais adiante "Setup Exit Codes".

/LOADINF="filename"

Encarrega instalação para carregar as configurações do arquivo especificado. Este arquivo pode ser preparado utilizando o '/ SAVEINF' que é explicado abaixo.

/SAVEINF="filename"

Instrui à instalação para salvar as configurações da instalação para o arquivo especificado.
Use "aspas" se possuir espaços no nome do arquivo.

/LANG=language

Indica o idioma a ser utilizado. Quando um parâmetro válido é informado, a caixa de seleção de idioma que aparece no início da instalação é suprimida. Os parâmetros para linguagem aceitas pelo instalador do firebird 2.5 são: en, ba, fr, de, es, hu, it, pl, pt e ru. Respectivos de inglês, bósnio, francês, alemão, espanhol, hungraniano, italiano, polonês, português e russo.

/DIR="x:\dirname"

Sobrescreve o caminho padrão exibido no formulário de selecionar diretório no assistente. O caminho completo do diretório deve ser informado.

/GROUP="folder name"

Sobrescreve o nome do grupo do menu iniciar exibido no assistente da instalação.

/NOICONS

Instrui a instalação a checar a opção "Não criar nenhuma pasta do Menu Iniciar".

Os parâmetros exibidos até aqui, servem para qualquer instalação criada pelo Inno Setup, que é o caso do firebird. A partir de agora, veremos as opções que valem somente para o instalador do firebird:

/COMPONENTS="lista de componentes separados por ;"

Escolhas:

    ServerComponent\SuperServerComponent,
    ServerComponent\ClassicServerComponent,
    ServerComponent,
    DevAdminComponent and
    ClientComponent

Este comando substitui os componentes das configurações padrão. Usando este parâmetro estará usando um tipo personalizado da instalação, um completo exige a combinação de componentes, por exemplo:
   /COMPONENTS="ServerComponent\SuperServerComponent,ServerComponent,DevAdminComponent,ClientComponent"

/TASKS="lista de tarefas separadas por ;"

Escolhas:

    UseGuardianTask
    UseApplicationTask
    UseServiceTask
    AutoStartTask
    InstallCPLAppletTask
    MenuGroupTask
    CopyFbClientToSysTask
    CopyFbClientAsGds32Task

Ao usar este comando somente as tarefas especificadas serão aplicadas, desabilitando os demais, o que torna o uso combinado deste parâmetro com /NOCPL, NOGDS32 ou /COPYFBCLIENT conflitantes.

/MERGETASKS="lista de tarefas separadas por ;"

É como o parâmetro /TASKS, porém indicar uma tarefa ou mais não indica que as tarefas checadas por default serão desmarcadas. Na prática, marca a tarefa indicada e as demais permanecem como são em default.
/FORCE

O instalador ignora a sua análise do atual de ambiente. Ele tentará instalar e configurar o Firebird como se nenhuma versão anterior do Firebird ou InterBase foi instalado. Isto pode ser útil se você tiver uma instalação corrompida que não é possível desinstalar.

/NOCPL

Não instala o applet de painel de controle. Útil para evitar exigir reiniciar a instalação em alguns sistemas operacionais.

/NOGDS32

Não instala a biblioteca de cliente para o diretório do sistema, mesmo que a isntalação queira copiar.

/COPYFBCLIENT

Copia o fbclient.dll ao diretório do sistema. Isto é recomendado para a instalação do cliente, se tiver certeza de que você só vai ser acesso a uma versão de servidor único. Se os pedidos de seus clientes são suscetíveis de tirar proveito de acessar as versões de servidor diferente desta não é recomendado.

Setup Exit Codes

O setup irá retornar um destes códigos de saída:

      0 - Sucesso na execução.
      1 - Falhou ao inicializar.
      2 - Usuário cancelou inciar a instalação.
      3 - Erro fatal preparando para a próxima fase da instalação, por falta de memória ou falha de recursos do windows.
      4 - Erro fatal durante o processo de instalação atual, gera diálogo Abort-Retry-Ignore.
      5 - Usuário clicou em cancel durante o processo de instalação ou abor em mensagem referenciada no código de saída 4.
      6 - Setup finalizado de maneira forçada pelo debugger. Run | Terminate usado em IDE



Comandos suportados pelo unistall.exe

/SILENT, /VERYSILENT

O desinstalador não irá pedir ao usuário confirmações ou exibir que a instalação foi concluída.
Arquivso compartilhados que não estão mais em uso serão excluídos sem confirmação.
Todas as mensagens de erro crítico ainda serão exibidas na tela.
Quando especificado /VERYSILENT a janela de progresso de desinstalação não será exibida.
Se a reinicialização for necessária e o comando /NORESTART não for usado e /VERYSILENT for especificado, o desinstalador irá reiniciar sem pedir.

/SUPPRESSMSGBOXES

Suprime as caixas de mensagens. Só tem um efeito quando combinado com /SILENT e /verysilent.
Consulte /SUPPRESSMSGBOXES dos comandos de instalação para mais detalhes.

/LOG

Cria arquivo de log da desinstalação com nome baseado na data e hora atual, não sobrescreve nem incrementa arquivo existente. É extremamente técnico e a estrutura das linhas podem ser modificadas sem aviso de uma instalação para outra.
/LOG="filename"

Igual ao log, exceto pelo fato de poder especificar um caminho e nome do arquivo para o arquivo de log. Caso o arquivo indicado já exista ele é substituído. Se o arquivo não puder ser criado, a desinstalação será abortada com uma mensagem de erro.

/NORESTART

Nada haver com a bandinha emo meia boca, somente instrui a instalação a não reiniciar mesmo que isso seja necessário.


Comando próprio de desinstalação do firebird

/CLEAN

Remove os arquivos: firebird.conf, aliases.conf, firebird.log e security2.fdb

Unistaller Exit Codes

Retorna diferente de 0 se for abortado por cancelamento ou erro fatal.

Microsoft, Skype e Delphi


Como você certamente sabe, a Microsoft anunciou na última semana a compra do Skype, uma das maiores da história da companhia. De fato, pagaram 8.5 bilhões de dólares para a empresa de telefonia virtual conhecida mundialmente. Aqui eu não entrar em detalhes na questão financeira ou comentar sobre o preço (bastante algo, pelo que vejo, mas possivelmente bom para posicionar a Microsoft além de seus negócios tradicionais).

O que me interessa, ao invés disso, é focar em um detalhe, não menos importante. O cliente do Skype para Windows, de longe mais utilizado e de maior sucesso é escrito em Delphi. Alguém poderia perguntar se uma aplicação feita em Delphi vale 8 bilhões, quanto vale o Delphi? Mas isso não seria realista. Certamente é um bom anúncio para o Delphi, espero que o marketing da Embarcadero possa tirar proveito disso.

Usar Delphi foi bom para o Skype?

Da perspectiva de desenvolvedor, o real e mais importante é tentar descobrir o quanto a decisão de usar o Delphi foi boa para o Skype em primeiro lugar, se isso contribuiu para o sucesso do produto e da companhia, e se eles tivessem escolhido uma ferramenta diferente. Eu acho que a resposta para esta questão destaca alguns aspectos positivos do Delphi para ISVs (independent software vendor – fornecedor de software independente) que querem fazer a distribuição de suas aplicações facilmente.

De fato, a não necessidade de um ambiente de execução (como Java ou .NET) torna a distribuição de um programa em Delphi significativamente mais simples do que uma aplicação C# ou Java. Também, torna possível suportar um grande número de versões de Windows de um único executável. No momento o download do Skype é bem alto, mas costumava ser menor antigamente, quando a banda era mais limitada. Ainda, não requerer dúzias, quando não centenas, de megabytes de bibliotecas torna a distribuição ainda menor do que de aplicações gerenciadas. Além de não necessitar bibliotecas, não existe componente COM ou outras bibliotecas de configuração específica em Windows, novamente fazendo o processo de distribuição e instalação bem simples.

De outro lado, embora eu não conheça muito sobre como é o Skype internamente, a alta qualidade da integração de aplicações Delphi para Windows, o suporte a múltiplas bibliotecas de Socket e conjuntos de componentes visuais, permitem ajudar a criar mais facilmente um clone do Skype do que com outra de ferramentas de desenvolvimento não gerenciadas, como o Microsoft Visual C++.

Skype e Delphi

Sendo assim, acho que o Delphi contribuiu para o sucesso do Skype, embora é difícil dizer o quanto. Agora, pode o Skype contribuir para o sucesso do Delphi? Possivelmente... você não usaria uma ferramenta que lhe permite criar uma empresa de 8 bilhões? Piadas a parte, deixemos que todos saibam que o cliente do Skype para Windows é feito em Delphi e é uma ótima maneira de alavancar a ferramenta de desenvolvimento da Embarcadero. Mas o Skype não esta sozinho, veja o Show Case para uma maior gama de aplicações feitas em Delphi.

Curso de Delphi: 7.Consultas SQL