Aqui nós temos também, tínhamos pelo menos,
continua tendo o código lá, mas a gente tem que fazer astúcias
para poder rodar em 2017 e 2019.
Se você for na minha página e baixar o código e rodar no 2015, ele roda
provavelmente no automático, roda na minha máquina em todo caso.
Bom eu quero dizer aqui que a gente tem o mesmo exemplo que eu já fiz,
os mesmos exemplos que eu tinha feito no Builder,
está refeito aqui também em Microsoft Visual C++.
Então você tem aí essa...
aplicação da universidade
com ListBoxUniversidades,
ListBoxDepartamentos, botão iniciar e adicionar,
exatamente as mesmas funcionalidades que a gente viu lá no C++ Builder.
O que mudou que foi só a interface gráfica no sentido de ser outro RAD.
Então está ali.
Através da caixa de propriedades, pode-se
definir as características de cada componente,
tais como nome, cor, posição na tela, tamanho, imagem de fundo etc...
Então, em sendo ambiente RAD, você de fato tem tanta possibilidade aqui de
inspecionar as propriedades do seus objetos gráficos,
como também trabalhar com eventos e outras coisas em torno.
É uma boa prática de programação sempre definir características básicas,
como o nome, o título para telas, ou texto para botões.
Isso é verdade,
isso vale também para os outros ambientes RAD.
Eventos.
Então, a gente sabe que pode programar eventos ao clicar no botão iniciar ali,
por exemplo, em um ambiente, em tempo de programação de desenvolvimento,
ele vai abrir a possibilidade de programar um evento para isso.
Também eu posso tratar outros eventos além do ButtonClick,
aqui ó,
ali tem o ButtonClick, mas eu tenho outras possibilidades,
como Mouse e por aí vai, MouseEnter e etc.
Então eventos.
É uma ação externa ao programa, por exemplo: um click de mouse,
uma tecla pressionada, movimento de tela, uma tela abrindo ou fechando.
Com o duplo click sobre os componentes, por exemplo os botões ali,
é selecionado o evento padrão,
onde pode-se inserir o código a ser executado quando o evento ocorrer,
conforme a gente já viu não C++ Builder.
Ok, ainda falando sobre eventos.
Quando o evento é selecionado, é adicionado
automaticamente à classe o método que trata o evento, de fato.
Por exemplo, hora que eu cliquei no botão aqui iniciar,
ele criou este evento aqui, ele selecionou automaticamente para mim,
e eu fui lá e construí o meu código.
Pode-se usar tanto as classes do .NET quanto as classes padrões da API Win32.
O objeto "e", está aqui, que é passado
como parâmetro traz informações sobre o evento ocorrido e pode ser utilizado no código.
Um exemplo é a posição, x e y, do mouse quando ele sobrepõe um componente.
Legal.
Então vocês podem ter informações a mais aqui que vem por parâmetro.
Muito bem.
Agregação de janelas.
Quando você...
assim, como eu estou trabalhando aqui com o objeto principal da classe principal
interagindo com a parte gráfica,
eu tenho que dar um jeito de esses caras se conhecerem para eles interagirem.
Então, qual eu fiz lá no C++ Builder,
eu fiz uma arte aqui, criando, no form principal, um ponteiro para objeto principal.
E aí, bom, e aí aqui,
usando todas as astúcias de código controlado em C#,
eu programo as situações
que já tinha programado no C++ Builder.
O que eu quero dizer é o seguinte, volta aqui um pouquinho.
Vocês lembram lá do C++ Builder, que a hora que eu clicava aqui em iniciar ele vinha ele procurava
no ListBoxUniversidades.
Aqui tem o código
Common Language Runtime, CLR,
misturado com C++, que permite fazer
aquelas astúcias de população de popular aqui o ListBox.
Se você olhar ali, eu faço uma ListBox clear, aí eu acesso
o iterador de universidades do objeto principal colocando ali em begin,
enquanto o iterador não estiver em end,
eu vou fazer o que?
Vou recuperar, através do iterador,
o nome de cada universidade que está na minha lista de universidades,
lá dentro do objeto principal, bem entendido.
Aqui eu vou armazenar isso numa string, esse nome,
aí eu converto a string numa string gráfica,
por assim dizer, e adiciono a string gráfica no ListBoxUniversidade, procurando a coisa,
faço o iterador++ para poder recuperar a próxima universidade e assim vai.
Se eu clicar aqui em adicionar, ele vai abrir um segundo form
que é outro form que essa aplicação trabalha, vocês
sabem da aula passada que,
na aplicação aí das Universidades,
eu tenho form principal
e eu tenho o form para adicionar a universidade.
Então hora que eu clico aqui ele vai chamar o segundo form,
que é o tal do form addUniv.
Lá hora que eu criei o form, ele chamou esse form addUniv
e a aplicação do C++ Builder fez coisa parecida.
Bom, aqui eu faço o que?
Se por acaso o add form não tiver sido inicializado ainda,
eu crio ele automaticamente,
os ambientes gráficos CLR não trabalham com new, eles trabalham com gcnew, então eu quero dizer aqui que tem uma série de peculiaridades
com relação a esse "dialeto de C++", controlado.
Você vê que é um código que tem seus nuances, você tem que aprender mais desse código
aqui para trabalhar com a parte do form em Microsoft.
Bom, de fato eu crio dinamicamente
o form do addUniv, caso ele não exista, e faço ele conhecer
o objeto principal
que, obviamente, está inicializado na construtora do form principal.
Bom, aqui daí eu faço limpaTextBox
do formulário que adiciona universidade,
faço o formulário se apresentar e trago ele pra frente, faço ele ficar em destaque.
Bom, isso aqui é basicamente a mesma aplicação que a gente já tinha visto lá, gente,
em C++ Builder,
só que agora, obviamente, em Visual Studio.
E aí, insisto, com esses nuances de código aqui,
bastante peculiar do CLR.
\i1}Common Language Runtime,
e, novamente, o CLR é um código que permite fazer a parte gráfica
no ambiente Visual Studio
compartilhado com outras linguagens,
C#, e ademais.
Professor, então se eu entendi bem,
quando você faz uma aplicação RAD com C++ no Visual Studio,
a parte de núcleo do C++ continua sendo um código de C++
que supostamente roda direto no processador,
sem camada nenhuma, sem máquina virtual,
enquanto a parte gráfica é algo que roda, aí sim,
sobre uma camada intermediária, uma máquina virtual,
sem estar rodando direto no processador?
Sim, você entendeu certo, é isso mesmo.
Então, na verdade o que acontece quando você roda uma aplicação RAD C++ em ambiente Microsoft,
que tem parte da aplicação rodando em C++ puro
e a outra parte, que é a parte gráfica, rodando sob uma máquina virtual,
sob essa camada .NET.
Importante: sempre que apagar um método de evento no código,
lembrar de apagar o seu nome na caixa de propriedades.
Isso é importante mesmo.
Exemplo com figurad geométricas.
Esse exemplo de figuras geométricas que a gente já tinha mostrado no C++ Builder.
Exemplo com desenhos.
Pode-se utilizar as classes do .NET para desenhar,
pintar ou até mesmo carregar as figuras na tela.
Neste exemplo é mostrado uma forma simples de como redefinir o método padrão de pintura da janela.
Bom, aqui vocês percebem que os ambientes são muito parecidos,
você olha lá o C++ Builder e olha o, então,
RAD C++ da Microsoft,
eles seguem princípios filosóficos muito similares.
Por quê? Porque ele segue o mesmo...
as mesmas técnicas
já definidas lá na ciência da computação anteriormente,
e também, obviamente, porque o desenvolvedor que fez o C++...
que o fez o Delphi que inspirou o C++ Builder,
ele depois foi trabalhar lá na Borland e depois na Microsoft.
que é o Hejlsberg que eu mostrei para vocês na aula passada.
Bom.
Aqui você tem o...
form rodando, aqui ele desenha umas figurinhas,
você aperta o botão para fazer eles mexerem.
Vamos ver o que os slides estão dizendo para a gente aqui.
Este método utiliza o argumento de evnto: e.
Então, aqui, ele vai ter o método
que foi programado chamado Desenhos_Desenha,
esse método vai permitir o que?
Desenhar graficamente elipse, linha e retângulo lá no form,
e depois, hora que você fizer o...
sempre baseado no valor_aumentar, que é utilizado ali no y,
e lá no ButtonClick você faz justamente esse método aumentar
que, insisto, hora que você fizer o click aqui no mover, o que vai acontecer?
Ele vai rodar o Mover_Click,
que é esse evento aqui, ele vai fazer o valor_aumentar
incrementar em 10, obviamente que esse valor_aumentar já foi inicializado na construtora,
aí ele faz o próprio formulário fazer um refresh.
O que acontece hora que você faz um Refresh?
Bom, o que acontece hora que você chama o Refresh,
ele vai automaticamente chamar essa função Desenhos_Desenha.
Essa função Desenhos_Desenha foi programada, obviamente,
pelo programador, esse código não é um código que vem por definição, ele é um código que foi escrito pelo programador,
justamente para, a partir de astúcias técnicas,
ele poder fazer aqui os desenhos da elipse, da linha e do retângulo.
Aqui é um pouco mais burocrático do que acontecia lá no C++ Builder,
ele primeiro tem que criar um caneta, aí essa caneta
que vai permitir a parte gráfica do formulário,
a parte gráfica do formulário que está aqui,
através da caneta, a elipse, depois a linha
e depois o retângulo.
Então insisto,
na construtora o valor_aumentar foi inicializado com 0,
cada vez que eu clico no botão mover,
ele vai fazer o que?
Ele vai fazer o Mover_Click que incrementa o valor_aumentar em 10
e faz um Refresh do formulário.
Quando ele faz um Refresh do formulário, ele chama a função frm_Desenhos_Desenha
e faz essa arte que é criar uma caneta,
e a partir dessa caneta ele consegue
acessar o formulário através do "g" aqui que é a parte gráfica,
e desenha ali a elipse, a linha e o retângulo, bem entendido.
Em tempo, essa função aqui, até onde eu me recordo, foi feita na unha,
entretanto, com a capacidade de receber dados de eventos,
inspirado em funções que seriam geradas pelo próprio ambiente.
Aí tem a peculiaridade,
para que o Refresh saiba que tem que chamar essa função aqui, Desenhos_Desenha,
respeitando essa parametragem que foi dada aqui à luz de conhecimento técnico,
é necessário, lá na construtora, fazer algumas amarrações.
A construtora aqui, além de inicializações do ponto de vista gráfico,
também ocorre um arte dizendo que, hora que dar um Refresh,
a parte do pente, além de já chamar as funções que
naturalmente é chamado nesse ambiente,
é adicionado uma nova funcionalidade
que é justamente utilizar a função frm_Desenhos_Desenha.
E aí isso garante, através dessa amarração que foi feita técnica aqui,
isso garante que a hora que eu aperto aqui o botão mover,
que ele chamar o Mover_Click, vai incrementar coisa aqui,
vai fazer o Refresh do formulário,
em função da amarração que eu mostrei no slide 21,
ele chama essa função Desenhos_Desenha aqui.
Bom, pessoal, aqui basicamente a ideia
foi explicar para vocês
que já houve na Microsoft um ambiente
que era RAD para C++ altamente intuitivo para a criação das coisas.
Conforme eu já disse aqui e repeti várias vezes,
a partir de 2017 deixou de ser tão intuitivo pois não vem via menus, você tem que fazer coisas na unha.
Bom, ainda que o ambiente RAD fosse intuitivo
e mesmo a partir do momento que você consiga criar na unha,
uma situação que você consiga ter o form e começa a programar
aí sim RAD, arrastando objetos, botões,
ListBox etc, teu form programado via RAD,
ainda assim o ambiente tem peculiaridades,
que é essa história de código controlado, CLR,
que não é um código de C++ purista no tocante da parte de forms.
E, como vocês perceberam, se você comparar essa solução em Microsoft
com relação ao Builder, C++ Builder,
na minha opinião, lá no C++ Builder as coisas são mais intuitivas,
tanto pelo fato de ser um código C++ mais purista, mas também parece ser um pouco menos burocrático.
É isso que eu tinha para contar para vocês nesse...
nesse grupo de slides.
Aqui eu tenho a explicação feita do...
dos desenhos,
que você vê ali o formulário, eu posso ver o código do formulário, exibir código.
Então aqui, aqui eu estou no Visual Studio,
simplesmente peguei o 2019, abri o meu projeto
que rodava até 2017,
abri 2019, tentei fazer a conversão
por várias maneiras, mas a conversão
sempre dá um erro aqui ou um erro lá,
provavelmente deve ter toda uma manobra técnica para permitir a aplicações RAD criadas antigamente
continuarem rodando no Microsoft 2019,
mas tem que fazer todo um debulhar da parte técnica
e, insisto, perde o espírito de RAD.
Mas tudo bem.
Vamos lá só para mostrar como
a gente fazia as aplicações em RAD em C++ outrora.
Você tinha aqui o formulário, você tem ali o exibir código,
você tem lá o frm_Desenhos_Desenha derivado de Form,
você tem a construtora, você tem InitializeComponent,
você tem o valor_aumentar recebe 0.
O que mais?
InitializeComponent aqui,
aliás,
só fazer uma retificação do que eu disse em relação aos slides,
a amarração do código lá
para que a hora que você chame o Refresh ele rode,
também, a função frm_Desenhos_Desenha,
ela não está explicitamente na construtora, ela está no InitializeComponent
que por sua vez o InitializeComponent é chamado na construtora, obviamente.
Bom, as coisas estão aqui, que é código relativo ao formulário.
Se você olhar ainda aqui hora que eu clico em mover,
ele abre a função btn_Mover_Click
e faz um incremento do valor_aumentar, chama o Refresh,
Refresh esse que, graças a essa amarração que está aqui no initialize,
chamado InitializeComponent que é chamado na construtora,
eu consigo daí chamar o frm_Desenho.
Dito de outra maneira,
clico Mover, vai chamar o
tratamento de eventos que é o btn_Mover_Click,
vai incrementar o cara, vai dar o Refresh,
o Refresh, graças a amarrações feitas,
consegue chamar o frm_Desenhos_Desenha,
que daí faz ali a criação de uma caneta,
através dessa canete ele vai conseguir desenhar a elipse, a linha e o retângulo.
Se você comparar com o C++ Builder,
você vai ver que lá é menos burocrático,
bom, ele usa o canvas, usa outra abordagem.
Pessoal, espero que vocês tenham gostado da aula,
aqui a intenção foi mostrar outra alternativa que existia de RAD,
mas que não está mais tão RAD assim,
quem sabe nas versões próximas tenha via menu novamente
a possibilidade de criar aqui um novo projeto
que volte a contemplar o C++.
Se eu vir aqui, Projeto/Solução,
abrir não, novo, criar,
projeto,
eu não acho o form com C++.
Se por acaso eu estiver equivocado, tem aqui um lugar escondido
e eu não esteja conseguindo localizar,
vocês me avisam que daí a gente refaz o vídeo
e mostra a maneira de fazer,
mas pelo melhor meu saber, pelas procuras que eu fiz,
não achei a maneira de fazer isso aí.
Estou repassando os olhos novamente, e de fato não tem,
tem para C#, mas não para C++, que é o ambiente RAD.
Acho que é isso, gente.
Bons estudos,
e nos vemos no próximos encontro, próxima aula.