Capa do Livro Orientação a Objetos

É com grande alegria, e com um certo atraso (mas vocês já estão acostumados, não é mesmo?), que estou colocando a venda meu e-book: Orientação a Objetos com Delphi.

Em 2013, fiz um esboço para um curso que abordasse a geração de Boletos em Delphi. Seria disponibilizado sob o formato de vídeo aulas. Ficou apenas no esboço.

Ano passado, resolvi tentar produzir este curso. Cheguei a gravar algumas vídeo aulas. Porém, produzir neste formato se mostrou incompatível com a minha atividade principal (tenho uma microempresa para tocar).

O tempo foi passando e aquilo ficava martelando minha cabeça (“Termina o que começou, termina…”). Aí veio a ideia de criar o livro.

Questão resolvida, visto que eu poderia escrever a qualquer hora. Não haveria necessidade de ter uma estrutura para isso e nem depender de silêncio (Meu escritório fica em frente à rua. Quem grava vídeo aulas sabe bem o quanto é frustrante competir com o barulho externo).

Um mês e meio depois após ter iniciado, eis que finalmente pude terminar de diagramar o livro. E dou por cumprida a missão de falar sobre o tema, mesmo não sendo no formato inicial proposto. Abaixo mais detalhes.

Resumo do Livro:

  • Título: Orientação a Objetos com Delphi
  • Subtítulo: Crie um projeto do zero para a geração de BOLETOS em Delphi Rio
  • Páginas: 158
  • Formato: e-book
  • Indicado para: Iniciantes em Delphi que já tenham uma noção de como criar uma aplicação do tipo Windows VCL Application e de como trabalhar com relatórios.
  • Destaques:
    • Introdução à Programação Orientada a Objetos
    • Construção do Diagrama de Classes do Projeto
    • Desenvolvimento Guiado por Testes (TDD) e testes END-TO-END
    • Impressão utilizando Fast Report e Fortes Report
    • Os fontes do projeto serão disponibilizados para dirimir dúvidas

Proibida a reprodução total ou parcial deste livro, seja qual for o meio, eletrônico ou mecânico.

Preço: R$ 69,90

Preço: R$20,97 (70% desconto)

Como comprar:

Você poderá efetuar a compra clicando no botão abaixo:

Screenshots:

Índice do Livro

CAPÍTULO 1 6
Objetivo 7
Definição do Problema 8
Escopo do Livro 9
Versão do Delphi 10
A quem se destina este livro? 11
O que é Boleto? 12
CAPÍTULO 2 13
Código Fonte dos Exemplos 14
Breve Introdução à POO 15
Classes e Objetos 16
Constructors 18
Herança 20
Encapsulamento 22
Polimorfismo 24
Abstração 26
Interfaces 28
CAPÍTULO 3 30
Iniciando os trabalhos 31
Definindo as Classes do Projeto 32
Classe TConta 33
Classe para Pagador e Beneficiário 34
Classe TTiulo 34
Classe TBoleto 34
Mais um princípio 36
CAPÍTULO 4 37
Delphi, finalmente… Ainda não! 38
Configuração do Projeto Teste Unitário 39
CAPÍTULO 5 43
Código Fonte do Projeto 44
Código das Classes Básicas 45
Classe TBoleto 51
Reformulando TBoleto 52
Passos para a formatação do boleto 54
CAPÍTULO 6 55
TDD (Test-Driven Development) 57
Primeiros Testes 58
Padrão de Projeto Builder 68
Implantando o Banco do Brasil 75
CAPÍTULO 7 83
Formatando o Campo Livre 84
Nosso Número e suas variações 86
Formatando o Código de Barras 95
Formatando a Linha Digitável 100
Implantando Bradesco 103
Container de Boletos 107
CAPÍTULO 8 114
Testes End-To-End 115
Módulo de Impressão 126
Impressão com o Fast Report 128
Ajustes no Módulo de Impressão 146
Impressão com Fortes Report 151
Conclusão 158
Referências 159

Desenvolvedor de software desde 1995. Em 1998, abriu sua própria empresa, a Lukas Sistemas, desde então passou a atender diversas empresas, principalmente autopeças. Apaixonado por Delphi, porém não o impede de flertar com outras linguagens sempre que possível. Mora na cidade de Balsas/MA com sua esposa e dois filhos.

31 thoughts on “E-book Orientação a Objetos com Delphi”

  1. Parabéns, não sei se você e o mesmo do grupo do REST Dataware se for peço permissão para divulgar seu trabalho no grupo.

    1. Olá Jefferson

      De acordo com o índice exposto no post, o livro aborda apenas a parte de geração de boletos (Banco do Brasil e Bradesco, utilizando Fast Report e Fortes Report) visto que, na minha opinião, a criação dos arquivos de remessa (e até os de retorno) seguiria a mesma ideia já abordada na geração dos boletos. Assim, teríamos uma repetição desnecessária de temas.

      Futuramente, caso o tempo aqui permita, eu crie alguns posts dando alguns “insights” sobre essa questão.

      Obrigado pelo contato.

    1. Bom dia Anderson.

      Eu já me deparei com questionamento como este, no que se refere ao relacionamento das tabelas. Até coloquei um código exemplo de como eu trabalho essa questão(nos comentários do post http://www.luizsistemas.com.br/2013/05/refatorando-atributos-que-tal-um-orm-basico-parte-13/). Porém, pela reincidência, detecto como sendo um requisito ainda pendente.

      Vou fazer uma análise, e caso seja necessário, irei colocar uma issue no projeto.

      Vlw pela colaboração.

      Abraços.

  2. Olá Professor! Espero que esteja bem.
    Adquiri o seu livro “Orientação a Objetos com Delphi” e durante a execução do projeto deparei com um problema. Desculpe a ignorância, mas meu objetivo é entender e compreender a OO com Delphi.
    No capítulo 6 – TDD, na página 75, travei na criação “manual” do “TestDigitoDoNumeroDoBancoInvalido”. Após criar os métodos de acordo como estão e executo o teste, o teste me retorna um “Access Violation”. Refis umas três vezes e hoje, executei até o ponto em que você sugere para inserir o “SetDadosPadrao”, no médoto “procedure TestTFormata001.SetUp;”. Após executar o teste, continua me retornando “Access Violation”, porém quando deixo o “SetDadosPadrao;” como comentário o teste passa, mas não apresenta erro. Será que você pode me ajudar a descobri onde estou errando? Se puder, me passe seu email para lhe enviar o meu código.
    Obrigado por enquanto.

        1. Olá Paulo

          Analisei seu código e realmente tem um erro de nomenclatura do método que cria instância de objeto, ou seja, o método Create, no qual todos os objetos herdam diretamente da classe TObject. Você colocou “Creatre” nas classes TConta e TBoleto. Desta forma, o objeto não foi corretamente instanciado, pois em TBoleto, no constructor, você instancia Conta chamando o constructor Create, ou seja, o método da classe pai de todos os objetos (TObject). E em TObject, não existe a criação de Banco. Por isso, quando executa o teste, ao passar em SetDadosPadrao, obterá um access violation, pois banco ainda não existe. Para corrigir, basta renomear onde tiver Creatre para o correto, ou seja, Create.

          Antes de fazer a correção, só para que você constate e também veja como eu cheguei a essa conclusão, descomente a linha do SetaDadosPadrao e marque um breakpoint na primeira linha deste método:
          Breakpoint na linha de criação do objeto

          Agora, execute em modo debug (F9) e execute o teste.

          Quanto parar na linha do breakpoint, tecle F8 para descer para a próxima linha. Agora, ao passar o mouse por cima do Conta.Banco, verá que banco está nil, ou seja, banco não foi criado.

          Percebe como os testes podem ajudar a identificar erros?! Desde os mais básicos como este até os mais complicados.

          Espero que eu tenha sido claro.

          1. Olá! Desculpe a demora.
            Mas, muito obrigado pela ajuda. Como podes ver, não tenho muita experiência em POO com Delphi e nem com a aplicação de testes TDD.
            Voltarei ao projeto e farei as correções.
            Grato.

  3. Olá Professor Luiz, como vai?
    Espero que tudo estejas bem.
    Durante a prática dos exercícios do livro “Orientação a Objetos com Delphi”, na página 107, quando da criação da unit chamada GeraBoletoContainer.pas, foi implementado os métodos “constructor” e o “destructor”, porém, talvez por erro na digitação, os mesmos não foram definidos na classe TBoletoContainer.
    É uma observação caso outros tenham dificuldade.
    Att.

    1. Grato Paulo, realmente na finalização da diagramação faltou as duas linhas de declaração dos métodos Create e Destroy:

      TBoletoContainer = class(TInterfacedObject, IBoletoContainer)
        private
          FBoletos: TList<IBoleto>;
        public
          constructor Create;
          destructor Destroy; override;
      
          function Add: IBoleto;
          procedure Delete(Index: Integer);
          function Boletos: TList<IBoleto>;
          procedure Imprimir;
        end;
      
  4. Olá Professor!
    Eu sei o que você vez por mim ao produzir esse livro. Assim, continuando meus estudos sobre POO, no livro “Borland Delphi 7 Curso Completo(Marcelo Leão), logo após enviar a observação anterior, encontrei a seguinte questão:

    … como os métodos construtor e destrutor podem ser executados, se não foram sequer definidos para a classe? (pág. 274)

    Na minha humilde e mínima sabedoria sobre POO já tinha lido e executado alguns exercícios, e sempre definindo os métodos citados.

    E, para esclarecer a minha dúvida, Marcelo Leão ensina que se utilizarmos “… os métodos Create e Destroy sem que os mesmos houvessem sido explicitamente declarados na classe. Esses métodos foram definidos na classe-base (TObject), podendo ser utilizados nas classes dela derivadas por herança.” (LEÃO, pág. 276)

    Ai Professor, veio outras dúvidas, por favor me corrija caso esteja enganado:

    (I) se na classe-base TObject os métodos Create e Destroy já são definidos, na forma como estava a implementação dos métodos, na classe “TBoletoContainer” antes da observação para correção, os mesmos seriam ou não efetivados?

    (II) uma vez que a classe “TBoletoContainer” foi definida como uma subclasse da classe “TInterfacedObject”, a implementação dos métodos, sem serem definidos na classe, seria efetivada ou geraria um erro?
    Att.

    1. Ótima questão e mostra que você está no caminho certo.

      Bom, vamos lá, se entendi bem sua observação, seria no caso de não termos declarado o constructor em TBoletoContainer, não é mesmo?

      Herança é um dos pilares da POO, e tem tudo a ver com o que estamos tratando aqui. Veja, se não tivesse declarado e implementado o método Create nesta classe, ao instanciarmos um objeto do tipo TBoletoContainer, estaríamos acionando o Create de TObject.

      Porém, aí teríamos um problema, visto que precisamos criar a nossa lista de Boletos:

      FBoletos := TList.Create;

      Por isso precisamos sobrescrever o método Create. Se assim não o fizermos, obteríamos um access violation quando tentássemos acessar a lista de boletos.

        1. Só para que não fique nenhuma dúvida, onde eu disse que estaríamos acionando o Create de TObject, poderia ser também o método constructor de algum objeto no qual nossa classe herdasse e que tivesse, esta classe ancestral, sobrescrito o método Create de TObject. É como se fosse uma rede de objetos, uns herdando de outros, até chegar em uma classe comum à todas, o TObject.

  5. Certo.
    Baixei os arquivos do seu GitHub (LivroDelphiBoleto-CodigoExemplo), porém os fontes dos exercícios não encontrei.
    Abri no Delphi o arquivo “ProjectGroupLivroBoletoExemplos.groupproj”, mas exibe várias pastas e dentro delas, parece que os arquivos foram gerados como pacotes (package).
    É isso mesmo? Tenho que fazer algum procedimento diferente para encontrar os fontes?
    Att

    1. Olá Paulo

      O “ProjectGroupLivroBoletoExemplos.groupproj” é um grupo de projetos, ou seja, ao abri-lo você terá na aba projects:
      – ClassesPrj.exe
      – HerancaEx.exe
      – Polimorfismo.exe
      – MetodoAbstrato.exe
      – InterfacesPrj.exe
      – Encapsulamento.exe

      Basta dar duplo-clique sobre o projeto que deseja estudar e a partir daí executá-lo (F9). Para verificar os fontes, basta espandir clicando no ícone que está logo atrás do nome de cada projeto.

  6. Olá! Boa noite!
    Espero que estejas bem.
    Dando sequência nos estudos do livro, onde, nos fontes, eu encontro o arquivo “Boleto.fr3”?
    Att.

  7. Caro Luiz

    Acabei de comprar teu livro, ótima didática, mas, senti falta dos atalhos para criação dos código no Delphi, teria como suprir essa minha necassidade?

    1. Olá Fernando,

      Eu particularmente utilizo com mais frequência os seguintes:

      * Ctrl + S para salvar
      * Ctrl + Shift + S para salvar tudo
      * Shift + F12 para abrir o Form List;
      * Ctrl + F12 para abrir o Unit List;
      * Ctrl + Shift + A para localizar a Unit de determinada função, método, objeto ou variável/constante (nem sempre o Delphi irá conseguir executar este comando, mas sempre tento primeiramente este atalho antes de partir para outro meio de localização – leia-se Wiki Delphi)
      * Ctrl + Shift + E para renomear uma variável
      * Ctrl + D para formatar o código (eu já codifico no padrão de 2 espaços, porém, vire e mexe eu tenho que pegar código legado sem formatação)
      * Ctrl + F para localizar na unit atual
      * Ctrl + Shift + F para localizar em arquivos do projeto
      * Alt + F11 – para usar determinada Unit (adicionar na cláusulas – uses – a Unit desejada)
      * Ctrl + Shift + F9 compilar sem Debug
      * F9 compilar com Debug
      * Ctrl + Shift + seta para baixo/cima ir para declaração/implementação do método
      * Ctrl + Shift + C criar a implementação de um método. Quando criar a declaração do método, basta utilizar este atalho para criar a implementação.

      Pesquisando no Google, você encontra lista com todos os atalhos, como por exemplo:
      https://tsanthiago.wordpress.com/2018/05/21/existem-teclas-de-atalho-no-delphi-cbuilder-radstudio/
      https://www.blog.tyttosoft.com.br/post?pagina=32

      Espero ter ajudado.

      Abraços.

  8. Boa tarde, Professor Luiz!
    Enterder os conceitos OO é relativamente fácil, principalmente pelo uso de analogias com objetos do mundo real. Chega a ser divertido, inclusive. No entanto, aplicar esses conceitos e transformar o seu código procedural em um código OO exige muito mais do que, simplesmente, entender os conceitos. Eu venho do Clipper, ZIM, FoxPro, SQLWindows, Deplhi (procedureal) e há dias, senão anos, venho estudando OO e ainda não me sinto confortável para programar OO. Com seu livro, através da sua forma de ensinar, eu tô conseguindo migrar do campo conceitual para o prático. O engraçado é que eu domino outros conceitos que são utilizados na programação OO e que serão muito úteis quando eu tiver virado essa chave. Parabéns pelo trabalho!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.