the club - megazine · março 2012 03 desafio the club - dicas delphi ... gem das peças...

32
março 2012

Upload: lyminh

Post on 26-Nov-2018

238 views

Category:

Documents


10 download

TRANSCRIPT

março 2012

março 2012

março 2012 03

Desafio The Club

- Dicas Delphi

Dicas

- Cruzada

30

Delphi Delphi

DelphiDelphi

Linguagem C# - Conceitos Iniciais

índiceVerificando a solicitação de resposta de uma

Aplicação ou Aplicativo

Editorial

11Olá amigos do The Club, é com muita satisfa-

ção que eu digo a vocês “Sejam bem vindos” a uma nova fase que es-taremos vivendo daqui pra frente... 04

Criando uma aplicação Client-Server no Delphi – Parte V

05Android - Navegando entre Telas

14

28

22

LegendaInicianteIntermediárioAvançado

Autor:Eduardo Massud

Autor: Thiago C. Montebugnoli

Autor: Luciano Pimenta

Autor: Marcos CésarSilva

março 201204

Bem-vindo

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Thiago Montebugnoli - Editor [email protected]

Olá amigos do The Club, é com muita satisfação que eu digo a vocês “Sejam bem vindos” a uma nova fase que estaremos vivendo daqui pra frente. Reestruturaremos nossos serviços com o obje-tivo de aprimorar e melhorar o suporte oferecido aos senhores. Começando pela revista que teremos ainda o bom e velho Delphi e contando também com matérias relacionadas a Linguagem C# e ao Sistema Android.

Na edição deste mês, nosso colaborador Luciano Pimenta con-tinua com a série de artigos para Criação de uma aplicação Client--Server utilizando o Delphi. Já nosso consultor Eduardo Massud escreveu o artigo “Verificando a solicitação de resposta de uma aplicação ou Aplicativo”, sendo muito útil para implementar em seus sistemas, tendo como exemplo a utilização do navegador Internet Explorer.

Neste mês dou continuidade ao aprendizado do Android, com o artigo “Android – Navegando entre Telas”, onde mostro a facilida-de para utilizar este tipo de recurso na linhuagem Java. Aproveito também abordando alguns conceitos essenciais deste tipo de Linguagem de Programação.

Como foi dito anteriormente, Marcos César Silva, dá início a uma série de artigos relacionados a Linguagem C# utilizando o Microsoft Visual Studio 2010, sendo que este primeiro nos dá uma noção básica de seu funcionamento e de algumas sintaxes principais.

Aproveite e desfrute de nossa clássica seção de “Dicas Delphi” que aborda como verificar o número dos Cartões de Débito e Crédito.

Desejo a todos uma boa leitura e que tirem o maior proveito de nossos artigos. Lembrando que nossa equipe está sempre aberta a críticas e sugestões.

Um Forte abraço,

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações e Suporte: (14) 3732-1529

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected] Informações: [email protected] Cadastro: theclub_cadastro

Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

www.twitter.com/theclubbr

Copyright The Club 2012

Diretor TécnicoMarcos César Silva

DiagramaçãoEduardo Massud

ArteVitor M. Rodrigues

RevisãoEliziane Valentim

ColunistasEduardo MassudLuciano Pimenta

Thiago Cavalheiro MontebugnoliMarcos César Silva

Impressão e acabamento:GRIL - Gráfica e Editora

Taquarituba-SP - Tel. (14) 3762-1345

ReproduçãoA utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club

março 2012 05

Delphi

Criando uma aplicação Client-Server no Delphi – Parte V

Errata

Infelizmente, erramos no artigo anterior. No método de inserir uma OS no Data Modu-le, ficou faltando no texto, um código do loop para os itens das peças a serem inseridos. Se o leitor acompanhar somente pelo artigo, ao inserir itens, serão sempre inseridos dados do primeiro item.

Esta faltando um Next no ClientDataSet. Veja na Listagem abaixo, o código completo, correto.

function TDM.InserirOS(nCdOrcamento, nCdVeiculo: integer; cdsItens: TClientDataSet; sDsObservacoes: string): Boolean;var TransDesc: TDBXTransaction; nCdOrdem: integer; i: integer; bRetorno: Boolean;begin

bRetorno:= false;TransDesc:= SysCar.BeginTransaction(TDBXIsolations.ReadCommitted); try //insere o orçamento spOS.Params[0].AsInteger := nCdVeiculo; spOS.Params[1].AsInteger := nCdOrcamento; spOS.Params[2].AsString := DsObservacoes; spOS.ExecProc;

//armazena o valor inserido no banco nCdOrdem := spOS.Params[3].AsInteger;

//percorre os itens e insere no banco for i := 0 to cdsItens.RecordCount - 1 do begin //insere os itens spOS_Itens.Params[0].AsInteger:= nCdOrdem; spOS_Itens.

Params[1].AsInteger:= cdsItens.FieldByName('nCdPeca').AsInteger; spOS_Itens.Params[2].AsInteger := cdsItens.FieldByName('nQtde').AsInteger; spOS_Itens.Params[3].AsCurrency := cdsItens.FieldByName('nVlPeca').AsInteger; spOS_Itens.ExecProc;

cdsItens.Next; //código que falta end; bRetorno := true; except //caso ocorra algum erro, da rollback SysCar.RollbackIncompleteFreeAndNil(TransDesc); end;

//comita as alterações no banco SysCar.CommitFreeAndNil

março 201206

(TransDesc); Result := bRetorno;end;

Nossa série de artigos para a criação de uma aplicação client-server, mostrou muitas dicas e características de aplicações em uma das plataformas mais utilizada do Delphi (Win32 e client/server). Neste artigo, vamos finalizar a série com outra ferramenta muito importante para esse tipo de aplicação: rela-tórios. Muitos desenvolvedores acham perda de tempo a criação de relatórios, tem que deixar pro “estagiário” fazer.

Sinceramente, eu adoro relatórios, pois para mim é a única parte palpável do software. O cliente, quando vê um relatório bem implementado e for-matado, sabe que o sistema esta correto, trazendo informações que ele precisa.

Vamos usar o Rave Report para a criação dos relatórios, mas você pode usar outros geradores, como: Quick Report, Report Builder etc.

Conhecendo o Rave reports

O Rave Reports passou a fazer parte do Del-phi a partir da versão 7. Muitos desenvolvedores torceram o nariz para a ferramenta da Nevrona. Algumas características me chamaram a atenção:

• IDE próprio: diferente do Quick, você tem um IDE “externo” para criar seus relatórios;

• Componentes instalados no IDE: seme-lhante ao Delphi você pode instalar componentes no IDE do Rave;

• Relatórios separados da aplicação: você tem um arquivo RAV que deve ser distribuído com seu projeto;

• Duas opções de conexão com o banco de dados: totalmente independente da aplicação ou utilizando componentes de acesso a dados da aplicação (DataSets);

• Permite que o usuário faça alterações no relatório (usuário precisa ter alguma noção da ferramenta).

Algumas das características citadas me chama-ram muito a atenção. Caso tenhamos uma conexão totalmente independente da aplicação, feita “inter-namente” no projeto RAV, se precisarmos alterar

algum relatório, basta fazer a alteração e distribuir novamente o arquivo RAV (caso não seja modifi-cado parâmetros, que podem vir da aplicação).

Outra é a possibilidade de liberar para o usuá-rio final um IDE para que o mesmo possa modificar os relatórios. Claro, aqui precisamos que o usuário final, tem alguma experiência na manutenção de relatórios Rave.

Dentro de um arquivo RAV temos todos os relatórios que criaremos na nossa aplicação. Vamos conhecer um pouco desse gerador de relatórios padrão do Delphi.

IDE do Rave

Para acessar o Rave, basta colocar um Rv-Project da paleta Rave (Figura 1) e dar um duplo clique no mesmo.

Podemos também acessar através do menu Tools>Rave Reports Designer. Ao abrir temos algo semelhante com a Figura 2.

Veja que temos os botões para criação de ob-

jetos (relatórios, Data Object, configurações etc), uma paleta de componentes, grid de propriedades (Object Inspector), Treeview de objetos e um Page designer, além de um editor de eventos do mesmo.

Voltando ao nosso projeto Delphi, vamos conhecer algum dos componentes que usaremos. Crie um novo Data Module, que conterá apenas os componentes do Rave. Dê o nome de “DMReport” e adicione um RvProject.

As características dos principais componentes são:

• RvProject: é o componente que “liga-mos” com o projeto RAV;

Figura 1. Paleta do Rave no Delphi XE

Figura 2. IDE do Rave

março 2012 07

• RvSystem: encapsula todas as caracte-rísticas de impressão e do formulário de preeview para o Rave. Podemos usá-lo ou não para apenas visualizar um relatório (basta chamar o Execute do RvProject para exibir o relatório). Com o RvSystem você pode criar relatórios on-demand, sem a ne-cessidade do IDE apenas com comandos;

• RvNDRWriter: podemos criar arquivos e stream do relatório do projeto Rave que estiver em execução;

• RvCustomConnection: imprime dados customizados, armazenados em memória. Esse componente trabalha em conjunto com o Direct Data View do Rave Designer para a impressão dos dados;

• RvDataSetConnection, RvTableConnec-tion, RvQueryConnection: responsável por fazer a “ponte” de dados entre a aplicação e o projeto RAV;

• RvRenderPreview: podemos criar uma janela personalizada e utilizá-la para visualizar os relatórios;

• RvRenderPrinter: utilizado para enviar um stream, NDR ou um arquivo de um relatório Rave para a impressora;

• RvRenderPDF, RvRenderHTML, RvRen-derRTF, RvRenderText: fazem a exportação do relatório para os diversos formatos existentes.

Criando o relatório

Vou tentar mostrar vários tipos de relatórios com o Rave. No primeiro, que será utilizando um ClientDataSet para a consulta, teremos uma lista-gem das peças cadastradas no sistema. Primeiro, no DM adicione um ClientDataSet (“nCdListagem-Pecas”) e para o comando SQL, use o código da Listagem 1.

Listagem 1. Consulta da listagem de peças/serviços

select nCdPeca, sNmPeca, nVlPeca, nIdTipo = CASE WHEN nIdTipo = 1 THEN 'Peça' WHEN nIdTipo = 2 THEN 'Serviço' endfrom PECA

Essa consulta retorna todas as peças cadastra-

das no sistema. Após, no DMReport, adicione um RvDataSetConnection (“rvListagemPecas”), esse componente, como já vimos, faz a ligação do nosso ClientDataSet com o Rave. Configure a propriedade DataSet do mesmo com o cdsListagemPecas (adi-cione a unit do DM).

Abra o IDE do Rave, dê o nome de “rptLista-gemPeca” para o relatório já existente. Salve o projeto de relatórios na mesma pasta do projeto Delphi. Vamos adicionar a conexão de dados com o cdsListagemPecas, usando o Direct Data View.

Acesse o menu File>New Data Object e escolha Direct Data View. Veja que o nome do controle no DMReport será mostrado (Figura 3).

Os dados do cdsListagemPecas serão refletidos no nosso relatório. Caso você precise fazer alguma filtragem para o relatório, basta configurar o con-trole no Delphi. Criado a conexão com os dados, precisamos montar o relatório.

Adicione um Region no relatório (aba Report), pois o mesmo determina a área de impressão da página do relatório. Redimensione o mesmo na página. Adicione um Band e um Databand (aba Report). Veja como esta nosso relatório na Figura 4.

Temos agora, que indicar quais as característi-cas dos controles Band e DataBand, se devem ser cabeçalhos, cabeçalho de grupo, grupo, detail etc. Acesse a propriedade Band Style do Band1. Altere para Body Header e feche o editor. Na propriedade

ControllerBand altere para DataBand1.

No Band2, altere DataView para a conexão de dados criada anteriormente. Essa propriedade é muito importante, pois indica a fonte de dados do relatório. No Band1 você pode colocar as infor-mações que achar necessário, pois o mesmo é o cabeçalho do nosso relatório.

Veja na Figura 5, a configuração do cabeçalho.

Para adicionar a imagem, use um Bitmap (aba Standard) juntamente com a propriedade FileLink e para o rótulo use um Text (aba Standard). Para o rodapé, vamos usar um DataText (aba Report) para podermos pegar variáveis do sistema, como: número de páginas, data de impressão etc.

Adicione, abaixo do Region um DataText, no lado esquerdo e acesse a propriedade DataField. No editor (Figura 6), temos como configurar várias informações para o relatório com variáveis do relatório, parâmetros etc.

Na opção Data Text, digite: “Impresso em: ”

& Report.DateShort. Assim, informamos a data da impressão. Adicione outro DataText no relatório e configure com o seguinte valor: “Página ” & Report.CurrentPage & “ de ” & Report.TotalPages.

Nossa informação será a página atual e a quan-tidade de páginas existente no relatório. Voltando ao DataBand, vamos adicionar alguns DataTexts e usando a propriedade DataView e DataField, configurar os campos do relatório.

Figura 5. Cabeçalho do relatório.

Figura 4. Region e bands do primeiro relatório

Figura 3. Acessando os dados através da aplicação Delphi.

março 201208

Podemos testar o relatório, utilizando a tecla F9. Veja que as informações do relatório estão aparecendo no Rave.

Chamando o relatório do Delphi

Adicione um novo menu e utilize o seguinte có-digo para chamar o relatório criado anteriormente:

DMReport.RvProject1.ExecuteReport('rptListagemPeca');

Não se esqueça de indicar o nome do arquivo RAV no RvProject usando a propriedade ProjectFi-le. Teste e veja o relatório em execução (Figura 7).

Vimos que é fácil usar o Rave no Delphi. Em um primeiro momento, você que nunca usou Rave

e esta acostumado com o Quick, pode achar meio estranho, mas com o tempo, verá que temos van-tagens em usar Rave.

Para criar um relatório parametrizado, usando controles do Delphi, já vimos sua facilidade. Faça um exemplo, para o relatório do cliente. Crie um relatório, usando o cdsCliente que esta parametri-zado com o cliente que esta em tela.

Nota: teremos algumas modificações para isso. No formulário base, adicione um botão responsável por chamar o relatório. Crie um método chamado no Click desse botão. Esse método será virtual, pois será subscrito nos formulários herdados. Qualquer dúvida consulte o código-fonte disponível para download.

Ao chamar o relatório no cadastro de clientes, sempre será mostrado o cliente filtrado no momen-to. Mas e se eu usar a facilidade da conexão do

banco, dentro do IDE? Bom, dai teremos que passar o parâmetro da consulta, pela aplicação Delphi.

Repassando parâmetros pela apli-cação

Crie um novo relatório, semelhante ao ante-rior. Vamos criar uma conexão com o banco, usando o menu File>New Data Object. Escolha Database connection. Note as opções de configuração com

o banco de dados (Figura 8).

Figura 8. Conexões do Rave

Vamos usar a opção ADO para SQL Server (poderíamos também usar o DBX). Configure para o banco de dados da aplicação. Veja que na aba

Test ao clicar no botão, o Rave lista as tabelas do banco de dados (Figura 9).

Figura 9. Tabelas listadas no Rave

Agora vamos criar uma consulta, baseada nessa conexão com o banco. Acesse o botão New Data Object e escolha Driver Data View. Escolha a conexão criada anteriormente e no editor, digite o SQL da Listagem 2.

Listagem 2. SQL do relatório

SELECT v.nCdVeiculo, V.nNrAnoFabricacao,

Figura 6. Editor do DataText

Figura 7. Relatório criado no Rave

março 2012 09

V.nNrAnoModelo, V.sNmModelo, V.sNrChassi, V.sNrPlaca, C.sNmClienteFROM VEICULO VINNER JOIN CLIENTE C ON C.nCdCliente = V.nCdClienteWHERE V.nCdVeiculo = :VEICULO

Acesse a propriedade QueryParams do Driver Data View e adicion o seguinte código:

VEICULO=Param.pVeiculo

Estamos indicando para o parâmetro VEICULO do SQL, que esse será preenchido com o parâmetro de nome pVeiculo. Agora precisamos passar o valor do parâmetro através da aplicação Delphi. Mas antes, não se esqueça de configurar o DataBand relatório de veículos com o Driver Data View criado anteriormente.

Na aplicação Delphi, no cadastro de veículos, use o seguinte código:

DMReport.RvProject1.SetParam('pVeiculo', DM.cdsVeiculonCdVeiculo.AsString);DMReport.RvProject1.ExecuteReport('rptVeiculo');

Esse código indica para o parâmetro do rela-tório, o valor atual do cadastro de veículos, assim, nosso relatório estará parametrizado. Para finalizar, adicione no uses da tela de cadastro de veículos a unit RvDLADO.

Nota: Caso você esteja utilizando as tecnolo-gias BDE, DBX ou IBX no Rave Reports para fazer o acesso direto ao banco de dados, você deverá declarar as units RvDLDBX ou RvDLBDE na cláusula uses do formulário.

Agrupamento

Podemos modificar o relatório de listagem de

peças/serviços para agrupar os dados de acordo com o tipo, peça ou serviço. Primeiro, precisamos modificar a consulta de listagem para ordenar a consulta pelo tipo (nIdTipo).

No Rave, vamos adicionar um Band ao relatório e altere BandStyle para Group Header. No Band2, no ControllerBand indique o DataBand1. Em Grou-pDataView indique o DataView do relatório. Por fim, em GroupKey, indique o campo que queremos agrupar, nesse caso nIdTipo.

Agora, basta acessar o relatório para ver as modificações e ter a listagem agrupada pelo tipo (Figura 10).

Relatório master/detail com a OS

Agora, precisamos criar um relatório master/detail para a OS, para que possamos mostrar os dados da OS, juntamente com os itens (peças/serviços) que fazem parte da mesma. Precisamos criar as consultas para o relatório, pois teremos

que retornar os dados da OS e também os itens.

Crie um novo Driver Data View e use o coman-do SQL da Listagem 3.

Listagem 3. Pesquisando os dados da OS

select OS.nCdOrdem, OS.sDsObservacoes, OS.tDtOrdem,VEICULO.sNrPlaca, VEICULO.sNmModelofrom OSINNER JOIN VEICULO ON VEICULO.nCdVeiculo = OS.nCdVeiculowhere OS.nCdOrdem = :ORDEM

Na propriedade QueryParams do Driver Data View adicione o seguinte código:

Figura 10. Relatório de listagem agrupado

Figura 11. Relatório master/detail da OS

março 201210

ORDEM=Param.pOS

Para a próxima consulta, use o código da Listagem 4.

Listagem 4. Retornando os itens da OS

select PECA.sNmPeca, OS_DETALHE.nCdOrdem, OS_DETALHE.nQtPeca, OS_DETALHE.nVlUnitario, (OS_DETALHE.nQtPeca * OS_DETALHE.nVlUnitario) as SubTotalfrom OS_DETALHEINNER JOIN PECA ON PECA.nCdPeca = OS_DETALHE.nCdPecawhere OS_DETALHE.nCdOrdem = :ORDEM

Configura a propriedade QueryParams confor-me a anterior. Crie um novo relatório, semelhante aos que já criamos até aqui. Adicione dois DataBan-ds e configure os mesmos para cada um dos Driver Data Views criados anteriormente.

No DataBand1 configure o ControllerBand para DataBand2. Em BandStyle configure para BodyHe-ader. No DataBand2 configure o BandStyle para Details. Adicione os campos no DataBand1 para os dados da OS, e no DataBand2 para os itens/peças.

Veja na Figura 11 como ficou nosso relatório.

Agora, precisamos adaptar nosso método que insere a OS para que ao invés de retornar um boolean, retorne o valor da OS criada. Assim, po-demos repassar para o relatório a OS recém criada para podemos carregar o relatório corretamente.

No formulário da OS, vamos mudar um pouco o código, como podemos ver na Listagem 5.

Listagem 5. Adaptando o confirmar para mos-trar o relatório

var nCdOrdem: integer;begin ... else begin

nCdOrdem := DM.InserirOS(nCdOrcamento,

nCdVeiculo, cdsItens, mmObservacoes.Text); if nCdOrdem > 0 then begin ... cdsItens.Close;

DMReport.RvProject1.SetParam('pOS', IntToStr(nCdOrdem)); DMReport.RvProject1.ExecuteReport('rptOS'); end...

Mudamos o método InserirOS para que re-torne um inteiro, assim, verificamos se o valor é maior que zero, dai, executamos o código normal, já existente e chamamos o relatório atribuindo o parâmetro da consulta.

Figura 12. Criando uma OS e mostrando o relatório

Execute a aplicação, crie uma nova OS e veja o relatório criado (Figura 12).

Conclusões

Finalizamos nossa série para a criação de uma aplicação client-server com Delphi. Aprendemos a usar aplicações parametrizadas, usamos herança visual de formulários, criamos uma classe respon-sável por inserir os dados no banco, além de muitas outras dicas.

Como eu gostei de frisar desde o inicio, não sou dono da verdade, apenas quis mostrar dicas de como implementar aplicações cliente-server da melhor maneira possível, utilizando pra mim, a melhor ferramenta, nosso querido Delphi.

Um grande abraço a todos e até a próxima!

É Técnico em Processamento de Dados, desenvolvedor Delphi/C# para aplicações Web com ASP.NET e Windows com Win32 e Windows Forms. Palestrante da 4ª edição da Borland Conference (BorCon).

Autor de mais de 60 artigos e de mais de 300 vídeos aulas publicadas em revistas e sites especializados. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados. É desenvolvedor da Paradigma Web Bussi-ness em Florianópolis-SC.

Sobre o autor

Luciano Pimenta

www.lucianopimenta.net

março 2012 11

Verificando a solicitação de resposta de uma Aplicação ou Aplicativo

Existem muitas situações em que o sis-tema precisa detectar se um aplicativo está bloqueado e não pode ser utilizado. Como de exemplo, para automatizar um aplicativo e verificar se ele está respondendo ou não, não há uma definição clara de um pedido de suspensão ou paralização.

O que ocorre normalmente é que o aplicativo foi definido como “ocupado” por conta algum outro processamento de prioridade maior naquele mo-mento. No entanto, do ponto de vista de um usu-ário, o aplicativo para de responder simplesmente.

A idéia é, periodicamente detectar se o aplica-tivo ainda está respondendo através de um timer, que gerenciará essa verificação automaticamente, sem a constante permanência do programdor na verificação do funcionamento do aplicativo, e de-pendendo da lógica do aplicativo, ela pode fazer com que o aplicativo de destino seja morto ou adote outras medidas necessárias que possam ser

tomadas sem a gerencia funcional do programador.Exemplo a seguir descreve como detectar se

uma instância automatizada do Internet Explorer está suspensa ou não.

unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComObj, StdCtrls;

Obs: Não se esquecer de declarar na clausula “uses” as units ComObj e StdCtrls , para que seja permitida a manipulação dos objetos dos aplicati-vos referenciados.

typeTForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } ObjOleVar : OLEVariant; AppHandle : THandle;

março 201212

end;var Form1: TForm1;

implementation

{$R *.dfm}

Iremos utilizar 3 botões, cada um executando uma etapa da consulta da aplicação, que irá chama--la, verificá-la e por fim fechá-la.

No evento OnClick do primeiro botão iremos chamar a execução do aplicativo Internet Explorer, que foi utilizado como exemplo, por ser o browser nativo dos sistemas operacionais Microsoft, mas podendo ser alterado por qualquer aplicação escolhida.

procedure TForm1.Button1Click(Sender: TObject);begin ObjOleVar:= CreateOleObject(‘InternetExplorer.Application’); ObjOleVar.Visible:= True; ObjOleVar.Navigate2(‘www.theclub.com.br’); AppHandle:= ObjOleVar.HWND;end;

No evento OnClick deste segundo botão im-plementamos o aviso sobre a situação em que se encontra a aplicação, se está funcionando corre-tamente ou se não está respondendo, verificando se este processo está a mais de 1 segundo sem resposta, ou seja, sendo ocupado por outra, o que resulta na resposta.

procedure TForm1.Button2Click(Sender: TObject);var dwResult: DWORD; ValorRetorno: Longint;

begin ValorRetorno:= SendMessageTimeout(AppHandle, WM_NULL, 0, 0, SMTO_ABORTIFHUNG OR SMTO_BLOCK, 1000, dwResult);

if ValorRetorno > 0 then ShowMessage(‘Habilitado’) else ShowMessage(‘Bloqueado/Não Responde’);end;

Nesse caso ele retorna duas possibilidades que podem ocorrer, e com isso exibir a mensagem se o processo está ativo ou se ele está inoperante.

E por fim encerramos o processo, estando ou não respondendo

procedure TForm1.Button3Click(Sender: TObject);

var

ID: DWORD; Processo: THandle;begin GetWindowThreadProcessId(AppHandle, @ID); Processo:= OpenProcess(PROCESS_ALL_ACCESS, False, ID); TerminateProcess(Processo, 0);end;

end.

Podemos também fazer esse verificação ex-clusivamente pela aplicação, que irá verificar se o aplicativo desenvolvido se encontra em execução, evitando assim que duas ou mais instâncias do Aplicativo seja abertas ao mesmo tempo.

program Project1; uses Forms, Windows, Dialogs,

março 2012 13

Unit1 in ‘Unit1.pas’ {Form1};

{$R *.RES}

var VerHist: HWND; begin Application.Initialize; VerHist:= FindWindow(Nil, PChar(‘NomeDoSoftware’)); if VerHist = 0 then begin Application.Title:= ‘NomeDoSoftware’; Application.CreateForm(TForm1, Form1); Application.Run; end else MessageDlg(Este Aplicativo já está em Execução!’, mtInformation, [mbOK], 0);

Essa função é chamada diretamente pelo escopo da aplicação, fazendo com que a partir dos processos que estão sendo executados (podendo ser consultados pelo Gerenciador de Tarefas) é possível identificar o processo pelo nome, que fica definido de acordo com o título da aplicação, e, caso já esteja executando algum processo com nome idêntico ele retorna uma mensagem de aviso informando que já existe uma mesma aplicação com o mesmo nome.

E, por fim, caso o usuário queira por segurança, que o Delphi seja verificado se está aberto ou não em mais de uma versão, podemos controlar isso, verificando se essa janela existe, forçando seu fechamento.

Para que possamos verificar se o Delphi está aberto, primeiramente devemos ver se a IDE está ativa, para isso utilizamos uma função que vai con-ferir se a janela da está sendo executada

function IDEAberta(Classe, Janela: string): Boolean;var aClasse, aJanela: array[0..79] of char;begin

if Classe = ‘’ then aClasse[0] := #0 else StrPCopy(aClasse, Classe); if Janela = ‘’ then aJanela[0] := #0 else StrPCopy(aJanela, Janela); Result := FindWindow(aClasse, aJAnela) <> 0;end;

O seguinte passo é identificar se é realmente o Delphi que está aberto, para isso é preciso iden-tificar de é encontrado o Tipo TPropertyInspector ativo, para dai sim poder finalizar.

function VerificaDelphi: Boolean;begin Result := IDEAberta(‘TPropertyInspector’,‘Object Inspector’);end;

E por fim, no evento OnCreate do Formulário definimos a atitude a ser tomada, finalizando a aplicação, habilitando caso seja primeira instância e encerrando caso seja derivada.

Procedure TForm1.FormCreate(Sender:

TObject);begin if VerificaDelphi then ShowMessage(‘Aplicativo Delphi executando normalmente!’) else begin ShowMessage(‘Aplicativo Delphi encerrado. Confirme suas permissões de acesso!’); Application.Terminate; end; end;

Conclusão

Esse processo serve para prever se algo ocor-reu de errado com a aplicação a fim de evitar que o usuário fique sem ação ou que a aplicação seja inutilizada, sendo este o primeiro passo para a cria-ção, para as aplicações desenvolvidas, de um “Crash Report”, que verifica o problema que ocorreu na execução da aplicação, retornando essa informação para os seus desenvolvedores, para que possa ser corrigida em atualizações posteriores, além da aplicação de métodos de segurança em sua apli-cação, com o intuito de evitar conflitos em varias instancias abertas ao mesmo tempo, e centralizar, tanto a execução do projeto final, quanto em seu desenvolvimento.

Consultor Técnico The Club.

Sobre o autor

Eduardo Massud

[email protected]

março 201214

Android Navegando entre telas

Neste artigo explicarei mais alguns recursos básicos do Android e em seguida será criado um exemplo de como trabalhar com várias telas e navegar entre elas. Aproveitaremos o exemplo montado no mês anterior.

Para trabalhar com várias telas é necessário criar vários templates que ficarão armazenados na pasta “res/layout”, assim como o template “main.xml” que é criado por padrão.

Cada “xml” localizado nesta pasta pode ter um layot diferente, podendo ser alterado como desejar.

Conceitos Básicos e Essenciais

Antes de colocarmos mãos à obra, abaixo gostaria de explicar alguns recursos que serão utilizados neste artigo e em outros posteriores.

O que é um Activity?

Um “Activity” ou uma atividade representa uma tela qualquer do siste-ma, sendo a peça principal de sua aplicação. Responsável por exibir todos os componentes gráficos. Uma aplicação Android geralmente possui uma ou mais Atividade estando relacionadas entre si.

O método “OnCreate()” é obrigatório, pois durante o ciclo de vida de uma Atividade ele é chamado no momento que ela estiver sendo criada, sendo uma boa prática inicializarmos tarefas de carregamento de recursos e logo em seguida executar o método SetContentView(), este sendo responsável por carregar o layout da aplicação.

março 2012 15

Importante: Toda Atividade deve ser declarada no “AndroidManifest.xml” utilizando a tag <activity>.

O que é o R.java?

É a classe responsável por gerenciar os recursos de nossa aplicação. O Android localiza um recurso específico através dos denominados “IDs” e quem os gerencia é a classe “R.java”, sendo criado automaticamente quando iniciamos um novo projeto.

Esta classe não deve ser alterada de forma nenhuma e é gerenciada au-tomaticamente pelo Sistema Android.

Neste artigo específico utilizaremos o comando:setContentView(R.Layout.cadastro);Toda atividade possui o método acima, que é responsável por carregar

toda a hierarquia de layout definida no arquivo “xml”. Neste momento é que a classe “R.java” entra em ação, ela está diretamente ligada à uma atividade. Quando passamos “R.Layout.cadastro” como parâmetro para este método, é como se disséssemos para o Android carregar um recurso do tipo “layout” cujo nome é “cadastro.xml”.

Importando um projeto pronto

Para isto clique em “File/Import” e escolha a opção “Existing Projects into Workspace” localizada na aba “General”. O próximo passo é selecionar onde o projeto foi criado e em seguida concluir clicando no botão “Finish”. Ver Imagem 01.

Figura 01: Importação de um projeto.

Fique à vontade para renomear o projeto da maneira que desejar. Neste caso aproveitaremos o lay-out da tela, adaptaremos o código de sua “Activity” e a classe “Registro.java”. No meu caso utilizei esta tela como “cadastro.xml”, mas fiquem a vontade para trabalhar da forma que desejarem.

Criando a tela main.xml

Clique no diretório “res/layout” e com o botão direito escolha “New/Other...” e aparecerá uma tela como ilustra a Figura 02, escolha “XML/XML File” clique em Next, defina como “main.xml” e conclua logo em seguida.

Figura 02: Criando um XML.

Uma dica que deixo aqui seria de copiar todo conteúdo XML da tela de cadastro e ir excluindo os componentes que não for utilizar, isto economiza tempo e trabalho.

Figura 03: Lay-out tela Principal.

março 201216

Adicionaremos os seguintes componentes:

1 LinearLayout , 4 textView e 2 botões. A Figura 03 mostra como ficou o lay-out e a Figura 04 a disposição dentro do Linearlayout.

Figura 04: Configuração dos componentes.

E o código XML ficou da seguinte maneira:

<?xml version=”1.0” encoding=”utf-8”?><LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:weightSum=”1”> <TextView android:id=”@+id/textView1” android:textAppearance=”?android:attr/textAppearanceLarge” android:layout_width=”wrap_content” android:text=”TELA PRINCIPAL - THE CLUB” android:layout_gravity=”center” android:layout_height=”78dp”></TextView> <Button android:text=”Cadastrar” android:id=”@+id/btCadastrar” android:layout_height=”100dp” android:layout_width=”260dp” android:layout_gravity=”center”></Button> <Button android:text=”Consultar” android:id=”@+id/btConsultar” android:layout_height=”100dp” android:layout_width=”260dp” android:layout_gravity=”center”></Button> <TextView android:id=”@+id/textView4” android:textAppearance=”?android:attr/textAppearanceLarge” android:layout_width=”match_parent” android:text=” “ android:layout_height=”103dp”></TextView>

<TextView android:id=”@+id/textView2” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_width=”wrap_content” android:text=”Conheça o The Club” android:layout_gravity=”center” android:layout_height=”wrap_content”></TextView> <TextView android:id=”@+id/textView3” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_width=”wrap_content” android:text=”http://www.theclub.com.br/” android:layout_gravity=”center” android:layout_height=”wrap_content”></TextView></LinearLayout>

Criando a tela consulta.xml

Seguindo os mesmos passos da tela principal, adicione um arquivo do tipo XML e em seguida os seguintes componentes:

5 LinearLayout, 9 TextViewer, 1 RadioGroup e 1 Button

A Figura 05 mostra como ficou o lay-out e a Figura 06 a disposição dentro do Linearlayout.

março 2012 17

Figura 05: Lay-Out tela de Consulta.

Figura 06: Configuração dos componentes.

E o código XML ficou da seguinte maneira:

<?xml version=”1.0” encoding=”utf-8”?><LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical” android:layout_width=”fill_parent” android:layout_height=”fill_parent”> <TextView android:id=”@+id/textView3” android:layout_width=”wrap_content” android:textAppearance=”?android:attr/textAppearanceLarge” android:layout_height=”wrap_content” android:layout_gravity=”center” android:text=”CONSULTAR”></TextView> <LinearLayout android:layout_height=”wrap_content” android:orientation=”vertical” android:layout_width=”wrap_content” android:id=”@+id/linearLayout2”> <TextView android:id=”@+id/textView1” android:textAppearance=”?android:attr/textAppearanceLarge” android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:text=”Nome Cliente:”></TextView> <TextView android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:id=”@+id/lbCliente”

android:text=”lbCliente”></TextView> </LinearLayout> <LinearLayout android:layout_height=”wrap_content” android:layout_width=”match_parent” android:id=”@+id/linearLayout1” android:orientation=”horizontal”> <LinearLayout android:layout_height=”match_parent” android:orientation=”vertical” android:layout_width=”wrap_content” android:id=”@+id/linearLayout4”> <TextView android:id=”@+id/textView9” android:textAppearance=”?android:attr/textAppearanceLarge” android:layout_height=”wrap_content” android:text=”Cidade” android:layout_width=”214dp”></TextView> <TextView android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:id=”@+id/lbCidade” android:text=”lbCidade”></TextView> </LinearLayout> <LinearLayout android:layout_height=”match_parent” android:orientation=”vertical” android:id=”@+id/linearLayout3” android:layout_width=”match_parent”> <TextView android:text=”Estado” android:id=”@+id/textView10” android:layout_width=”wrap_content” android:textAppearance=”?android:attr/textAppearanceLarge” android:layout_height=”wrap_content”></TextView> <TextView android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:layout_width=”wrap_content” android:id=”@+id/lbEstado” android:text=”lbEstado”></TextView> </LinearLayout> </LinearLayout> <RadioGroup android:id=”@+id/rgCursos” xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical” android:layout_width=”fill_parent”

março 201218

android:layout_height=”wrap_content”> <TextView android:id=”@+id/textView2” android:layout_width=”wrap_content” android:textAppearance=”?android:attr/textAppearanceLarge” android:layout_height=”wrap_content” android:includeFontPadding=”true” android:hapticFeedbackEnabled=”true” android:text=”Produto:”></TextView> <TextView android:layout_width=”wrap_content” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:id=”@+id/lbProduto” android:text=”lbProduto”></TextView> </RadioGroup> <Button android:layout_gravity=”center” android:layout_width=”81dp” android:text=”Voltar” android:id=”@+id/btVoltarConsulta” android:layout_height=”wrap_content”></Button></LinearLayout>

Codificando nosso Exemplo

O principal método é o SetContentView(), ele é responsável por carregar o layout da aplicação. Portanto, iremos utilizá-lo para carregar e navegar entre nossas telas. Serão criadas três Procedures e neste caso todas serão implementadas em nossa “Activity” principal que no meu caso deixei como “NavegandoActivity”

ChamaMenuPrincipal() – Responsável por executar a tela principal.ChamaCadastro() – Responsável por executar a tela de cadastro.ChamaConsulta() - Responsável por executar a tela de consulta.MensagemAlerta() - Responsável por executar uma caixa de alerta.Variáveis globais//Classe RegistroRegistro reg; //Variáveis da Tela de CadastroRadioGroup rgCursos;RadioButton rbLiteDelphi, rbLiteC, rbProfessional, rbStudent;TextView txtCliente, txtCidade, txtEstado;Spinner spEstado;Button btEfetuar; //Variáveis da Tela de ConsultaTextView txtCli, txtCid, txtEst, txtCur;

No evento OnCreate() é onde invocaremos o métodos ChamaMenuPrin-cipal()

@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ChamaMenuPrincipal();}Abaixo a implementação dos Métodos utilizados seguidos de uma breve explicação:public void ChamaMenuPrincipal(){ setContentView(R.layout.main); ChamaCadastro(); ChamaConsulta();}

O método ChamaMenuPrincipal() engloba também os dois métodos ChamaCadastro() e o ChamaConsulta(). public void ChamaCadastro(){ Button btCadastrar = (Button) findViewById(R.id.btCadastrar); btCadastrar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setContentView(R.layout.cadastro); rgCursos = (RadioGroup) findViewById(R.id.rgCursos); rbLiteDelphi = (RadioButton) findViewById(R.id.rbLiteDelphi);rbLiteC = (RadioButton) findViewById(R.id.rbLiteC); rbProfessional = (RadioButton) findViewById(R.id.rbProfessional); rbStudent = (RadioButton) findViewById(R.id.rbStudent); txtCliente = (TextView) findViewById(R.id.edtCliente); txtCidade = (TextView) findViewById(R.id.edtCidade); spEstado = (Spinner) findViewById(R.id.spnEstado); btEfetuar = (Button) findViewById(R.id.btnEfetuar); btEfetuar = (Button) findViewById(R.id.btnEfetuar); btEfetuar.

março 2012 19

setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { reg = new Registro(); reg.cliente = txtCliente.getText().toString(); reg.cidade = txtCidade.getText().toString(); reg.estado = spEstado.getSelectedItem().toString(); switch (rgCursos.getCheckedRadioButtonId()) { case R.id.rbLiteDelphi : reg.curso = 1; break; case R.id.rbLiteC : reg.curso = 2; break; case R.id.rbProfessional : reg.curso = 3; break; case R.id.rbStudent : reg.curso = 4; break; } MensagemAlerta(“Resultado”, “Venda Efetuada com sucesso!” + “\n” + “--------------------------------------” + “Cliente: “ + reg.cliente + “\n”+ “Cidade: “ + reg.cidade + “ / Estado: “ + reg.estado + “\n” + “Cód. Curso: “ + reg.curso); } }); Button btVoltarCadastro = (Button) findViewById(R.id.btVoltarCadastro); btVoltarCadastro.setOnClickListener(new View.OnClickListener()

{ @Override public void onClick(View v) { ChamaMenuPrincipal(); } }); } });}

public void MensagemAlerta(String titulo, String corpo){ AlertDialog.Builder infoResultado = new AlertDialog.Builder(NavegandoActivity.this); infoResultado.setTitle(titulo); infoResultado.setMessage(corpo); infoResultado.setNeutralButton(“Ok”,null); infoResultado.show(); }

O que devemos salientar nesta função ChamaCadastro() é que foi inserido um “Button” Voltar logo abaixo do Botão “Efetuar Venda”. Este botão permite navegar até a tela principal através do método ChamaMenuPrincipal(), não podemos esquecer que os dados digitados em nossa tela de cadastro serão armazenados em uma Classe “Registro” podendo ser consultados na tela de Consulta.

public void ChamaConsulta(){ Button btConsultar = (Button) findViewById(R.id.btConsultar); btConsultar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setContentView(R.layout.consulta); txtCli = (TextView) findViewById(R.id.lbCliente); txtCid = (TextView) findViewById(R.id.lbCidade); txtEst = (TextView) findViewById(R.id.lbEstado); txtCur = (TextView) findViewById(R.id.lbProduto); txtCli.setText(reg.cliente); txtCid.setText(reg.cidade);

março 201220

txtEst.setText(reg.estado); switch (reg.curso) { case 1: txtCur.setText(“The Club Lite (Delphi) - R$59,90”); break; case 2: txtCur.setText(“The Club Lite (C#) - R$59,90”); break; case 3: txtCur.setText(“The Club Professional - R$88,00”); break; case 4: txtCur.setText(“The Club Student - R$25,00”); break; } Button btVoltarConsulta = (Button) findViewById(R.id.btVoltarConsulta); btVoltarConsulta.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ChamaMenuPrincipal(); } }); } });}

Já o Método ChamaConsulta() tem como objetivo carregar os dados inseri-dos na classe Registro. Quando chamarmos a tela aproveitamos e carregamos os dados em seus respectivos componentes, seguido de um “Switch – case” para fazer o inverso no que foi feito na tela de cadastro, ou seja, vamos ler um número inteiro e carregar um texto referente o que foi escolhido. O botão voltar tem a função de chamar o Menu Principal.

Conclusão

Aprendemos neste artigo alguns conceitos básicos para navegar entre telas no sistema Android. Complementamos o artigo do mês passado e concluímos com um exemplo prático e fácil. Espero que os senhores possam implementar outros recursos e que estes exemplos sejam úteis no decorrer do desenvolvimento.

Abraço e até o mês que vem!

Fonte de Informações

http://developer.android.com/guide/topics/fundamentals/activities.html

Thiago Cavalheiro Montebugnoli é tecnólogo, formado pela Faculdade de Tecnologia de Botucatu – SP (FATEC) foi consultor técnico do The Club, já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e Firebird. Atualmente trabalha no Centro de Proces-samento de Dados da Prefeitura Municipal de Itaí-SP. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certi-fied Technology Specialist, MCAD - Microsoft Certified Application Developer e MCSD - Microsoft Certified Solution Developer.

Sobre o autor

Thiago Cavalheiro Montebugnoli

[email protected]

Figura 07: Exemplo em Run-Time.

março 2012 21

março 201222

Linguagem C# - Conceitos Iniciais

Nós do The Club temos 99% de nossos associados atualmente utilizando o Delphi como ferramenta para desenvolvimento de softwares. A nossa equipe de Suporte e Consultoria tem como objetivo de agora em diante proporcionar uma área da revista exclusivamente para os associados que estão interessados em aprender a linguagem C# junto com o Microsoft Visual Studio 2010. Es-creveremos uma série de artigos justamente para aquelas pessoas que querem aprender uma nova linguagem de programação.

Curiosidades

A linguagem C# é muito parecida com a lingua-gem Pascal, sendo totalmente orientada a objetos, criada pela Microsoft e faz parte da plataforma .NET. O C# foi baseado na linguagem C++ e Java.

A linguagem C# foi desenvolvida principalmen-te pelo Anders Heilsberg, que curiosamente o mes-mo era um dos desenvolvedores dos compiladores da Borland, sendo sua principal criação o Delphi.

Conceitos primordiais de um programa escrito em C#

Começaremos com o conhecidíssimo “Alô Mundo”, para isto abra o Visual Studio 2010 escolha “File/New/Project...”. Veremos que a plataforma .NET nos fornece uma gama enorme de lingua-gens e plataformas para o desenvolvimento, mas focaremos apenas na linguagem C# utilizando for-mulários baseados em Windows, os denominados “Windows Forms”.

Podemos ver que existem uma quantidade enorme de informações importantes nesta janela, mas não se preocupem que estarei explicando tudo.

Installed Templates: São as plataformas e linguagens existem no .NET, que no nosso caso utilizaremos o “Visual C#” e o “Windows”.

.NET Framework 4: Na região superior te-mos uma lista de Frameworks suportados pelo Visual Studio, recomendo a utilização do último, a versão 4.

Windows Forms Application: Selecionamos este tipo de Aplicação, pois trabalharemos em formulários baseados no Sistema Operacional Windows.

Name: Indica o nome do nosso projeto, no caso deixemos como Artigo_01.

Location: O diretório onde o exemplo está localizado.

Solution: Permite escolher para adicionar um projeto a uma solução existente ou criar uma nova.

Solution name: Caso escolha para criar uma nova solução, esta opção será desabilitada, no caso nosso escolheremos o nome de “Curso”.

Após realizar estes procedimentos clique no botão Ok. A Figura 02 nos proporciona a hierarquia do programa, notem que possuímos uma Solução e logo em seguida um pacote de itens, que seria a “grosso modo” nosso programa.

Vejamos mais detalhes a seguir:

Properties: Nas propriedades temos informa-

março 2012 23

ções da solução e do projeto. Em AssemblyInfo teremos todos os detalhes, como: Título, Descrição, Tipos de Configurações, Nome da Companhia e tipos de Versões. Podemos manipular todos estes tipos de informações neste arquivo. Em Resources, são os conhecidos recursos. Ali dentro temos a pos-sibilidade de criar diversos tipos de recursos como: Imagens, textos ou ícones. Já em Settings, como o próprio nome já diz, é o arquivo de configuração e é normalmente utilizado para configurações de Banco de Dados.

References: Onde estão localizadas todas as referências do projeto, ou seja, todos os Namespa-ces, as classes necessárias para o funcionamento de um programa. Explicarei um pouco mais adiante. Só para ter uma ideia, para que funcione um Form do Windows é necessário ter declarado a referência “System.Windows.Forms”. Em um projeto podemos adicionar vários tipos de referências.

Form1.cs: É o formulário propriamente dito, onde temos todas as propriedades e métodos. Iremos trabalhar nele daqui a pouco.

Program.cs: Esta classe é automaticamente criada pelo Visual Studio. Abaixo uma explicação mais detalhada:

using System;using System.Collections.Generic;using System.Linq;using System.Windows.

Forms;

namespace Curso{ static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } }}

Veremos a cláusula using que serve para declarar os namespaces utilizados pelo programa, logo em seguida o namespace que seria o nome do Assembly, neste caso deixe como Curso. Dentro de um namespace podemos ter inúmeras classes, sendo necessário ter uma classe e um método prin-cipal, sendo a classe Program e o método estático Main. O método Main seria a porta de entrada e saída de um programa escrito em C#. Este método necessariamente deve estar inserido dentro de uma classe. Ele automaticamente é invocado pelo compilador no momento que iniciar o programa.

A estrutura de um programa em C# é a se-guinte:

Observem que o método Main possui algumas linhas de código criadas automaticamente pelo Visual Studio pelo fato de estarmos trabalhando com Formulários em Windows, os denominados “Windows Forms”. Sendo:

Application.EnableVisualStyles(): Este método habilita os estilos visuais para o aplicativo.

Application.SetCompatibleTextRenderingDefault(false): Define o padrão de renderização de texto.

Application.Run(new Form1()): Método res-ponsável por chamar o formulário principal.

Portanto, vimos que o Program.cs é executado antes de chamar nosso formulário propriamente dito, ou seja, como foi explicado anteriormente o Método Estático Main funciona como a porta de entrada e posteriormente saída de um projeto em C#. Daremos continuidade explorando algumas propriedades e métodos de nosso “Form1”, para isto dê um duplo clique para configurarmos nosso formulário.

A IDE do Visual Studio é bem intuitiva. Confi-ram na Imagem 03 suas propriedades e Métodos.

Alteramos as seguintes propriedades do

Formulário:

Text: The Club - O maior

Figura 01: Novo Projeto em Windows Forms.

Figura 02: Solution Explorer.

NAMESPACE

CLASSESS

MÉTODOS PROPRIEDADESSS

março 201224

Clube de Programadores do BrasilStartPosition: CenterScreenSize: 473; 372

Adicione um Button localizado na palheta Stan-dard e altere as seguintes propriedades do mesmo.

Text: Executar

Dando um duplo clique no botão, colocaremos nossa primeira linha de código, o bom e velho “Alô Mundo”, veja abaixo o código utilizando o Messa-geBox(), seriam as caixas de diálogo equivalente ao ShowMessage() em Delphi.

private void button1_Click(object sender, EventArgs e){ MessageBox.Show(“Alô Mundo, Este é um Teste Legal do The Club!”);}

Rode a aplicação pressionando F5 e verá um resultado de acordo com a Imagem 04.

Declarando e utilizando variáveis

Antes de nós utilizarmos uma variável é neces-sário declará-la, alocando espaço para a mesma na memória dizendo o tipo de dado que deverá ser armazenado.

O C# pode armazenar diversos tipos de dados, como: inteiros, números fracionais, textos, objetos, entre outras coisas.

Exemplos:

int numero1;float numero2;string texto1;

Para atribuir um valor veja o exemplo seguinte:

private void button2_Click(object sender, EventArgs e){ int numero1, numero2, total;

numero1 = 10; numero2 = 30;

total = numero1 + numero2;

MessageBox.Show(“Resultado: “ +

total.ToString());}

De fato o exemplo acima é muito simples, mas serve para exemplificar a manipulação de variáveis em C#. Em seguida mostramos uma mensagem para o usuário utilizando o próprio Messagebox(). O método ToString() transforma inteiro em String, que neste caso se fez necessário pois o tipo de parâmetro é uma String. Ver Imagem 05.

Estruturas condicionais - IF/ELSE

Estruturas condicionais são necessárias em toda linguagem de programação, não sendo menos importante em C#. A sintaxe pode ser escrita da seguinte maneira:

if (condição){//Código1//Código2}else{//Código3//Código4}

Aproveitando o exemplo acima adicione mais um Button, um Label e um TextBox e altere as seguintes propriedades:

ButtonText: If/Else

LabelText: Idade

TextBoxMaxLength: 100

Neste caso iremos verificar o que foi digitado no TextBox e mostrar para o usuário se o mesmo é maior de idade ou não, vejamos o código abaixo:

private void button3_Click(object sender, EventArgs e){ int idade = 0;

Figura 03: Propriedades e Métodos.

março 2012 25

idade = int.Parse(textBox1.Text);

if (idade >= 18) { MessageBox.

Show(“Maior de Idade!”); } else { MessageBox.Show(“Menor de Idade!”); }}

Ver Imagem 06. Podemos também utilizar o If/Else em cascata,

para encadear várias condições se necessário.

Vejamos a sintaxe e logo em seguida um exemplo prático.

if (condição == 1){//Código1}Else if (condição == 2){//Código2}Else if (condição == 3){//Código3}Else if (condição == 4){//Código4

}Else {//Código5}

Utilizando a mesma lógica do cálculo de idades podemos montar outro exemplo.

private void button4_Click(object sender, EventArgs e){ int idade = 0; idade = int.Parse(textBox2.Text); if (idade < 18) { MessageBox.Show(“Menor de Idade!”); } else if (idade >= 18 && idade <= 30) { MessageBox.Show(“Maior de 18 e menor de 30 anos!”); } else if (idade > 30 && idade < 40) { MessageBox.Show(“Maior de 30 e menor de 40 anos!”); } else { MessageBox.Show(“Maior de 40 anos!”); }}

Ver Imagem 07. Condições Ternárias

O C# oferece outra opção para construção de declarações condicionais, as denominadas condi-ções ternárias. É uma alternativa interessante para os programadores que estão habituados com a linguagem C e uma novidade para os que trabalham com o Delphi.

A sintaxe utilizada:

<expressão> ? <verdadeira> : <falsa>

Figura 04: Formulário em Run-time.

Figura 05: Somando valores.

março 201226

Segue um exemplo de sua utilização:

private void button5_Click(object sender,

EventArgs e){ int idade = 0;

idade = int.

Parse(textBox3.Text); MessageBox.Show(idade >= 18 ? “Maior de Idade!” : “Menor de Idade!”);}

Eu particularmente adoro isto, a economia de linhas de código é incrível.

Switch..Case

Utilizamos como exemplo os dias da semana, para isto insira no mesmo formulário um Button, um Label e um TextBox e altere suas propriedades:

ButtonText: Switch/Case

LabelText: Dias da Semana

TextBoxMaxLength: 100

A Sintaxe:

switch (condicao) { case: //condição 1 break;

case: //condição 2 break;

case: //condição 3 break; }

Entraremos com números de 1 a 7 para indicar o dia da semana, veja abaixo o código:

private void button6_Click_1(object sender,

EventArgs e) { int semana = 0;

semana = int.

Figura 06: Estrutura If/Else.

Figura 07: Instruções IF em cascata.

Figura 08: Exemplo em Run-Time.

março 2012 27

Parse(textBox4.Text);

switch (semana) { case 1: MessageBox.Show(“Segunda-Feira”); break;

case 2: MessageBox.Show(“Terça-Feira”); break;

case 3: MessageBox.Show(“Quarta-Feira”); break;

case 4: MessageBox.Show(“Quinta-Feira”); break;

case 5: MessageBox.Show(“Sexta-Feira”); break; case 6:

MessageBox.Show(“Sábado”); break;

case 7: MessageBox.Show(“Domingo”); break; }

}

Logicamente que poderíamos utilizar outros componentes, como um Combobox por exemplo.

A Imagem 08 ilustra nosso exemplo completo.

Conclusão

Este primeiro artigo, apesar de simples, se torna muito importante e indispensável para quem está dando os primeiros passos em C#. Ele aborda conceitos iniciais e a principal e a mais utilizada Instrução Condicional, o If/Else.

Para quem quiser treinar faça programinhas utilizando outras variáveis como string ou float e mesclando tudo o que aprendemos nos exemplos criados neste artigo.

Fica aí a dica.

Um Forte abraço a todos e até o mês que vem!

Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Técnico do The Club, Bacharel em Ciência da Computação, MBA em Gestão Empresarial, Certificações MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

Sobre o autor

Marcos César Silva

[email protected]

março 201228

Dicas DELPHI

Função para verificar o número dos Cartões de Débito e Crédito

Essa função verifica se o cartão de crédito é valido de acordo com sua numeração, assim como fazem as verificações de CPF e RG, ele irá tratar os dados do número do cartão informado, e de acordo com os registros lidos irá ser retornada a bandeira pertencente àquele número passado.

function TForm1.CartaoCredito(Numero: String): Integer;var NumerosCartao: string[21]; VCartao: array[0..21] of Byte absolute NumerosCartao; XCartao: Integer; CartaoString: string[21]; y,x: Integer;begin CartaoString:= ‘’; FillChar(VCartao,22,#0); NumerosCartao:= Numero;

for x:= 1 to 20 do if (VCartao[x] in [48..57]) then CartaoString:= CartaoString + chr(VCartao[x]);

NumerosCartao:= ‘’; NumerosCartao:= CartaoString; XCartao:= 0;

Aqui é feita a verificação do último digito, se ele é impar ou par, que irá identificar o tipo do cartão identificado no sistema

if not odd(Length(NumerosCartao)) then for x:= (Length(NumerosCartao) - 1) downto 1 do begin if odd(x) then y:= ((VCartao[x] - 48) * 2) else y:= (VCartao[x] - 48);

if (y >= 10) then y:= ((y - 10) + 1); XCartao:= (XCartao + y) end

else

for x:= (Length(NumerosCartao) - 1)

downto 1 do begin if odd(x) then y:= (VCartao[x] - 48) else y:= ((VCartao[x] - 48) * 2);

if (y >= 10) then y:= ((y - 10) + 1); XCartao:= (XCartao + y) end;

x:= (10 - (XCartao mod 10));

if (x = 10) then x:= 0;

if (x = (VCartao[Length(NumerosCartao)] - 48)) then Result:= Ord(CartaoString[1]) - Ord(‘2’)

else Result:= 0end;

Conclusão

Essa verificação é fundamental para se consultar a fonte e a bandeira do cartão do usuário, verificando a autenticidade e a validade do cartão, sendo ele tanto débito quanto crédito.

Executando Componente ProgressBar dentro de um Botão

Essa dica faz com que o componente ProgressBar execute o método de carregamento (através da propriedade Position) dentro do compo-nente TButton, e ao clicar ele converte o botão para o ProgressBar, para isso é necessário fazer com que o Tipo TButton seja sua classe pai, e assim, permitindo com que seja herdada a execução da barra dentro do botão.

No evento OnCreate definimos como pai o componente Button1, que é quem receberá a ProgressBar e o posicionamento que irá ter assim que a ProgressBar for exibida dentro do botão.

procedure TForm1.FormCreate(Sender: TObject);

março 2012 29

begin ProgressBar1.Parent:= Button1; ProgressBar1.Width:= Button1.Width - 7; ProgressBar1.Height:= Button1.Height - 7; ProgressBar1.Left:= 3; ProgressBar1.Top:= 3;end;

E no evento OnClick do botão iremos deixar o botão sem visibilidade e visualizar a ProgressBar, deixando-o na posição inicial 0, em seguida fazendo um loop que irá incrementar de 0 a 100 com tempo de espera de 10 milissegundos, para que seja possível visualizar a contagem da posição na ProgressBar, e por fim ocultando a ProgressBar e retornando a visualização do botão.

procedure TForm1.Button1Click(Sender: TObject);var i : Integer ;begin Button1.Enabled:= False;

if ProgressBar1.Visible then Exit;

ProgressBar1.Position:= 0; ProgressBar1.Visible:= True;

for i := 0 to 100 do begin Sleep(10); ProgressBar1.Position:= ProgressBar1.Position + 1; Application.ProcessMessages; end;

ProgressBar1.Visible:= False; Button1.Enabled:= True;end;

Conclusão

Essa função deixa a aplicação visualmente mais rica, com variações de tipos de componentes integrados, utilizando recursos de hierarquia de classes, fazendo com que, dessa mistura apareçam novos compo-nentes, derivados dos nativos da instalação do delphi.

Apagando uma pasta e suas subpastas do Computador

Essa função remove completamente todos os arquivos contidos dentro da pasta selecionada para ser apagada, além de remover todos seus subdiretórios e arquivos ocultos contidos nelas contidos

procedure ApagaPastasSubpastas(const Diretorio : String); var SearchRec : TSearchRec; begin Try ChDir(RootDir); {Caminho Especificado} FindFirst(‘*.*’,faAnyFile,SearchRec); Erc := 0; while Erc = 0 do begin if ((SearchRec.Name <> ‘.’ ) and (SearchRec.Name <> ‘..’)) then begin if (SearchRec.Attr and faDirectory>0) then begin //Momento em que é deletado a pasta e seus subdiretórios DelTree(SearchRec.Name); end else begin //Escolher apagar um arquivo end; end; Erc := FindNext (SearchRec); { Erc igual a zero se o FindNext obtiver sucesso, senão erro do DOS} Application.ProcessMessages; end; finally if Length(RootDir) > 3 then ChDir(‘..’); end; end;

Conclusão

Essa função faz com que, diretamente da aplicação desenvolvida no Delphi, q tenha autonomia e controle sobre os arquivos, ideal para quem pretende desenvolver aplicações com integração de hardware e software, permitindo a manipulação dos arquivos do disco rígido.

março 201230

VerticalHorizontal

março 2012

março 2012