Académique Documents
Professionnel Documents
Culture Documents
ndice
1 Introduo.........................................................................................................................3
1.1 Quem pode fazer este curso?............................................................................................3 1.2 Sobre este material............................................................................................................3
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
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.
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.
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.
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.
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.
possvel verificar por exemplo que o objeto Edit1 possui as propriedades: Text Name ReadOnly
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"); }
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.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.
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);
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.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.
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
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;
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)
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 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";
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
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.1
Arquivo Unit1.dfm
Memo1
OpenDialog1
SaveDialog1
Edit1
Edit2
5.5.2
Arquivo Unit1.cpp
#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); } //---------------------------------------------------------------------------
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) {
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.
Mtodos:
Eventos:
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