Você está na página 1de 10

Conhecendo o Cpp Builder - parte 1

Bom, essa uma primeira (e bem tosca) abordagem sobre o ambiente no qual programei por uns 3/4 anos no desenvolvimento do mdulo principal de gerenciamente do produto de uma antiga empresa. por Wanderley Caloni Jr

Bom, essa uma primeira (e bem tosca) abordagem sobre o ambiente no qual programei por uns 3/4 anos no desenvolvimento do mdulo principal de gerenciamente do produto de uma antiga empresa. Como muito conhecimento acumulado e no mais utilizado demais pra cabea, resolvi espalhar um pouquinho do que aprendi aqui no site. E seja o que Deus quiser. Havia um desejo crescente por parte de vrios programadores e empresas de um ambiente RAD nos mesmos moldes do Delphi, porm que utilizasse todo o poder da linguagem C++. Nasceu ento o C++ Builder, um ambiente de programao que aproveita toda a maturidade e robustez dos componentes reutilizveis do Delphi, a biblioteca chamada VCL. Portanto, tudo que voc puder fazer com Delphi voc poder fazer com C++ Builder. Instalando e registrando o C++ Builder 6 Personal Edition Requisitos:
o o o

Arquivos da instalao (eu uso o da revista PC Expert No. 40 que comprei na banca, alis, nessa revista j consegui as verses 1, 3, 4 e 6 do Builder); Conexo com a Internet (para obter as chaves de instalao e de registro); Registro no site da Borland (isso fcil, apenas siga os links at os downloads).

1. V no site da Borland (atualmente Embarcadero - nota do editor) e consiga uma chave de ativao para a verso Personal; 2. Instale o produto utilizando as chaves obtidas; 3. Reinicie o computador; 4. Inicie o C++ Builder. Ser exibida uma tela de registro. Escolha a opo por telefone ou browser; 5. V no endereo especificado, use seu username e consiga uma chave de registro (que ser enviada por e-mail). Fazendo o seu primeiro aplicativo em Builder Isso no nada complicado, uma vez que o projeto default carregado pelo Builder no incio j compilvel e cria uma janela. Basta apertar F9 que ele ir compilar o projeto e rod-lo. Se quiser salvar este projeto default (ou alterar algo), o Builder ir pedir para voc escolher o local. Agora vamos fazer um pouco mais que o mnimo: 1. V na paleta de componentes e d um duplo clique no componente Button. 2. D um duplo clique agora no boto criado dentro do form principal. 3. Dentro da funo correspondente ao evento (que voc ver aps passo 2) digite:
4. ShowMessage("Ei, ei, estamos a...");

5. S isso. Pode rodar o projeto de novo. Experimente por voc mesmo =)

Artigo original retirado de "Conhecendo o C++ Builder", por Wanderley Caloni.


Read more: http://www.linhadecodigo.com.br/artigo/2565/conhecendo-o-cpp-builder-parte1.aspx#ixzz2MvM27XaE

Interao entre controles no Cpp Builder - parte 2


Como segunda lio, vamos aprender a fazer os controles de um form interagirem entre si com a fora do pensamento. por Wanderley Caloni Jr

Como segunda lio de nossa jornada Borland (atualmente Embarcadero - nota do editor), vamos aprender a fazer os controles de um form interagirem entre si com a fora do pensamento. Para essa proeza precisaremos de: 1. dois TButton"s; 2. um TEdit; 3. um TListBox. Bom, sabemos j como colocar esses caras no form principal. Apenas espalhe-os de maneira que eles no fiquem uns em cima dos outros (essa tcnica de espalhamento chama-se design). Agora no evento default do Button1 (duplo-clique nele) colocaremos o seguinte cdigo:
void __fastcall TForm1::Button1Click(TObject *Sender) { if(!Edit1->Text.IsEmpty() ) { ListBox1->AddItem(Edit1->Text, 0); Edit1->Text = ""; } }

Percebeu? No? Ento rode e note o que acontece quando voc aperta o boto. Agora iremos fazer algo mais interessante ainda com o segundo boto. Coloque no evento default o seguinte cdigo:
void __fastcall TForm1::Button2Click(TObject *Sender) { ListBox1->DeleteSelected(); }

Mais simples, impossvel. E com um pouco de imaginao, o mais besta dos aplicativos pode se tornar uma utilidade do dia a dia. At sua me vai adorar.

Artigo original retirado de "Interao entre controles no Cpp Builder", por Wanderley Caloni.
Read more: http://www.linhadecodigo.com.br/artigo/2566/interacao-entre-controles-no-cpp-builder-parte2.aspx#ixzz2MvMYmCfV

Conceitos bsicos na programao com Cpp Builder - parte 3


No projeto que criado quando iniciamos a IDE, 3 arquivos-fonte so gerados: Project1.cpp, Unit1.cpp e Unit1.h. por Wanderley Caloni Jr

No projeto que criado quando iniciamos a IDE, 3 arquivos-fonte so gerados: Project1.cpp, Unit1.cpp e Unit1.h. Desses 3, vamos analisar o primeiro:
#include <vcl.h> WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } //... return 0; }

Sim, existe um WinMain() e ele no est escondido! Nele voc pode fazer o que quiser. A IDE apenas auxilia voc a gerenciar seus forms. Note que tambm existe a incluso de um header chamado vcl.h (obrigatrio), o que nos leva diretamente para a base de toda a programao Delphi/Builder. A VCL (Visual Components Library) o framework usado tanto no Builder quanto no Delphi para a programao RAD nesses ambientes. Considere como a MFC gerao C++ da Borland (antes era o OWL). Todos os controles que voc v na paleta da IDE - Button, Label, CheckBox, Timer - so todos criados e gerenciados atravs da VCL. Com os mesmos nomes acrescidos do prefixo T (TButton, TCheckBox...) voc tem as classes que representam em cdigo o que voc v no ambiente RAD. Atravs da VCL pode-se criar novos componentes extendidos dos originais, e eles sero gerenciados pela IDE, que alis feita usando VCL. Voltando ao cdigo: o Application um objeto visvel em todo os mdulos do processo e representa a aplicao em execuo. Atravs dele voc cria e destri forms e inicia a execuo da VCL. Ah, sim, bom lembrar que todos os objetos VCL devem ser criados no heap (usando o operador new ou algum mtodo de um objeto VCL j criado, como o

CreateForm() do Application). Essa e mais algumas restries foram impostas na criao de classes VCL para que seu comportamento fosse similar/compatvel com tecnologias como COM e CORBA (alm das vantagens do polimorfismo e gerenciamento automtico de objetos). Olhando para o outro fonte, Unit1.h, podemos ver a definio da classe que representa o form principal:
class TForm1: public TForm { __published: // IDE-managed Components private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; extern PACKAGE TForm1 *Form1;

A classe deriva de TForm, que uma classe da VCL que representa uma janela padro do Windows. Como se nota, um objeto da classe criado automaticamente, exatamente o utilizado no WinMain() para a criao da janela principal. Na classe existe um escopo extendido chamado __published. Nele so colocados os membros da classe que podem ser gerenciados pela IDE. Considere como um public dinmico. Coloque um TButton no form e note que um novo membro criado na classe, dentro do escopo gerenciado pela IDE:
__published: // IDE-managed Components TButton *Button1;

Esses membros so iniciados automaticamente pela VCL. Contudo, voc ainda pode criar objetos em tempo de execuo e entregar o gerenciamento de seu tempo de vida para a VCL (o que significa chamar new e nunca um delete). Para essa proeza, todos os construtores de componentes devem receber um ponteiro para o seu Owner, que ser o responsvel por destruir o objeto. Veja como ridculo criar um controle novo e definir algumas propriedades:
void __fastcall TForm1::Button1Click(TObject *Sender) { TButton* btn2 = new TButton(this); // this o meu form btn2->Parent = this; // ser o owner e o parent do novo boto btn2->SetBounds(10, 10, 150, 25); // definindo as fronteiras dentro do form btn2->Caption = "Prazer! Sou dinmico!"; btn2->Visible = true; }

O Parent o component que abriga a representao visual do objeto dentro de si. Parent e Owner so dois conceitos distintos. Pra frente veremos como as janelas so gerenciadas pela VCL e pela IDE.

Artigo original retirado de "Conceitos bsicos na programao com C++ Builder", por Wanderley Caloni.
Read more: http://www.linhadecodigo.com.br/artigo/2567/conceitos-basicos-na-programacao-com-cppbuilder-parte-3.aspx#ixzz2MvNGncCa

Gerenciamento de janelas em Cpp Builder - parte 4


Esta a quarta parte da srie sobre C++ Builder. por Wanderley Caloni Jr

Abra o Builder. Um projeto padro criado. Agora no menu File, v em New, Form. Isso adicionar um novo formulrio ao projeto padro. Pronto! Temos dois formulrios. Agora se formos dar uma passeada no WinMain(), vemos que o cdigo para iniciar a VCL se alterou conforme a msica:
//... try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->CreateForm(__classid(TForm2), &Form2); Application->Run(); } //...

Porm, se rodarmos a aplicao nesse momento, podemos notar que o programa exibe apenas a janela correspondente ao primeiro formulrio. De fato, ao chamar o mtodo Application->Run(), apenas o primeiro form criado exibido. Isso no significa, claro, que o segundo form no tenha sido criado. Para demonstrar como ele est l, coloque o seguinte evento no clique de um boto do Form1:
#include "Unit2.h" // extern PACKAGE TForm2 *Form2; void __fastcall TForm1::Button1Click(TObject *Sender) { Form2->Show(); }

Agora ao clicar do boto a janela correspondente ao formulrio nmero 2 tambm aparece. Mas podemos fech-la e abri-la quantas vezes quisermos que o aplicativo continua rodando. Apenas ao fechar a janela no. 1 o aplicativo realmente encerra. Esse comportamento segue o mesmo padro da funo main() na forma clssica das linguagens C/C++:
ShowMessage("O MainForm de Application o primeiro TForm criado. "

" o princpio e o fim, o Alfa e o mega. Nele tudo comea e tudo termina");

Podemos, tambm como em C/C++ padro, finalizar explicitamente a aplicao chamando o mtodo Application->Terminate(). O MainForm em tempo de execuo uma propriedade de somente leitura de Application. Em tempo de design, ele pode ser alterado pela ordem de criao dos formulrios no cdigo ou pela IDE em Project, Options, Forms. L voc tambm escolhe quais forms sero criados automaticamente. Esse funcionamento e automao na criao de janelas da VCL foi feita para facilitar a vida do programador. Contudo, nunca estamos presos a somente isso. As maneiras das coisas funcionarem apenas refletem o uso mais comum no ambiente e no tem como funo limitar a criatividade do desenvolvedor. Para exemplificar, vamos inverter as coisas. Coloque um boto no segundo formulrio que finalize o programa de maneira expltica:
void __fastcall TForm2::Button1Click(TObject *Sender) { Application->Terminate(); }

Agora, no evento de OnClose (acho que voc conhece o Object Inspector, no? Bom, se no conhece, talvez isso merece um artigo parte) do TForm1 insira o seguinte cdigo:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { Action = caNone; }

Pronto! Agora voc decide onde termina e onde acaba sua aplicao. Artigo original retirado de "Gerenciamento de janelas em C++ Builder", por Wanderley Caloni.
Read more: http://www.linhadecodigo.com.br/artigo/2568/gerenciamento-de-janelas-em-cpp-builder-parte4.aspx#ixzz2MvNb909z

Desenhando em Cpp Builder - parte 5


Uma das partes mais fceis e divertidas de se mexer no C++ Builder a que lida com grficos. por Wanderley Caloni Jr

Uma das partes mais fceis e divertidas de se mexer no C++ Builder a que lida com grficos. A abstrao da VCL toma conta da alocao e liberao dos objetos grficos da GDI e nos fornece uma interface para desenhar linhas e figuras geomtricas, mexer com bitmaps, usar fontes etc. E ao mesmo tempo voc tem acesso ao handles crus da Win32 para que voc possa chamar alguma funo esotrica da API necessria para o seu programa.

Um Personal PaintBrush usando Canvas


Vamos fazer da rea da janela principal uma tela onde possamos desenhar. Para isso, s precisamos fazer duas coisas em nosso programa: saber quando o mouse est com algum boto pressionado e desenhar quando ele estiver sendo "arrastado". Saber o estado dos botes trivial, podemos capturar isso nos eventos OnMouseDown e OnMouseUp e guardar em alguma varivel.
//... private: bool mouseDown; // essa varivel guarda o estado do mouse... //... __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { mouseDown = false; // ... e importante inici-la } void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { mouseDown = false; } void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Canvas->PenPos = TPoint(X, Y); // mais tarde veremos o porqu disso mouseDown = true; }

Para desenhar, todo formulrio e mais alguns controles grficos possuem um objeto chamado Canvas, do tipo TCanvas. Essa classe representa uma superfcie de desenho que voc pode acessar a partir de seus mtodos. Isso a abstrao do conhecido device context da GDI, tornando a programao mais fcil. O desenho de uma linha, por exemplo, feito literalmente em uma linha de cdigo.
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( mouseDown ) {

Canvas->LineTo(X, Y); } }

O mtodo LineTo() desenha uma linha do ponto onde est atualmente a caneta de desenho at a coordenada especificada. Esse o motivo pelo qual no evento OnMouseDown alteramos a propriedade PenPos do Canvas para o ponto onde o usurio pressiona o boto do mouse. E Voila! Temos o nosso Personal PaintBrush, com toda a tosquisse que menos de 10 linhas de cdigo podem fazer. OK, ele no perfeito, mas pode ser melhorado (pois temos o fonte).<p>

O Windows no se lembra do que voc desenhou


< p>Um dos problemas nele reflete o comportamento de grficos em janelas no Windows. Seja o que for que tenhamos desenhado sobre uma janela, seu contedo perdido ao ser sobrescrito por outra janela. Isso porque a memria de vdeo da rea de trabalho compartilhada entre todas as janelas do sistema (isso ir mudar com o "Avalon" - Windows Vista - nota do editor). Precisamos, ento, sempre repintar o que feito durante a execuo do programa. Se precisamos repintar, logo precisamos saber tudo o que o usurio fez at ento. Uma das tcnicas mais baratas no quesito memria para salvar o estado grfico de uma janela guardar um histrico das operaes realizadas sobre sua superfcie e execut-las novamente ao repintar a janela. A GDI rpida o bastante para que o custo de processamento no seja sentido na maioria dos casos. Para o nosso Paint, apenas um array de coordenadas origem-destino j d conta do recado:
//... private: bool mouseDown; // essa varivel guarda o estado do mouse std::vector<TRect> mouseHistory; // um TRect guarda duas posies XY //... void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( mouseDown ) { // guardando a pincelada para reproduz-la depois mouseHistory.push_back( TRect(Canvas->PenPos, TPoint(X, Y)) ); Canvas->LineTo(X, Y); } }

Quando o Windows precisa que a superfcie de uma janela ou parte dela seja repintada ele envia uma mensagem para ela. Essa mensagem capturada pela VCL e traduzida no evento OnPaint. Nesse evento podemos ento usar o nosso histrico de operaes grficas e refazer o estado da janela antes dela ter sido sobreposta:

void __fastcall TForm1::FormPaint(TObject *Sender) { for( size_t i = 0; i < mouseHistory.size(); ++i ) { // primeiro colocamos o objeto pen no lugar origem... Canvas->PenPos = TPoint(mouseHistory[i].Left, mouseHistory[i].Top); // ... e depois reproduzimos nossa pincelada passada Canvas->LineTo(mouseHistory[i].Right, mouseHistory[i].Bottom); } }

Isso o suficiente para que agora aquelas janelas pop-up no incomodem mais o trabalho do usurio-pintor durante a confeco de sua obra-prima. Os futuros Portinari"s agradecem. A vida no seria fcil se eu quisesse ser desenhista. Artigo original retirado de "Desenhando em C++ Builder", por Wanderley Caloni.
Read more: http://www.linhadecodigo.com.br/artigo/2569/desenhando-em-cpp-builder-parte5.aspx#ixzz2MvOOBK2n

Drag and drop no Cpp Builder - parte 6


O sistema de drag and drop do C++ Builder muito fcil de usar, integrado que est com o sistema de classes e objetos do framework. por Wanderley Caloni Jr

O sistema de drag and drop do C++ Builder muito fcil de usar, integrado que est com o sistema de classes e objetos do framework. Tanto para o objeto de drag quanto para o objeto de drop tudo que temos que fazer definirmos a propriedade DragMode para dmAutomatic como mostra a figura. Isso far com que toda a troca de mensagens seja manipulada automaticamente pela VCL. A parte (riddula) do cdigo fica por conta da manipulao do evento de drop. Para aceitar um objeto, devemos tratar o evento OnDragOver. Basta isso para que a varivel Accept tenha seu valor default definido para true. Podemos, entretanto, escolher se iremos ou no tratar um possvel drop de um objeto. Verificando seu tipo, por exemplo:
void __fastcall TMain::ListBoxDragDrop(TObject *Sender, TObject *Source, int X, int Y) { if( TListBox* listBox = dynamic_cast<TListBox*>(Sender) ) { TWinControl* winCtrl = static_cast<TWinControl*>(Source); if( listBox!= winCtrl )

{ listBox->Items->Add(winCtrl->Name); winCtrl->Visible = false; } } } void __fastcall TMain::FormDragDrop(TObject *Sender, TObject *Source, int X, int Y) { if( TForm* form = dynamic_cast<TForm*>(Sender) ) { TControl* ctrl = 0; if( TListBox* listBox = dynamic_cast<TListBox*>( Source ) ) { for( int i = 0; i < listBox->Count; ++i ) { if( listBox->Selected[i] ) { ctrl = this->FindChildControl(listBox->Items>Strings[i]); listBox->Items->Delete(i); break; } } } else ctrl = dynamic_cast<TControl*>(Source); if( ctrl ) { ctrl->Top = Y; ctrl->Left = X; ctrl->Visible = true; } } }

E mais uma vez voil! Pouqussimas linhas de cdigo e um movimentador e empilhador de controles. Dois detalhes merecem serem destacados:
o

O uso de dynamic_cast em cima dos ponteiros da VCL uma maneira saudvel de checar a integridade dos tipos recebidos - particularmente do Sender. O uso do primeiro parmetro dos tratadores de eventos tambm torna o cdigo menos preso componentes especficos do formulrio; O mtodo FindChildControl deveras til quando no temos certeza da existncia de um controle. Geralmente uma boa idia confiar no sistema de gerenciamento de componentes da VCL. No toa que existe um framework por baixo do ambiente RAD.

Artigo original retirado de "Drag and drop no C++ Builder", por Wanderley Caloni.
Read more: http://www.linhadecodigo.com.br/artigo/2570/drag-and-drop-no-cpp-builder-parte6.aspx#ixzz2MvPTCtH4

Você também pode gostar