Você está na página 1de 33

Apostila de C++ Builder 3.

Wandreson Luiz Brandino brandino@ish.com.br Abril 1999

ndice
1 Introduo.........................................................................................................................3
1.1 Quem pode fazer este curso?............................................................................................3 1.2 Sobre este material............................................................................................................3

2 Programao Orientada a Objetos..................................................................................4 3 O Ambiente C++ Builder..................................................................................................6


3.1 Arquivos Importantes.......................................................................................................7 3.2 Menu e Paleta de Componentes.......................................................................................7 3.3 Object Inspector................................................................................................................8

4 Projeto 1: Soma dois nmeros.......................................................................................10


4.1 Classe TEdit....................................................................................................................10 4.2 Classe TButton................................................................................................................12 4.3 Classe TLabel..................................................................................................................12 4.4 Cdigo Fonte...................................................................................................................13

4.4.1 Arquivo Project1.bpr............................................................................................13 4.4.2 Arquivo Project1.cpp...........................................................................................15 4.4.3 Arquivo Unit1.dfm...............................................................................................16 4.4.4 Arquivo Unit1.cpp...............................................................................................16 4.4.5 Arquivo Unit1.h...................................................................................................17
4.5 Cdigo Fonte em Pascal..................................................................................................18 4.6 Exerccios.........................................................................................................................18

5 Projeto 2: Editor de Texto Simples (classe TMemo)...................................................20


5.1 Classe TMemo.................................................................................................................20 5.2 Classe TString.................................................................................................................21 5.3 Classe TOpenDialog (falta acabar eventos)..................................................................23 5.4 Classe TSaveDialog.........................................................................................................24 5.5 Cdigo Fonte...................................................................................................................25

5.5.1 Arquivo Unit1.dfm...............................................................................................25 5.5.2 Arquivo Unit1.cpp...............................................................................................25


5.6 Procedimentos e Funes................................................................................................26 5.7 Exerccios.........................................................................................................................29

6 Projeto 3: Editor de Texto Melhorado (TRichEdit).....................................................31


6.1 Classe TMainMenu.........................................................................................................31 6.2 Classe TRichEdit.............................................................................................................31

1 Introduo
Esta apostila destina-se ao aprendizado da linguagem de programao C++ Builder 3.0 da Inprise (www.inprise.com). Nesta apostila sero abordados os conceitos bsicos de programao orientada, programao orientada a eventos e programao visual. Sero utilizados praticamente todos os componentes (objetos) da linguagem, entretanto o foco principal desta apostila a de desenvolvimento de aplicaes voltadas para a Internet.

1.1 Quem pode fazer este curso?


Qualquer pessoa que saiba lgica de programao e tenha usada pelo menos uma linguagem de programao estruturada.

1.2 Sobre este material


Este material foi produzido para fins educacionais, e pode ser reproduzido sem a necessidade de CopyRight Os programas fontes, bem como este documento encontram-se no site do autor em www.inf.ufes.br/~brandino

2 Programao Orientada a Objetos


Antes de falarmos em objeto, precisamos entender o conceito de classe. Uma classe uma abstrao que se faz em informtica para agrupar determinados dados e manipula-los de forma coerente. Em geral uma classe possui os seguintes elementos: Propriedades Mtodos Eventos

Uma propriedade ou atributo de uma classe um valor. Seja ele numrico, data, hora, caracter ou qualquer outro tipo Um mtodo uma operao que realizada sobre as propriedades de uma classe. Uma classe pode possuir vrios estados. Quando um destes estados muda, acionado um evento associado a esta mudana. Para facilitar a compreenso do conceito de classe pense na seguinte situao: Voc esta responsvel pela informatizao do departamento pessoal de uma empresa, e precisa desenvolver um programa para clculo da folha de pagamento. Como seria uma classe? A primeira coisa a ser feita dar um nome a esta classe, digamos TFolha. A partir da precisamos definir as propriedades, mtodos e eventos. Propriedades da classe TFolha: Nome. Esta propriedade guardaria o nome do funcionrio, na implementao precisamos definir o tamanho mximo de caracteres que esta propriedade suportar; Salario_Bruto. Esta propriedade guarda o salrio bruto de um determinado funcionrio; Outros_Proventos. A propriedade Outros_Proventos armazenar, caso haja, outros benefcios financeiros que o funcionrio receber; Outros_Descontos. Esta propriedade armazenar, caso haja, outros descontos, a serem efetuados do funcionrio; Mtodos da classe TFolha: Calculo_INSS. Este mtodo seria responsvel por calcular quanto deveria ser descontado de INSS do funcionrio, ou seja, este mtodo verificaria as propriedades Salario_Bruto, Outros_Proventos e Outros_Descontos, para calcular o valor do INSS e retornar este valor em uma varivel numrica; Calculo_FGTS. Este mtodo, tal como o anterior, calcularia o valor do FGTS com base nas propriedades; Calculo_Salario_Liquido. O clculo do salrio lquido tambm segue o mesmo princpio dos mtodos anteriores;

Eventos da classe TFolha: On_Ferias. O evento On_Ferias poderia ser acionado para lembrar ao operador do sistema que um funcionrio j pode solicitar frias. Dentro deste evento pode ser executado qualquer ao, como a de emitir um documento indicando que o funcionrio esta entrando de frias. Definida a classe, um objeto simplesmente uma instncia de uma classe. O objeto Func1 poderia ser uma instncia da classe TFolha. Neste sentido, se quisssemos fazer uma atribuio, ou executar um mtodo, utilizaramos o objeto Func1, e no mais a classe TFolha. Abaixo, mostrado como seria a atribuio de valores neste objeto: Func1->Nome = Jos da Silva; Func1->Salario_Bruto = 1300; Func1->Outros_Proventos = 200; Func1->Outros_Descontos = 0; Agora vejamos a execuo de alguns mtodos: A = Func1->Calculo_INSS(); B = Func1->Calculo_FGTS(); C = Func1->Calculo_Salario_Liquido(); Neste caso a varivel A recebe o clculo do INSS do objeto Func1, o mesmo acontece para o FGTS e Salrio Lquido, que vo para as variveis B e C respectivamente.

3 O Ambiente C++ Builder


O C++ Builder um ambiente de programao visual desenvolvido pela Inprise (antiga Borland) e que usa a linguagem de programao orientada a objetos C++. O sistema foi desenvolvido para plataformas Windows/32 bits e possui uma interface com o usurio bem simples e intuitiva.. A sua interface e os seus componentes (classes) so praticamente iguais ao do Delphi, linguagem de programao tambm desenvolvida pela Inprise. Ainda assim o C++ Builder torna-se uma ferramenta mais poderosa que o Delphi por permitir que programas desenvolvidos em Delphi sejam compilados com programas em C++ Builder (a reciproca no verdadeira), alm claro de contar com uma linguagem de programao muito mais robusta, o C++, do que o Delphi que usa a linguagem de programao Object Pascal. Apesar de vrias semelhanas, existem algumas pequenas diferenas principalmente quanto a notao. Observe os exemplos abaixo: em Delphi Edit1.Text := Nome; Label1.caption := Arquivo; Edit2.Clear; em C++ Builder Edit1->Text = Nome; Label1->Caption = Arquivo; Edit2->Clear();

Vamos a algumas diferenas entre as duas linguagens: No Delphi usa-se o smbolo ponto (.) para separar o objeto das suas propriedades e mtodos, j no C++ Builder o smbolo usado uma seta, sinal de menos e sinal de maior (->). No Delphi usa-se dois pontos e igual (:=) para o smbolo de atribuio, j no C++ Builder o smbolo somente o sinal de igual (=). No Delphi usa-se o apostrofo (aspas simples) para delimitar um conjunto de caracteres. J no C++ Builder usa-se aspas duplas. O C++ Builder casesensitive, ou seja, ele faz distino entre maisculas e minsculas, o que no ocorre no Delphi A notao do Delphi no deixa claro se estamos falando de uma propriedade ou de um mtodo, j a notao do C++ Builder deixa explicito isto. Quando no Delphi usase o mtodo Edit2.Clear, este poderia ser confundido com uma propriedade, j no C+ + Builder usaramos Edit2->Clear(). O abrir e fechar dos parnteses deixa claro que estamos falando de um mtodo, que neste caso no possui nenhum parmetro, mas caso existisse seria informado dentro dos parnteses.

3.1 Arquivos Importantes


O C++ Builder possui o conceito de projeto. Um projeto um ponto inicial, a partir do qual o seu programa ser chamado. Um projeto pode conter vrios programas. Caso voc simplesmente abra o C++ Builder e mande salvar tudo (Save All), ele salvar os seguintes arquivos: Project1.bpr Project1.cpp Unit1.cpp Unit1.dfm Unit1.h

A extenso bpr de Project1 armazena as diretivas de compilao, endereos de bibliotecas, etc A extenso cpp de Project1 como se fosse o main() dos programas em C++ do DOS, nele que esto todas as units (ou programas) que sero chamados, e a chamada principal. A extenso cpp de Unit1 o programa propriamente dito. Cada formulrio (tela) possui uma unit (ou programa) associado A extenso dfm de Unit1 a definio das posies dos objetos dentro do formulrio, a prpria posio do formulrio, etc, ou seja, tudo que esta relacionado com o formulrio A extenso h de Unit1 contm os cabealhos das funes e objetos que sero chamados dentro de Unit1.cpp Quando um programa compilado o C++ Builder gera um executvel, neste exemplo seria Project1.exe, e gera tambm inmeros outros arquivos intermedirios de compilao. Todos estes arquivos podem ser apagados posteriormente. Naturalmente os nomes de projetos e units podem ser mudados.

3.2 Menu e Paleta de Componentes


O menu de opes a paleta de componentes so os mostrados abaixo:

No menu File, as opes mais importantes so:

New Applicattion. Permite criar uma nova aplicao, usada sempre para comear um novo projeto Open Project. Esta opo utilizada para abrir um projeto j salvo Save All. A opo de Salve All permite salvar o projeto e todas as units associadas a ele. New Form. Esta opo cria um novo formulrio e unit dentro do mesmo projeto No menu Run, as opes mais importantes so: Run. Compila e executa o programa que esta sendo desenvolvido Program Reset. Esta opo utilizada quando um programa por algum motivo deu um problema e no quer voltar ao ambiente de desenvolvimento. Use-a para acabar a execuo do programa e voltar ao ambiente de desenvolvimento. Existem inmeras outras opes que iremos ve-las no decorrer do curso.

3.3 Object Inspector


O Object Inspector permite visualizar rapidamente as propriedades e eventos de um determinado objeto, mostrando ainda de qual classe ele pertence. Para verificar as propriedades de um determinado objeto, basta clicar no objeto em que se esta trabalhando, e o Object Inspector alternar para as propriedades e eventos deste objeto. Nem todas as propriedades de um determinado objeto so mostradas, alm de no mostrar nenhum mtodo a ele relacionado. Caso o usurio queira saber a relao completa de propriedades, mtodos e eventos, alm da hierarquia de classes, basta clicar no objeto e pressionar F1, que isto trar o Help do sistema, com as informaes a respeito daquele classe. Abaixo podemos verificar a Figura do Object Inspector, esquerda temos as propriedades do objeto Edit1 (classe TEdit), j no lado direito temos o Object Inspector mostrando os mtodos deste mesmo objeto.

possvel verificar por exemplo que o objeto Edit1 possui as propriedades: Text Name ReadOnly

E os eventos: OnChange OnEnter OnKeyDown

4 Projeto 1: Soma dois nmeros


Iremos construir agora o nosso primeiro programa em C++ Builder. Vamos comear com algo simples: Um programa para somar dois nmeros e mostrar o resultado na tela Para a construo deste programa iremos precisar de trs componentes (ou classes): TEdit; TButton e; TLabel

Vamos ento verificar algumas de suas propriedades, mtodos e eventos

4.1 Classe TEdit


Propriedades: Name. Esta uma propriedade que todos os objetos possuem, que o nome do objeto. Todo objeto precisa Ter um nome, para ser referenciado Text. A propriedade Text guarda o contedo digitado, ou pode ser o contedo para ser mostrado na tela ReadOnly. Esta propriedade aceita os valores true/false (verdadeiro/falso), caso o valor seja true, o usurio no poder digitar nenhum valor neste objeto. Caso o valor seja false, o usurio poder digitar qualquer valor neste campo Visible. Esta propriedade pode receber os valores true/false, caso o valor seja true o objeto ser mostrado na tela, caso contrrio no. Mtodos: SelectAll. Este mtodo seleciona todo o contedo do objeto CopyToClipboard. O mtodo CopyToClipboard copia o contedo selecionado do objeto para a rea de Clipboard PasteFromClipboard. O mtodo PasteFromClipboard cola o contedo da rea de Clipboard na propriedade Text do objeto Clear. Este mtodo limpa o contedo da propriedade Text. SetFocus. O mtodo SetFocus far com que o cursor seja posicionado neste objeto. Eventos: OnChange. O evento OnChange acionado quando a uma mudana na propriedade Text ocorrer, ou seja, quando houver uma mudana nesta propriedade o evento OnChange acionado. OnEnter. O evento OnEnter acionado quando o Focus da aplicao passado para esse objeto, ou seja, quando voc entra no objeto.

OnExit. O evento OnExit, ao contrrio do evento OnEnter acionado na sada do objeto, na mudana deste objeto para um outro qualquer. Alguns exemplos usando as propriedades, mtodos e eventos vistos anteriormente. Suponha que Edit1 e Edit2 so objetos da classe TEdit Exemplo 1: Igualar a propriedade Text de dois objetos Edit1->Text = Edit2->Text; /* Esta operao far com que a propriedade Text do objeto Edit1 seja igual a propriedade Text do objeto Edit2 */ Exemplo 2: Igualar a propriedade Text de dois objetos, s que utilizando mtodos Edit2->SelectAll(); Edit2->CopyToClipboard(); Edit1->Clear(); Edit1->PasteFromClipboard(); /* Este mtodo seleciona todo o contedo da propriedade Text */ /* Este mtodo copia o contedo da propriedade Text para o Clipboard */ /* Este mtodo limpa o contedo da propriedade Text. equivalente a Edit1->Text = ; */ /* Este mtodo copia o contedo do Clipboard para a propriedade Text do objeto Edit1. Observe que o contedo de clipboard poderia ser qualquer texto, copiando inclusive de outro lugar */ /* Coloca o cursor no objeto Edit1 */

Edit1->SetFocus();

Exemplo 3: Mostrar uma mensagem na tela se o contedo da propriedade Text do objeto Edit1 for alterado. Para fazermos isto, basta clicar no objeto Edit1, ir no Object Inspector, selecionar Events (eventos), dar dois cliques no evento OnChange, que o C++ Builder criar uma procedure, que dever ser chamada toda vez que ocorrer uma mudana na propriedade Text. Dentro desta procedure, ns podemos escrever qualquer comando, como por exemplo: ShowMessage(Houve uma alterao de valor); /* A funo ShowMessage mostra uma mensagem qualquer na tela */ A implementao completa ficaria assim:
void __fastcall TForm1::Edit1Change(TObject *Sender) { ShowMessage("Houve uma alterao de valor"); }

4.2 Classe TButton


Propriedades: Caption. A propriedade Caption far com que seja mostrado o nome indicado no boto. Enabled. Esta propriedade pode receber os valores true/false. Caso o valor seja true, o objeto pode ser acionado normalmente com um click do mouse. Caso a propriedade seja false, o click do mouse no far efeito algum. O objeto estar desabilitado at que a propriedade seja alterada. Mtodos: SetFocus. A funcionalidade a mesma do mtodo SetFocus de TEdit

Eventos: OnClick. O evento OnClick ser acionado quando o usurio clicar no boto. Vejamos alguns exemplos: Suponha que Button1 seja da classe TButton Exemplo 1: Colocar o texto Calcular no boto Button1. Button1->Caption = Calcular; Exemplo 2: Mostrar a mensagem Voc clicou no boto quando Button1 for pressionado. O boto ser pressionado significa que aconteceu o evento OnClick dentro de Button1. Logo dentro deste evento basta colocar-mos o comando ShowMessage(Voc clicou no boto). O comando completa seria:
void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage("Voc clicou no boto"); }

4.3 Classe TLabel


Propriedades: Caption. A propriedade Caption far com que seja mostrado o nome indicado no label. Agora j estamos prontos para fazermos a nossa primeira implementao.

4.4 Cdigo Fonte


Agora listaremos os arquivos gerados e o programa fonte para o problema de somar dois nmeros e imprimir o resultado. Os arquivos listados so: Project1.bpr Este arquivo foi gerado automaticamente, e guarda os parmetros de compilao para o programa, bem como os endereos de bibliotecas; Project1.cpp Este arquivo tambm foi gerado automaticamente e no precisa ser alterado. a partir dele que as Units sero chamadas; Unit1.dfm Este arquivo gerado pelo C++ Builder a partir das definies de objeto que o usurio vai fazendo na tela, ou seja, basta o usurio ir posicionando os objetos na ordem que desejar, com suas respectivas propriedades e eventos, que o arquivo vai sendo gerado automaticamente; Unit1.cpp Este arquivo conter o programa propriamente dito que possibilitar a soma dos dois nmeros. Grande parte do programa gerada automaticamente, somente a mudana que includa pelo programador. Maiores detalhes sero dados na sesso que lista o arquivo; Unit1.h Este arquivo tambm gerado automaticamente, e constitui os cabealhos e funes, procedures e declarao de objetos. Para funes definidas pelo programador, ele precisar sofrer pequenas alteraes. No o caso neste exemplo.

4.4.1

Arquivo Project1.bpr

# --------------------------------------------------------------------------!if !$d(BCB) BCB = $(MAKEDIR)\.. !endif # --------------------------------------------------------------------------# IDE SECTION # --------------------------------------------------------------------------# The following section of the project makefile is managed by the BCB IDE. # It is recommended to use the IDE to change any of the values in this # section. # --------------------------------------------------------------------------VERSION = BCB.03 # --------------------------------------------------------------------------PROJECT = Project1.exe OBJFILES = Project1.obj Unit1.obj RESFILES = Project1.res DEFFILE = RESDEPEN = $(RESFILES) Unit1.dfm LIBFILES = LIBRARIES = SPARELIBS = VCL35.lib PACKAGES = VCLX35.bpi VCL35.bpi VCLDB35.bpi VCLDBX35.bpi bcbsmp35.bpi dclocx35.bpi \ QRPT35.bpi TEEUI35.bpi VCLSMP35.bpi TEEDB35.bpi TEE35.bpi ibsmp35.bpi DSS35.bpi \ NMFAST35.bpi INETDB35.bpi INET35.bpi VCLMID35.bpi # --------------------------------------------------------------------------PATHCPP = .; PATHASM = .; PATHPAS = .; PATHRC = .; DEBUGLIBPATH = $(BCB)\lib\debug RELEASELIBPATH = $(BCB)\lib\release # --------------------------------------------------------------------------CFLAG1 = -Od -Hc -w -Ve -r- -k -y -v -vi- -c -b- -w-par -w-inl -Vx -tW CFLAG2 = -I$(BCB)\include;$(BCB)\include\vcl -D_RTLDLL;USEPACKAGES -H=$(BCB)\lib\vcl35.csm

CFLAG3 = -Tkh30000 PFLAGS = -U$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) \ -I$(BCB)\include;$(BCB)\include\vcl -D_RTLDLL;USEPACKAGES -$Y -$W -$O- -v -JPHN \ -M RFLAGS = -i$(BCB)\include;$(BCB)\include\vcl -D_RTLDLL;USEPACKAGES AFLAGS = /i$(BCB)\include /i$(BCB)\include\vcl /d_RTLDLL /dUSEPACKAGES /mx /w2 /zd LFLAGS = -L$(BCB)\lib\obj;$(BCB)\lib;$(RELEASELIBPATH) -aa -Tpe -x -Gn -v IFLAGS = # --------------------------------------------------------------------------ALLOBJ = c0w32.obj $(PACKAGES) sysinit.obj $(OBJFILES) ALLRES = $(RESFILES) ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib # --------------------------------------------------------------------------!ifdef IDEOPTIONS [Version Info] IncludeVerInfo=0 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=1046 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=1.0.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [Debugging] DebugSourceDirs=$(BCB)\source\vcl [Parameters] RunParams= HostApplication= !endif # --------------------------------------------------------------------------# MAKE SECTION # --------------------------------------------------------------------------# This section of the project file is not used by the BCB IDE. It is for # the benefit of building from the command-line using the MAKE utility. # --------------------------------------------------------------------------.autodepend # --------------------------------------------------------------------------!if !$d(BCC32) BCC32 = bcc32 !endif !if !$d(DCC32) DCC32 = dcc32 !endif !if !$d(TASM32) TASM32 = tasm32 !endif !if !$d(LINKER) LINKER = ilink32 !endif

!if !$d(BRCC32) BRCC32 = brcc32 !endif # --------------------------------------------------------------------------!if $d(PATHCPP) .PATH.CPP = $(PATHCPP) .PATH.C = $(PATHCPP) !endif !if $d(PATHPAS) .PATH.PAS = $(PATHPAS) !endif !if $d(PATHASM) .PATH.ASM = $(PATHASM) !endif !if $d(PATHRC) .PATH.RC = $(PATHRC) !endif # --------------------------------------------------------------------------$(PROJECT): $(OBJFILES) $(RESDEPEN) $(DEFFILE) $(BCB)\BIN\$(LINKER) @&&! $(LFLAGS) + $(ALLOBJ), + $(PROJECT),, + $(ALLLIB), + $(DEFFILE), + $(ALLRES) ! # --------------------------------------------------------------------------.pas.hpp: $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } .pas.obj: $(BCB)\BIN\$(DCC32) $(PFLAGS) {$< } .cpp.obj: $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< } .c.obj: $(BCB)\BIN\$(BCC32) $(CFLAG1) $(CFLAG2) $(CFLAG3) -n$(@D) {$< } .asm.obj: $(BCB)\BIN\$(TASM32) $(AFLAGS) $<, $@ .rc.res: $(BCB)\BIN\$(BRCC32) $(RFLAGS) -fo$@ $< # ---------------------------------------------------------------------------

4.4.2

Arquivo Project1.cpp

//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop USERES("Project1.res"); USEFORM("Unit1.cpp", Form1); //--------------------------------------------------------------------------WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; } //---------------------------------------------------------------------------

4.4.3

Arquivo Unit1.dfm

As definies de tela so armazenadas no arquivo com a extenso dfm. Abaixo, mostrado o nome de todos os objetos que foram utilizados para a construo deste programa. O Objeto Form1 da classe TForm, e a tela onde sero colocados os outros objetos. Os objetos Label1, Label2 e Label3 so da classe TLabel, e foram utilizados para escrever um contedo na tela. Os objetos Edit1, Edit2 e Edit3 so da classe TEdit e foram utilizados para a entrada e a sada dos resultados, e por ltimo temos o objeto Button1 da classe TButton, que foi o objeto utilizado para realizar a operao de soma.

Form1 Label1 Label2 Button1 Label3 Edit3 Edit1 Edit2

4.4.4

Arquivo Unit1.cpp

Neste arquivo, devemos incluir o que queremos que o nosso programa faa. Faremos isto no evento OnClick do objeto Button1, ou seja, quando o usurio clicar no boto executaremos uma determinada ao. Para fazermos isso, basta o usurio dar dois cliques em Button1, que este criar a funo Button1Click, associada ao evento OnClick deste boto. Agora basta escrevermos o que desejamos que a funo faa:
/* Cria uma varivel R (maiscula) que armazenar valores reais */ float R; /* A funo StrToFloat converte uma String em um nmero real, como a propriedade Text do objeto Edit1 do tipo String, esta converso torna-se necessria. O mesmo ocorre com Edit2 */ R = StrToFloat(Edit1->Text) + StrToFloat(Edit2->Text); /* J a funo FloatToStr faz exatamente o contrrio, ou seja, converte um nmero real em uma String, para poder ser exibida no objeto Edit3, na propriedade Text */ Edit3->Text = FloatToStr(R);

Veja a listagem completa do programa:


//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm"

TForm1 *Form1; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { float R; R = StrToFloat(Edit1->Text) + StrToFloat(Edit2->Text); Edit3->Text = FloatToStr(R); } //---------------------------------------------------------------------------

4.4.5

Arquivo Unit1.h

//--------------------------------------------------------------------------#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------class TForm1 : public TForm { __published: // IDE-managed Components TLabel *Label1; TEdit *Edit1; TLabel *Label2; TEdit *Edit2; TButton *Button1; TLabel *Label3; TEdit *Edit3; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------#endif

4.5 Cdigo Fonte em Pascal


O cdigo abaixo de um programa em Pascal que tem por objetivo o mesmo do exerccio anterior, ler dois nmeros e imprimir o seu resultado. Este programa esta colocado aqui para fazermos algumas comparaes na prxima sesso.
PROGRAM Teste; Uses CRT; Var a, b, R: integer; Begin Clrscr; Writeln(Programa soma dois nmeros); Writeln(Digite o primeiro nmero); Readln(a); Writeln(Digite o segundo nmero); Readln(b); R:= a + b; Writeln(O resultado : , R:7:2); Readkey; End.

4.6 Exerccios
4.1) Fazer um programa que solicite o valor de x, y e z e mostre o resultado da equao: f(x,y,z) = x3 y.z2 + 1 4.2) Melhorar o programa Soma dois Nmeros para que quando o usurio clicar no boto Calcula, ele mostre a soma, a diferena, a multiplicao e a diviso do primeiro pelo segundo nmero (em objetos Edits diferentes) 4.3) Fazer um programa para calcular as razes da equao do 2 grau. A frmula : = b 2 4.a.c x1 = x2 = b+ 2.a b 2.a

Dica 1: No C++ Builder usa-se a funo sqrt(d) para calcular a razes quadrada de d. Mas esta funo no consta na linguagem, portanto, no incio do programa (Unit1.cpp), devese incluir a linha: #include <math.h> Dica 2: Deve-se verificar se 0, pois caso isso ocorra, dever ser emitida uma mensagem de erro, pois a funo raiz quadrada no aceita como parmetro um nmero negativo.

Exemplo do uso do comando if.


if (d >=0) { Comando 1 Comando 2 } else { Comando 3 Comando 4 }

Caso d seja maior ou igual a zero, os Comandos 1 e 2 sero executados. Caso contrrio, os Comandos 3 e 4 sero executados. 4.4) Refazer o programa Soma dois nmeros, retirando o boto (Button1) e substituindo o cdigo no evento OnExit de Edit2, ou seja, quando o usurio digitar o segundo nmero, o resultado dever aparecer em Edit3

5 Projeto 2: Editor de Texto Simples (classe TMemo)


O objetivo deste projeto o de construir um editor de texto simples. O usurio poder digitar um texto, salva-lo em um diretrio qualquer com qualquer nome, e poder tambm ler um arquivo armazenado. Este editor de texto suporta somente textos padro ASCII, ou seja, textos sem formatao, como negrito, itlico, cor de letra, etc. Para a confeco deste projeto precisaremos das classes TMemo, TSaveDialog e TOpenDialog, alm claro das classes TEdit, TButton e Tlabel.

5.1 Classe TMemo


Propriedades: Alignment. Esta propriedade permite definir como todo o texto do objeto ser alinhado. Os possveis valores so: taLeftJustify, que o valor default, justifica o texto esquerda; taCenter, centralizada o texto e a ltima taRightJustify, que justifica o texto direita; Lines. Esta propriedade extremamente interessante, pois o valor da propriedade a classe TStrings, logo, poderemos fazer uso das propriedades e mtodos desta classe (TStrings), atravs da propriedade Lines. A classe TStrings descrita no prximo tem, e um exemplo da sua utilizao em conjunto com a classe TMemo ser dado mais adiante para esclarecimento; ScrollBars. Esta propriedade utilizada para identificar se o objeto ter barras de rolagem ou no, e em caso positivo de que tipo ela ser. Os possveis valores so: ssNone, que identifica que nenhuma barra de rolagem deve ser utilizada; ssHorizontal, usar somente barra de rolagem horizontal; ssVertical, usar somente barra de rolagem na vertical e ssBoth, que indica o uso simultneo de barras de rolagem horizontal e vertical. Mtodos: Clear. Este mtodo limpa todo o contedo do objeto; ClearSelection. Este mtodo limpa uma regio selecionada; CopyToClipboard. Copia o contedo da regio selecionada para o clipboard; CutToClipboard. Recorta o contedo da regio selecionada e o coloca no clipboard; PasteFromClipboard. Cola o contedo do clipboard no objeto; SelectAll. Seleciona todo o contedo do objeto. Eventos: OnChange. Este evento acionado toda a vez que a uma mudana no contedo do objeto; OnEnter. Este evento ocorre quando o objeto recebe o Focus de navegao; OnExit. Este evento ocorre quando o Focus sai do objeto e vai para um outro objeto qualquer;

OnKeyDown. Este evento ocorre quando uma tecla pressionada. O evento captura a tecla digitada, que pode ser manipulada da forma que o programador desejar. Vejamos agora alguns exemplos da classe TMemo. Suponha que Memo1 e Memo2 so objetos da classe TMemo. Exemplo 1: Faa um programa que selecione todo o contedo digitado em Memo1 (que deve ser centralizado) e coloque em Memo2 (que deve ser justificado direita). Para fazer isso, basta fazermos uma tela com os dois objetos e um boto (digamos Button1). Clicando em Memo1, altere a propriedade Alignment para taCenter no Object Inspector, depois clique em Memo2 e altere a propriedade Alignment para taRightJustify tambm no Object Inspector. Dentro do evento OnClick de Button1 escreva:
Memo1->SelectAll(); Memo2->PasteFromClipboard();

Exemplo 2: Ainda em cima do exemplo 1, retire o boto (Button1), e faa com que tudo que o usurio digitar em Memo1 aparea automaticamente em Memo2 e vice-versa, ou seja, tudo que for digitado em Memo2 aparea automaticamente em Memo1. No evento OnChange de Memo1 colocamos:
Memo1->SelectAll(); Memo2->Clear(); Memo2->PasteFromClipboard(); Ou Memo2->Text = Memo1->Text;

E no evento OnChange de Memo2 colocamos:


Memo2->SelectAll(); Memo1->Clear(); Memo1->PasteFromClipboard(); Ou Memo1->Text = Memo2->Text;

5.2 Classe TString


Propriedades: Count. Esta propriedade armazena a quantidade de caracteres de uma seqncia de caracteres;

Strings. Esta propriedade utilizada para referenciar uma string, em um conjunto de strings. A maneira de referenciar a mesma de um vetor. O exemplo abaixo mostrar mais detalhes; Text. A propriedade text contm toda a lista de strings; Values. Para Strings no formato Nome=Valor, a propriedade Values retorna o valor daquela string. Isto muito utilizado em arquivo do tipo INI por exemplo; Mtodos: Add. Adiciona um elemento no final da lista; Clear. Limpa toda a lista; Delete. Apaga um elemento especfico da lista; Equals. Verifica se duas listas so iguais, retorna true se verdadeiro e false caso contrrio; Insert. Insere um elemento em uma posio especfica da lista; LoadFromFile. L as linhas do arquivo e inclui na lista; LoadFromStream. O mtodo LoadFromStream l para dentro de uma lista um Stream, que um conjunto binrio de dados qualquer (uma classe abstrata), pode ser um arquivo, uma imagem, uma posio de memria, etc SaveToFile. Salva os dados da lista em um arquivo; SaveToStream. Salva os dados da lista em um Stream; Eventos: No existe nenhum evento para esta classe. Vejamos agora alguns exemplos da classe TString em conjunto com TMemo. Suponha que Memo1 e Memo2 so objetos da classe TMemo. Exemplo 1: Faa um programa que adicione trs elementos ao objeto Memo1. Para fazermos este programa precisaremos de um boto (Button1) e usaremos o mtodo Add da classe TString, pois a propriedade Lines de Memo1 faz referncia a esta classe. No evento OnClick de Button1 basta escrevermos:
Memo1->Clear(); Memo1->Lines->Add(Linha 1); Memo1->Lines->Add(Linha 2); Memo1->Lines->Add(Linha 3);

Exemplo 2: Fazer um boto em cima do exemplo 1 que apague a primeira linha de Memo1 Agora usaremos o mtodo Delete da classe TString. Usaremos um novo boto (Button2)

No evento OnClick de Button2 basta escrevermos:


Memo1->Lines->Delete(0);

Este mtodo apagara a primeira linha de Memo1, e a linha 2 e linha 3 iro para a posio zero e um respectivamente, de tal forma que se Button2 for pressionado trs vezes todo o contedo de Memo1 desaparecer. Exemplo 3: Lr o arquivo c:\autoexec.bat para dentro de Memo1
Memo1->Lines->LoadFromFile(c:\autoexec.bat);

Exemplo 4: Salvar o arquivo do exemplo anterior com o nome de c:\autoexec.old


Memo1->Lines->SaveToFile(c:\autoexec.old);

Exemplo 5: Suponha que o objeto Memo1 esteja preenchido com os seguintes valores:
DisplayGrid=1 SnapToGrid=1 GridSizeX=8 GridSizeY=8

Como fazer para recuperar o valor de GridSizeX? Para fazermos este programa vamos criar um novo boto (Button3) e um objeto Edit1 para receber a resposta. Basta digitar no evento OnClick de Button3 a seguinte linha:
Edit1->Text = Memo1->Lines->Value[GridSizeX];

Exemplo 6: Como fazer para trocar o contedo da terceira linha de um objeto Memo1 pela frase Alterao de Linha? Crie um boto qualquer (Button4) e no evento OnClick digite:
Memo1->Lines->Strings[2] = "Alterao de Linha";

5.3 Classe TOpenDialog (falta acabar eventos)


Propriedades: DefaultExt. Esta propriedade define a extenso default para abertura de arquivo; FileName. Aps a escolha do arquivo pelo usurio, atribuda a esta propriedade o nome do arquivo escolhido; Files. Em caso de seleo de mltiplos arquivos, esta propriedade traz a relao de todos os arquivos selecionados, no formato de uma lista (TString);

Filter. Nesta propriedade so definidos as extenses de arquivos que sero suportados pela abertura de arquivo; InitialDir. Esta propriedade armazena o diretrio inicial onde a caixa de dilogo dever ser apresentada; Options. Esta propriedade armazena um conjunto de opes que pode ser utilizada para a abertura de um arquivo, como a possibilidade de selecionar mltiplos arquivos por exemplo; Title. o ttulo que aparece neste objeto. Mtodos: Execute. Este mtodo executa o objeto e retorna true caso o usurio tenha pressionado o boto Abrir, ou seja, escolhido um arquivo e false caso o usurio pressione o boto Cancelar. Eventos: Falta fazer OnCanClose OnFolderChange OnSelectionChange OnTypeChange OnClose OnShow

5.4 Classe TSaveDialog


Esta classe tem basicamente todas as propriedades, mtodos e eventos da classe TopenDialog, por isso sua explicao ser omitida. Vamos agora a alguns exemplos das classe TOpenDialog e TSaveDialog. Suponha que OpenDialog1 e SaveDialog1 so objetos das classes TOpenDialog e TSaveDialog respectivamente. Exemplo 1: Faa um programa que execute a caixa de dilogo para abrir um arquivo, e caso o usurio escolha um arquivo, que este seja aberto no objeto Memo1 (classe TMemo). Os arquivos a serem aceitos so: Todos (*.*); Textos (*.txt) e Arquivos Bat (*.bat), o diretrio inicial deve ser c:\windows\system e o ttulo da caixa de dilogo deve ser: Abrir Arquivo Para fazermos este programa vamos precisar do objeto Memo1 (TMemo), do objeto OpenDialog1 (TOpenDialog), dentro da paleta Dialogs e de um boto (Button1). Dentro do evento OnClick de Button1 basta escrever-mos:
OpenDialog1->Filter = "Todos|*.*|Textos|*.txt|Arquivos Bat|*.bat"; OpenDialog1->InitialDir = "C:\WINDOWS\SYSTEM"; OpenDialog1->Title = Abrir Arquivo";

if (OpenDialog1->Execute()) { Memo1->Lines->LoadFromFile(OpenDialog1->FileName); }

Observe que o comando if necessrio, pois o mtodo Execute(), apenas manda executar o objeto, mas no garante que o usurio escolheu um arquivo. Caso o usurio tenha escolhido um arquivo ele retorna verdadeiro e em caso contrrio falso. Na nossa soluo, usamos o if para verificar o retorno do objeto, e s abrimos o arquivos, propriedade FileName, se o usurio escolheu algum arquivo, caso contrrio no fazemos nada. Exemplo 2: Ainda em cima do exemplo 1, coloque um novo boto para salvar o arquivo. Basta incluirmos um novo boto (Button2), e no seu evento OnClick colocarmos os seguintes comandos:
if(SaveDialog1->Execute()) Memo1->Lines->SaveToFile(SaveDialog1->FileName);

5.5 Cdigo Fonte


Nesta sesso mostraremos o cdigo fonte do programa editor de texto simples, usando a classe TMemo. A partir de agora listaremos somente os cdigos que forem alterados, arquivos como o de projeto no sero listados mais, a no ser que alguma mudana seja feita nestes arquivos.

5.5.1

Arquivo Unit1.dfm

Memo1

OpenDialog1

SaveDialog1

Edit1

Edit2

5.5.2

Arquivo Unit1.cpp

//--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop

#include "Unit1.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { if(OpenDialog1->Execute()) { Memo1->Clear(); Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } } //--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender) { if(SaveDialog1->Execute()) Memo1->Lines->SaveToFile(SaveDialog1->FileName); } //---------------------------------------------------------------------------

5.6 Procedimentos e Funes


Um procedimento ou uma funo em C++ Builder so um fragmento de programa, que retorna um valor no caso da funo, e no retorna nenhum valor no caso do procedimento. Procedimentos e Funes so bastante utilizados para re-usarmos cdigo. O seu uso bastante encorajado para podermos separar o nosso programa em partes mais legveis (dividir para conquistar). Devemos entretanto, tomar cuidado para no usarmos uma linguagem orientada a objetos como uma linguagem procedural normal. Sempre que possvel devemos criar classes, para que essas sim sejam usadas em nossos cdigos, e no somente os procedimentos e funes. Mais adiante trataremos do assunto de criao de classes, por agora vamos nos concentrar somente em procedimentos e funes. Vamos fazer um exemplo para explicarmos o uso de procedimentos e funes. Suponha que eu queira calcular a funo: y = x2 3 De tal forma que o usurio digite o valor de x, e o computador calcule o valor de y e mostre o resultado na tela. Primeiramente vamos definir a nossa tela:

Label1 Button1 Label2

Edit1

Edit2

Definida a tela e os objetos que a compe, vamos primeiramente fazer o programa com o uso de procedimentos, e logo aps com funo Usando Procedimentos: Observe o cdigo abaixo:
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { int valor; valor = StrToInt(Edit1->Text); Calcula(valor); } //--------------------------------------------------------------------------void __fastcall TForm1::Calcula(int x) { float resultado; resultado = x*x - 3; Edit2->Text = FloatToStr(resultado); } //---------------------------------------------------------------------------

Nele podemos observar que, dentro do evento OnClick de Button1, criamos uma varivel inteira chamada valor (int valor), atribumos a esta varivel o valor digitado pelo usurio em Edit1 (valor = StrToInt(Edit1->Text)), e logo aps chamamos o procedimento Calcula, passando como parmetro a varivel valor. Neste momento, o programa desviado para o procedimento Calcula, e a varivel valor atribuda a varivel inteira x, que ser tratada pelo procedimento. No procedimento Calcula criado uma varivel real chamada resultado (float resultado), na prxima linha atribuda a varivel resultado o resultado da equao (resultado = x*x 3) e finalmente o valor encontrado mostrado na tela no objeto Edit2 (Edit2->Text = FloatToStr(resultado)). O formato de um procedimento o mostrado abaixo:
void __fastcall TForm1::Nome_do_Procedimento(parmetros) { //Comando 1; //Comando 2; //Comando n; }

Observe que temos o Nome do procedimento e o conjunto de parmetros passados para o procedimento. Caso no haja nenhum parmetro a passar para o procedimento use void. Um procedimento pode ser includo em qualquer ponto do programa (*.cpp). Importante: Alm da definio no programa principal (*.cpp), devemos ainda incluir o cabealho do procedimento, ou seja, o seu nome e os seus parmetros no arquivo de cabealhos (*.h) na sesso de public como mostrado abaixo:
public: // User declarations __fastcall TForm1(TComponent* Owner); IIEsta linha includa automaticamente void __fastcall Calcula(int x); //Esta linha precisa ser includa para que o programa compile

Para incluir o procedimento, deve-se abrir o programa de cabealho (*.h). Para abrir o arquivo, basta clicar com o boto direito na unit correspondente (*.cpp) e escolher a opo Open Source/Header File. Agora, basta incluir o procedimento correspondente na sesso public. Usando Funes: Observe o cdigo abaixo:
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) { int valor; float resultado; valor = StrToInt(Edit1->Text); resultado = Calcula(valor); Edit2->Text = FloatToStr(resultado); } //--------------------------------------------------------------------------float __fastcall TForm1::Calcula(int x) { float y; y = x*x - 3; return y; } //---------------------------------------------------------------------------

No evento OnClick de Button1 temos o seguinte cdigo: criar a varivel inteira valor (int valor), criar a varivel real resultado, atribuir a varivel valor o valor da propriedade Edit1->Text, j convertido de string para inteiro, logo aps a varivel resultado recebe o resultado da funo Calcula, com o parmetro valor. Neste momento, o programa desviado para a funo Calcula, e a varivel valor copiada para a varivel x. Na funo Calcula, criada a varivel real y, esta varivel recebe o resultado da equao: x2 3, e logo aps retorna o valor y como o resultado da funo. Que passado para a varivel resultado (dentro da funo Button1Click), logo aps a varivel mostrada na propriedade Text do objeto Edit2, j convertido de real para string. A forma como o procedimento e a funo se comportam so praticamente o mesmo, a menos que a funo retorna um valor, atravs do comando return. O formato de uma funo o mostrado abaixo:
Tipo __fastcall TForm1::Nome_da_Funo(parmetros) {

//Comando 1; //Comando 2; //Comando n; }

Tipo, o tipo da varivel que deve ser retornada (float, int, bool, etc), Nome_da_Funo o nome que a funo receber e parmetros so os parmetros que a funo receber. Tal como no procedimento, a funo tambm precisa ser incluida no arquivo de cabealho (*.h) na sesso de public como mostrado abaixo:
public: // User declarations __fastcall TForm1(TComponent* Owner); IIEsta linha includa automaticamente float __fastcall Calcula(int x); //Esta linha precisa ser includa para que o programa compile

5.7 Exerccios
5.1) Melhorar o programa Editor de Texto Simples, colocando os botes: Novo, Abrir, Salvar, Salva Como e um boto para Sair. Em termos de funcionalidade, este programa deve se comportar como o Bloco de Notas do Windows. Por exemplo: Se o usurio pede um arquivo novo, digita alguma coisa e pede para abrir um arquivo, este deve pergunta-lo antes se ele deseja salvar o arquivo, o mesmo deve ocorrer para o boto novo e o Sair. Comandos necessrios para a implementao: Close(); //Este comando fecha a aplicao int Modifica; //Cria uma varivel inteira chamada modifica, para que ela seja global, basta coloca-la no incio do programa if(MessageDlg(Houve uma modificao no Arquivo. Deseja Salva-lo?, mtConfirmation, TmsgDlgButtons() <<mbYes << mbNo, 0) = = mrYes) { //Comando 1 //Comando 2 } /* O comando acima far com que aparea uma caixa de dilogo, com a mensagem: Houve uma modificao no Arquivo. Deseja Salva-lo?, e dois botes, o de sim (Yes) e o de no (No). O comando if para testar qual dos botes o usurio pressionou, no caso se ele pressionou o boto sim, Comando 1 e 2 sero executados. */ 5.2) Fazer um programa que leia trs nmeros e diga que tipo de tringulo formam. Os possveis tringulos so: Equiltero. Todos os lados iguais; Issceles. Pelo menos dois dos lados iguais; Retngulo. Deve obedecer a sentena: a2 = b2 + c2, onde a o maior dos lados; Escaleno. Todos os lados diferentes.

Observao Importante. Os nmeros podem formar mais de um tringulo simultaneamente (5, 4 e 3) formam o tringulo escaleno e retngulo. J o (5, 5 e 5) formam o tringulo equiltero e issceles. Use o objeto Memo1 (TMemo) para mostrar todas as possibilidades de retngulo.

6 Projeto 3: Editor de Texto Melhorado (TRichEdit)


O objetivo deste projeto o de construir um editor de texto melhorado, usando a classe TrichEdit, ao invs da classe TMemo. O usurio poder fazer todas as coisas que fazia no projeto 2, s que agora atravs de menus. Poder ainda copiar, colar, recortar e imprimir o texto digitado. Este projeto tem por finalidade fazer um editor de texto como o Bloco de Notas (Notepad) do Windows, outras melhorias podero ser feitas futuramente para transforma-lo no WordPad do Windows 95, possibilitando trocar fonte, cor, formato de letra, etc. Alm de algumas classes j estudadas, precisaremos ainda das classes TRichEdit e TMainMenu.

6.1 Classe TMainMenu


Esta classe usada para mostrar um menu, e associar a cada clique um evento. Propriedades:

Mtodos:

Eventos:

6.2 Classe TRichEdit


Esta classe tem todos os recursos da classe TMemo, alm de outros mais. Os arquivos salvos por exemplo podero ser salvos no formato RTF, que possibilita alterar fonte, tamanho da letra, cor, etc. Propriedades:

Mtodos:

Eventos:

Aula 3 Objetivo: Mostrar os objetos RadioButton e RadioGroup Exemplo: Calculadora Simples com 4 operaes Calculo Pizza Exerccio: Pedir aos alunos para fazer uma calculadora cientfica igual a do Windows (em dupla). Mostrar na sala (vale ponto) No precisa usar todas as funes