Training Delphi (Pascal)
Autor: Ciência da Computação - JokerHat | Publicado: 2016-04-30T14:22:00-03:00










<!--[if gte mso 9]>
 
  Normal
  0
  
  
  21
  
  
  false
  false
  false
  
  PT-BR
  X-NONE
  X-NONE
  
   
   
   
   
   
   
   
   
   
   
   
  
  MicrosoftInternetExplorer4
  
   
   
   
   
   
   
   
   
   
   
   
  
<![endif]-->



Neste POST, iremos desenvolver um utilitário para sistemas operacionais
Windows X. Do zero. Deste a estrutura ao instalador. Sua noção sobre esta abordagem será mais ampla.

Ferramentas:
1. Delphi XE8
2. Inno Setup

Opcional:
3. Photoshop
4. Illustrator

Estou recentemente em um projeto de automação comercial. Antes de começar a programar
eu costumo fazer alguns testes com a linguagem para familiarização e analise de
recursos. A maioria começa com um "Hello World" ou desenvolvendo
alguma calculadora (com é o costume).
Gostei do release XE8 do Delphi. Tem muitos recursos os quais auxiliam bastante
o desenvolvimento. Entre eles o "apparence" que possibilita a troca
de layouts da aplicação e a conversão da aplicação para reconhecimento em x86 e
x64 sem a necessidade da mudança no código.

O MascWindows Release Deluxe Edition @BETA foi desenvolvido em um NETBOOK com:

1. Processador: AMD Dual Core da série E1 2100 (série com APU) 1Ghz

2. 4 GB de memória RAM de
barramento DDR3
3. Sistema Operacional x64 (64 bits)



Foi testado em:


1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Máquina virtual configurada:
1.1. Sistema operacional Windows 7 x86;

1.2. 1Gb
de memória RAM;

2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Processador Pentium 4 3Ghz

2.1. 1Gb de memória RAM de barramento DDR2

2.2. Sistema Operacional x86


Versão BETA é uma versão de testes. Ja notifiquei alguns problemas que devem ser acertados para arquitetura x32. Depois explico o que é e como acertar. Por enquanto, esse utilitário eu uso para fins pessoais e não comerciais. Então, pode ser uma ideia para vc. Este é propósito do Blog ser um caderno de rascunho.

Notou-se que para sistemas x86 (32 bits), a conversão do
código x64 para x86 não foi o suficiente. Na execução do utilitário, as
condições do ambiente para capacidade de memória menor que o recomendado pelos
sistemas Windows pode ocasionar em um atraso para que a interface apareça ao
usuário. 

Notou-se também que, a conversão de x64 para x86, executando
o utilitário x86 em ambiente de 64 bits, a funcionalidade LogonUI não funciona.
Embora seja o mesmo código. Porém, apenas na versão x64 em ambiente 64 bits. Ou
seja, o executável deve ser o mesmo da arquitetura do processador.

Em resumo, a conversão de arquiteturas elo Delphi XE8 não é
o suficiente para garantir a capacidade de compatibilidade das funcionalidades
do sistema. É preciso desenvolver, diretamente, uma versão para x86 e ou para
x64. 

Neste caso, os recursos gráficos são a causa que necessitam
de mais memória. A propriedade AlphaBlender torna a janela transparente. Após implementar
essa propriedade nas funcionalidades ocorreu este atraso na execução.



Bom, a versão @BETA deste utilitário foi desenvolvida para
ambientes x64 e convertida (opcionalmente) para arquiteturas x86. A versão x86
para ambiente com pouco recurso como o mínimo recomendado por Sistemas
Operacionais Windows, pode ocorrer um atraso do clique até a apresentação da
interface gráfica. Caso já tenha o recomendado isso não ocorre.

Esta foi uma experiência no desenvolvimento de uma release
de um utilitário que nós usamos em boa parte de trabalhos pedidos por alguns
amigos e clientes. Além de um training com a versão da IDE DELPHI XE8. Hoje,
com fundamento didático.

Vamos fazer o passo a passo deste utilitário em Delphi XE8.
Disponibilizando o código vc aprimora conforme suas necessidades. O utilitário
atende já as nossas.

Depois dessa, tenho de incluir alguns aplicativos em iOS e Android e posso posta-los aqui.

Let’s GO.
Vou postando conforme o tempo. Estou em viagem e durante as passagens vou atualizando. Abaixo esta os executáveis x64 e x86.



Obs: Para dar privilégios administrativos, basta clicar com o botão direito do mouse sobre o ícone da aplicação (pode ser o atalho), e clique na opção executar como administrador. Para realizar esta operação apena suma vez, coloque com o botão direito do mouse sobre o ícone e escolha "abrir local do arquivo". Neste local esta o executável, clique com o direito sobre ele e escolha "propriedades". Clique na aba compatibilidade e marque a opção "executar este programa como administrador". 
O iNNO Setup, o programa que foi usado para criar um instalador para a aplicação, mesmo deixando o executável com esses privilégios, ele salva uma cópia sem esta configuração. Eu não explorei o Inno Setup direito. Vou dar uma olhada melhor, o bom é que ele é free.








MascWindows-x86-x64-Setups.zip





-----------------------------------------------------------------------------------

TRACK 1 - SOBRE O COMPILADOR/IDE
Delphi, trata-se de uma IDE (Ambiente de Desenvolvimento Integrado) e um compilador em linguagem de programação Pascal direcionado para plataforma Windows. Ele foi originalmente produzido pela Borland Software Corporation e hoje é continuado pela Embarcadero (https://www.embarcadero.com/).

A IDE Delphi é paga. Implementa diversos recursos&nbsp; a cada versão que auxilia e facilita o desenvolvimento de aplicações voltadas a Desktop, Mobile e Web. A versão que estou testando é a XE8. Com ela é possível darmos trocarmos o layout da aplicação com os defaults e converte-las para arquiteturas x86 e X64. Ela também permite desenvolvermos aplicativos e jogos para mobile em versões iOS e Android com firemonkey. 

Existe um projeto Open Source em cross plataform de uma IDE que implementa a linguagem Pascal de forma livre. Ela é conhecida como Lazarus (http://www.lazarus-ide.org/). Porém, não contém todas os possíveis recursos da IDE Delphi XE8. 

Bom, eu não incentivo a pirataria, então sou forçado a dizer-lhe para baixar a IDE Deplhi XE8 no fabricante. Geralmente eles dão um período de teste de 30 dias. Contudo, é bom salientar que para aplicações comerciais é obrigatório uma licença de uso mas para uso pessoal não. A versão de estudante também é interessante. Veja no link: https://www.embarcadero.com/br/products/delphi

Baixe, instale normalmente (vai demorar...).

Se quiser fazer alguns exemplos para reconhecimento do ambiente poderá pegar este link como opção: http://www.functionx.com/delphi/Lesson01.htm
-----------------------------------------------------------------------------------
&nbsp; 
TRACK 2 - LAYOUT - TELA PRINCIPAL (MAIN)

Obs: Vou disponibilizar o código fonte depois.

Abra o Delphi XE8. Na pagina inicial clique em "Create a new project..." e escolha a opção "VCL Forms Application"




Como você pode observar, existe diversas opção de projetos que ao longo do tempo e conforme sua necessidade, você passará a dominar. Entre eles o que mais usaremos é a "VCL Forms Application" 
que cria telas (screens) de toques podemos também chama-las de formulários (forms) onde passamos a incluir os componentes. E podemos usar também as DLLs como opção às classes do sistema.

Dê o nome que você quiser e salve em uma pasta do projeto referente. O meu caso chamo de MascWindows. Será criado um atalho do projeto na página inicial.

No formulário em branco você adicionará componentes formando assim o layout da aplicação (Não vou abordar um exemplo para uma aplicação hellow world, porque exemplos como este serão fácies para você encontrar na internet, ela ajuda você a familiarizar com a ferramenta).

Faça algo parecido:



Na "Palheta de componentes" você irá escolher o componente que o Formulário irá conter. Na Propriedade deste componente você irá setar as configurações.

No meu formulário Principal temos:

1. Formulário
1.1. Caption: "MascWindows Deluxe Edition @BETA"
1.2. Name: "Form 1"
1.3. Height: 478
1.4. Width: 708
1.5. KeyPreview: true
1.6. Position: poScreenCenter
1.7. BorderStyle: bsSingle
1.8. BorderIcons: biMaximize: false
1.9. AlphaBlend: false
1.10. AlphaBlendValue: 100

2. TPanel: Painel para atrás da imagem
2.1. Caption: ""
2.2. Name: "pImage"
2.3. Height: 289
2.4. Width: 367

3. TImage
3.1. Name: "IMG"
3.2. Height: 264
3.3. Width: 342
3.4. Picture: "busque a imagem que quiser"

4. TLabeledEdit
4.1. Caption: "Nº de Imagens:"
4.2. Enabled: false
4.3. Height: 21
4.4 Width: 81
4.5. Name: "edlNImg"

5. TLabeledEdit
5.1. Caption: "Diretório:"
5.2. Enabled: false
5.3. Height: 21
5.4. Width: 226
5.5. Name: "edlDirectory"

6. TListBox
6.1. Name: "lbImg"
6.2. Height: 102
6.3. Width: 313

7. TLabeledEdit
7.1. Caption: "Altura:"
7.2. Enabled: false
7.3. Heigth: 21
7.4. Width: 81
7.5. Name: "edlWidht"

8. TLabeledEdit
8.1. Caption: "Largura:"
8.2. Enabled: false
8.3 Height: 21
8.4. Width: 81
8.5. Name: "edlHeight"

9. TListBox
9.1. Name: "lbFavorite"
9.2. Height: 102
9.3. Width: 313

10. TPanel
10.1. Name: "pControl"
10.2. Height: 120
10.3. Width: 688

11. TGroupBox
11.1. TRadionButton
11.1.1. Name: "rbCenter"
11.1.2. Checked: true
11.2. TRadionButton
11.2.1. Name: "rbExpand"
11.3. TRadionButton
11.3.1. Name: "rbSideToSide"

12. TCheckBox
12.1. Name: "cbChangeRealTime"
12.2. Caption: "Visualizar em Tempo Real"

13. TButton
13.1. Name: "btViewLogonUI"
13.2. Caption: "Visualizar LogonUI"
13.3. Height: 33
13.4. Width: 216

14. TButton
14.1. Name: "btWallPaper"
14.2. Caption: "Wallpaper"
14.3. Height: 42
14.4. Width: 105

15. TButton
15.1. Name: "btLogonui"
15.2. Caption: "LogonUI"
15.3. Height: 42
15.4. Width: 105

16. TButton
16.1. Caption: "Del Favoritos"
16.2. Name: "btDelFavorite"
16.3. Height: 72
16.4. Width: 81

17. TButton
17.1. Caption: "Iniciar Slide"
17.2. Name: "btStartSlide"
17.3. Height: 56
17.4. Width: 99

18. TButton
18.1. Caption: "Parar Slide"
18.2. Name: "btStopSlide"
18.3. Height: 56
18.4. Width: 105
19. TMaskEdit
19.1. Name: "mkTime"
19.2. EditMask: "!90:00:00;1;_"
19.3. Height: 24
19.4. Width: 81

20. TComboBox
20.1. Name: "cbTimeSlideHour"
20.2. Height: 21
20.3. Width: 63

21. TComboBox
21.1. Name: "cbTimeSlideMinutes"
21.2. Height: 21
21.3. Width: 63

22. TComboBox
22.1. Name: "cbTimeSlideSeconds"
22.2. Height: 21
22.3. Width: 63

23. TOpenDialog
23.1. Filter: "Somente imagens JPG|*.jpg"
23.2. Title: "Masc Windows v.2"
23.3. Name: "opImg"

24. TMainMenu
24.1. Name: "mMenu"
24.2. Arquivo
24.2.1. Caption: "Abrir Imagem"
24.2.1.1 ShortCut: "Ctrl+O"
24.2. Caption: "Sair"
24.2.1. ShrtCut: "Alt+F4"

24.3. Caption: "Controle"
24.3.1. Caption: "Wallpaper"
24.3.1.1. Caption: "Definir Walpper"
24.3.1.1.1. ShortCut: "Ctrl+W"
24.3.1.2. Caption: "Wallpaper Centralizado"
24.3.1.2.1. ShortCut: "Ctrl+Alt+C"
24.3.1.3. Caption: "Wallpaper Expandido"
24.3.1.3.1. ShortCut: "Ctrl+Alt+E"
24.3.1.4. Caption: "Wallpaper Lado a Lado"
24.3.1.4.1. ShortCut: "Ctrl+Alt+L"

25.3.1.5. Caption: "Habilitar visualização em tempo real"
25.3.1.5.1. ShortCut: "Ctr+F1"
25.3.1.6. Caption: "Desabilitar visualização em tempo real"
25.3.1.6.1. ShortCut: "Ctrl+F2"
25.3.1.7. Caption: "Posição do Wallpaper"
25.3.1.7.1. ShortCut: "Ctrl+Alp+P"

25.4. Caption: "Configurar LogonUI"
25.4.1. ShortCut: "Ctrl+L"
25.5.Caption: "Visualizar LogonUI"
25.5.1. ShortCut: "Ctrl+M"

25.6. Caption: "Habilitar janela invisível"
25.6.1. ShortCut: "Ctrl+F3"
25.7. Caption: "Desabilitar janela invisível"
25.7.1. ShortCut: "Ctrl+F4"

25.8. Caption: "Ajuda"
25.8.1. ShortCut: "F1"
25.9. Caption: "Sobre"
25.9.1. ShortCut: "Ctrl+H"

26. TTimer
26.1. Name: "tCont"
26.2. Interval: "1000"

Agora escolha o estilo do Layout. Clique no atalho CTRL+SHIFT+F11. Irá abrir a janela de Opções do Projeto. Clique em APPARENCE. Eu estou usando a AMAKRITS. Escolha e dê um ok.



Você visualizará clicando em F9, este comando irá compilar e criar um executável no diretório do projeto. Se tudo ocorrer bem, ao compilar, você verá uma imagem semelhante a esta:



Até aqui o layout do formulário principal esta pronto.

Você poderá trabalhar os ícones e as imagens do programa se quiser. Para isso estou usando o Photoshop CS5 e o Illustrator CS5.

Abra o Photoshop e crie um novo arquivo (Ctrl+N). Nas propriedades defina o tamanho do quadro do mesmo tamanho do IMG (TImage). A fonte que estou usando você pode baixá-la aqui: http://www.dafont.com/pt/search.php?q=Woodcutter+Tags+on+a+Rope. Após baixá-la, descompacte e jogue a font .ttf em "C:/Windows/Fonts". Agora, basta inserir um texto na Layer e escolher a fonte Woodcutter Tags on a Rope ou qualquer uma que definir. A arte final esta em png (fundo transparente) na cor branca, no fundo do blog (branco) não vai aparecer.

O ícone eu criei no Illustrator. Peguei a imagem d uma cartola e vetorizei. Criei um laço e inserir um título. Para converter a imagem em ícone você pode usar este site: http://icoconvert.com/


-----------------------------------------------------------------------------------


TRACK 3 - LAYOUT - TELA WALLPAPER

A tela WALLPAPER tem o mesmo sentido. Crie conforme sua criatividade.
Para criar outros formulários no mesmo projeto e na mesma aplicação clique em File/New/Vcl Form Delphi






1. MENU
1.1. Arquivo
1.1.1. Sair
1.1.2. ShortCut: F4
1.2. Ajuda
1.2.1. Ajuda
1.2.1.1. ShortCut: F1
1.2.2.&nbsp; Sobre
1.2.2.1. ShortCut: Ctrl+H

2. TSplinter: se não encontrar na paleta, basta vc digitar o nome em "search"
2.1. Align: alLeft
2.2. Hight: 346
2.3. Width: 28

3. TStatusBar
3.1. Align: alBottom

4. TPanel
4.1. Align: alLeft
4.2. Height: 346
4.3. Weidth: 425
4.4. TImage
4.4.1. Height: 273
4.4.2. Width: 393
4.4.3. Top: 16

TPanel: 
align: alRigth

5. TEditedLabel
5.1. Height: 21
5.2. Width: 94
5.3. Name: edlImgTempWidth
5.4. Caption: "Largura:"
5.5. Text: 1

6. TEditedLabel
6.1. Height: 21
6.2. Width: 94
6.3. Name: edlImgTempHeight
6.4. Caption: "Altura:"
6.5. Text: 0

7. TTrackBar
7.1. Name: "tbX"
7.2. width: 193
7.3. Orientation: trHorizontal

8. TTrackBar
8.1. Name: "tbY"
8.2. width: 193
8.3. Orientation: trHorizontal

9. TCheckBox
9.1. Name: "cbTransparent"
9.2. State: "cbChecked"
9.3. Caption: "Visualização Transparente"

10. TButton
10.1. Caption: "Ok"
10.2. width: 193
10.3. height: 33

O formulário:
AlphaBlend: true
AlphaBlendValue: 130
BorderIcons: biMaximize: false
BorderStyle: bsSingle
Caption: "MascWindows Deluxe Edition @BETA .:. WALLPAPER"
Name: "FWallpaper"
KeyPreview: true
width: 731
height: 421
-----------------------------------------------------------------------------------

TRACK 4 - LAYOUT - TELA LOGONUI

Aplique a mesma ideia para construção do formulário LogonUI.
Crie um novo formulário e siga os mesmos passos conforme sua necessidade. Disponibilizei o código fonte, por meio dele vc é capaz de ver detalhes de cada formulário.



Baixe&nbsp; o código fonte que nela contem as imagens que criei no photoshop. Estão em PNG fundo transparente. O posicionamento das imagens é referente à tela de logon para melhor visualização da aplicação final.

-----------------------------------------------------------------------------------

TRACK 5 - LAYOUT - TELA SOBRE

A tela sobre o sistema é desenvolvida da mesma forma que as anteriores.
A imagem corresponde ao caracter C (maiúsculo) da fonte Joker: http://www.dafont.com/pt/joker.font



-----------------------------------------------------------------------------------

TRACK 6 - PROGRAMAÇÃOApós criarmos os layout da aplicação, vamos à programação.

Veja como ficou a UML do projeto:
Para criar suas UML pode baixar a versão FREE do astah: http://astah.net/editions/community

No Diagrama de caso de uso, podemos entender melhor as diversas opções que o usuário tem no sistema:



O mais prudente, por questão de organização, praticidade e manutenabilidade e controle de versões, vc poderia programa cada balão em uma DLL. Eu não fiz isso. Devido a ser uma versão BETA, preferi testar alguns métodos antes de aplicar em uma versão final.

Não vou abordar o diagrama de classe porque não escrevi. Saiba que isso se faz necessário em ambiente de trabalho contudo algumas empresas que não possuem equipe de desenvolvimento pecam nesse quesito. Isso causa muitos transtornos quando não se segue uma metodologia ágil. 

Eu criei duas classes chamadas: classImage - para controle das imagens usadas no sistema; e classRegistry - para controle de modificações criadas e configuradas no registro do sistema.

Vamos criar a classe classImage. Espero que vc ja tenha o conceito de POO (Programação Orientada a Objetos), para abordar sobre este assunto teríamos de abrir um Post apenas sobre este tema. Como opção poderíamos criar duas DLLs, eu preferi criar duas classes. Fique a vontade.

No delphi criamos classes com File/New/Unit - Delphi




Para maiores detalhes da estrutura de uma classe em Delphi, leia este artigo: http://www.devmedia.com.br/criando-uma-classe-delphi/23517. 

Minha classe ficou assim:




Na minha classe criei alguns atributos que serão usados na inicialização da classe e os seguintes métodos públicos. Baixe o código fonte para vê-los em detalhes.

A funcionalidade da classe é muito simples, nela eu controle as imagens abertas no sistema como redimensionamento, local de armazenamento das imagens.

Se você fizer uma pesquisa para saber como se troca o WALLPAPER da tela de logon vai perceber que o diretório responsável por armazenar imagens é a 'C:\Windows\System32\oobe\info\backgrounds'. Dentro deste diretório iremos salvar a imagem que escolhermos sempre com o nome: "BACKGROUNDDEFAULT.jpg"
Estou usando o diretório \AppData\Local da maquina hospedeira para guardar as imagens temporárias da aplicação.
Lembrando que esta versão teste comporta apenas imagens JPG. Vc poderá habilitar outros métodos de acordo com sua necessidade apenas inserindo nesta classe. Se eu decidir criar uma DLL, basta entrar com uma conexão remota para atualização dos arquivos que compõe o MascWindows habilitando outras funcionalidades ao sistema. Torno a lembrar que as DLL são muito interessantes ara quesitos como este.

Outro detalhe importante na classe de controle das imagens. O método ViewLogonUI é a simulação da tela de bloqueio da tela (WINKEY+L). Estou usando o evento OnKeyDown do formulário. Se vc não habilitar o KeyPreview do formulário em suas propriedades, as teclas digitadas não irão ser habilitadas para funcionalidade deste método:
procedure TMascImage.ViewLogonUI;
&nbsp;begin
&nbsp;&nbsp;&nbsp; keybd_event(91, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
&nbsp;&nbsp;&nbsp; keybd_event(76, 0, 0, 0); //DIGITA A LETRA "L"
&nbsp;&nbsp;&nbsp; keybd_event(91, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
&nbsp;end;


A classe TRegistry:
Não vai bastar, para algumas versões do windows, criar uma basta no Oobe. É preciso habilitar ou permitir a troca do wallpaper nas chaves de registro.

Em HKEY_LOCAL_MACHINE/SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background deve estar como TRUE (1) para que a permissão seja concedida.
Em HKEY_CURRENT_USER/Control Panel/Desktop estão o local referente a pasta criada no Oobe contendo a imagem de background opcional ao default e os estilos de apresentação do wallpaper: centralizado, estendido, lado a lado e com coordenadas de posicionamento definidas pelo usuário.

Eu pesquisei no site da Microsoft sobre estas informações e apliquei manualmente estas configurações. Vc poderá visualiza aqui: https://support.microsoft.com/en-us/kb/329677

Entenda que manualmente é trabalhoso. O programa, assim como qualquer outro, é apenas uma forma de encurtar este caminho facilitando para qualquer usuário as formas e caminhos necessários para alguma finalidade no sistema. Neste caso, a troca do backgroud.
------------------------------------------------------------------------

TRACK 7 - ARQUITETURAS

Note que, para que você tenha opções dos módulos de arquiteturas para suas aplicações, você precisa ter uma máquina que comporte x64 (64 bits). Desta forma você tem a opção para criar x64 e x86 (32 bits). Caso contrário apenas x86.

Basta você criar a seu projeto. Por default ele virá referente à sua arquitetura. Para inserir outra arquitetura, clique com o botão direito do mouse sobre TARGET PLATAFORMS/ ADDPlataform e escolha a arquitetura.



No meu caso tenho as duas. Para que você complete a criação do módulo para tal arquitetura, clique sobre a arquitetura referente que queira criar. Logo, aperte o atalho F9 para compilar e criar o executável. Na pasta do seu projeto estará descriminado das arquiteturas com seu respectivo executável:




------------------------------------------------------------------------

TRACK 8 -CRIANDO O HELP
Para criar uma caixa de ajuda é fácil.
Você pode usar qaulquer editor de texto para criar seus arquivos de ajuda e documentação. A Microsoft disponibiliza um utilitário para estafinalidade. É interessante porque a organização fica mais bonitinha.

Baixe a ferramenta HTML Help Workshop and Documentation aqui: https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;id=21138

Para maiores detalhes em como usar este utilitário, veja aqui: 
https://en.wikibooks.org/wiki/Windows_Programming/Compiled_HTML_Helphttp://www.macoratti.net/win_hlp.htm
https://www.microsoft.com/en-us/download/details.aspx?id=21138

Como o próprio nome vem a dizer, trata-se de arquivos HTML que são compilados por este utilitário criando um arquivo .chm.
Como descrito na documentação, você pode criar os HTMLs diretamente na ferramenta ou criá-los à parte e depois chamá-los neste utilitário. Foi isso que eu fiz, criei os HTMLs à parte e chamei os arquivos .html pelo utilitário. Muito fácil.
Assim criei o .chm, arquivo de ajuda do sistema. Faça alguns testes, por mais que eu descreva aqui você encontrará diversos formas de ajuda na internet que serão suficientes para matar duvidas que irão surgir que não abordaria neste post.


------------------------------------------------------------------------

TRACK 9 - CRIANDO O INSTALADOR
Existem muitas opções pagas e free mas eu preferi o INNO SETUP.
O que faz um instalador? Ele exporta e cria atalhos dos arquivos de sua aplicação em locais específicos e definidos pelo usuário e ou desenvolvedor. Criar um instalador é perda de tempo, se existe uma tecnologia para isso é viável que vc reutilize.

Você pode baixar o INNO SETUP aqui: http://www.jrsoftware.org/isinfo.php.
No site tem tudo o que você precisa saber incluindo exemplos.

É simples, você irá na sua pasta de projeto, pegar o executável de sua aplicação, imagens, documentação, licença, ícones, etc e jogar tudo em uma basta só. Separe o x64 do x86.
Instale e abra o INNO SETUP.


LICENÇA:
-------------

Licença de uso de Software. Existem várias. Se vc deseja registrar seu código fonte, basta inserir tudo em um documento e habilitar nas regras e normas Brasileiras do INPI: http://www.inpi.gov.br/menu-servicos/programa-de-computador/documentacao-tecnica-para-registro-de-programa-de-computador.
Desta forma vc assegura que o código é seu. Desta forma você estabelece suas regras de uso ou licença para usá-lo cobrando ou não taxas e etc. Se decidir fazer isso é bom ter um controle no código para monitorar quem o usa e quem não o usa, embora isso seja trivial pois da para burlar isso na memória RAM.

Certo, a licença pode ser free. Leia mais sobre o assunto aqui: https://pt.wikipedia.org/wiki/Licen%C3%A7a_de_software
No meu caso estou usando a licença MIT, ou seja, faça o que vc quiser com isso: http://escolhaumalicenca.com.br/licencas/mit/

Eu escrevi em um bloco de notas. Esse bloco você chama nas configurações do INNO SETUP.


README:
-----------

Este arquivo geralmente contém instruções de uso e detalhes sobre a aplicação. Vem junto com os arquivos da aplicação. No meu caso incluí as versões, detalhes e informações que não contém no arquivo .chm (ajuda) do sistema como complemento.


Os ícones criei no Photoshop, neste caso o ícone de "instalação". Na descrição dos passos anteriores contém o link de conversão online de imagens para ícones em várias dimensões.


Só isso.
Compile o INNO SETUP com os arquivos de sua aplicação.
No meu caso os arquivos são descompactados, de acordo com a arquitetura, nos Arquivos e Peogramas (86) ou (64).
É criado um atalho na área de trabalho e no menu iniciar.
É criado um ícone da aplicação em Painel de Controle/Programas e Recursos com opção de desinstalação além do atalho UNISTALLER para excluir (desinstalar) o utilitário do computador hospedeiro.



Baixe o código fonte e analise melhor as rotinas. Para mim o utilitário ja faz tudo o que eu preciso e só criei esta versão para você entender como tudo funciona.

Bom, este post esta terminado.
É isso, talvez nos vemos em sala de aula daí eu abordo com detalhes e sano qualquer dúvida referente.

Este é um exemplo em DELPHI (PASCAL). Agora que vc ja tem o código e conhece as rotinas dos métodos, converta para a linguagem que você quiser. É importante você notar a viabilidade de cada linguagem para determinada aplicação. Eu também su DESIGN e prezo uma boa aparência das aplicações e tenho uma ideia para doutorado, em delphi .NET, as mais populares IDEs de desenvolvimento, temos recursos que auxiliam e muito o desenvolvimento dos layouts. Java ainda não vi nenhum recurso referente em sua paleta, nem de terceiros e os mais próximos deixam a desejar.Crie um recurso em JAVA de forma que seja usado recursos para modificação e estilização dos layouts.


-----------------------------------------------------------------------------------
Obs: Irei abordar a descrição do programa utilitário aos poucos, porém, se quiser já observar o que foi feito baixe o código fonte aqui: http://www.4shared.com/zip/kj4jIW5Nba/Project-MascWindows.html
No link esta o ZIP com icones, imagens e código fonte do MascWindows 2.0.41

<!--[if gte mso 9]>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  
  
 
<![endif]--><!--[if gte mso 10]>

 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:"Tabela normal";
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-priority:99;
 mso-style-qformat:yes;
 mso-style-parent:"";
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin-top:0cm;
 mso-para-margin-right:0cm;
 mso-para-margin-bottom:10.0pt;
 mso-para-margin-left:0cm;
 line-height:115%;
 mso-pagination:widow-orphan;
 font-size:11.0pt;
 font-family:"Calibri","sans-serif";
 mso-ascii-font-family:Calibri;
 mso-ascii-theme-font:minor-latin;
 mso-hansi-font-family:Calibri;
 mso-hansi-theme-font:minor-latin;
 mso-bidi-font-family:"Times New Roman";
 mso-bidi-theme-font:minor-bidi;
 mso-fareast-language:EN-US;}

<![endif]-->