Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ......

32

Transcript of Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ......

Page 1: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria
Page 2: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria
Page 3: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

3

THE CLUBAv. Profº Celso Ferreira da Silva, 190

Jd. Europa - Avaré - SP - CEP 18.707-150Informações: (14) 3732-3689

Suporte: (14) 3733-1588 - Fax: (14) 3732-0987

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected]

Informações: [email protected]

DúvidasCorrespondência ou fax com dúvidas devem

ser enviados ao - THE CLUB, indicando"Suporte".

OpiniãoSe você quer dar a sua opinião sobre o clube

em geral, mande a sua correspondência para aseção "Tire sua dúvida".

ReproduçãoA utilização, reprodução, apropriação,

armazenamento em banco de dados, sobqualquer forma ou meio, de textos, fotos e

outras criações intelectuais em cada publicaçãoda revista “The Club Megazine” são

terminantemente proibidos sem autorizaçãoescrita dos titulares dos direitos autorais.

Impressão e acabamento:GRAFILAR

Tel.: (14) 3841-2587 - Fax: (14) 3841-3346Rua Cel. Amando Simôes, 779

Cep 18.650-000 - São Manuel - SPTiragem: 5.000 exemplares

Copyright The Club Megazine 2006

Diretor TécnicoMauro Sant’Anna

ColaboradoresMarcelo Nogueira, Mário Bohm,

Aguinaldo P. Silva

EDITORIAL

Editorial

Editorial .................................................................................. 03SEF - Sistema de Escrituração Fiscal - Implementação ....... 04O novo componente TrayIcon do Delphi 2006 ....................... 11Visual Studio 2005 e Visual Basic Produtividade no Código .. 13Criando arquivo de instalação para projeto Web(Windows Installer) ................................................................ 16Delphi, uma questão de sobrevivência .................................. 19Fortes Report - Uma boa opção de geradorde relatório Freeware ............................................................. 21Perguntas & Respostas ......................................................... 26Dicas & Truques .................................................................... 28

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

pelos seus respectivos proprietários.

Olá amigos,

Aqui estamos com mais uma edição da revista The Club Megazine trazendo atévocê mais informações importantes.

Começamos pela segunda parte da matéria sobre SEF - Sistema de EscrituraçãoFiscal escrita por nossos colaboradores Victory Fernandes e Airton Miranda.

O nosso consultor técnico Claudinei Rodrigues traz uma matéria muito útilfalando sobre um novo componente do Delphi 2006 chamado TrayIcon.

O nosso colaborador Alexandre Tarifa mostra nesta edição a produtividade noVisual Studio 2005. Nesta matéria você verá como ganhar tempo nesta excelenteferramenta.

O nosso consultor Marcos César Silva traz até vocês a informação sobre como criarum arquivo de instalação para um projeto Web no Visual Studio 2005.

O nosso amigo Emerson Facunte traz na sua matéria intitulada, “Delphi, umaquestão de sobrevivência”, a sua opinião sobre o futuro do Delphi.

Estamos trazendo também informações sobre um componente chamado FortesReport. Para quem não conhece, este é um gerador de relatórios freeware, bastanteinteressante.

E finalizando com seção Perguntas e Respostas com algumas das solicitadas feitasao nosso suporte técnico durante o ultimo mês.

Boa leitura a todos.

Page 4: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

4

SEF

No primeiro artigo da série, foram abordados os conceitos ecaracterísticas gerais do SEF, tendo sido apresentada a estruturabásica do arquivo e seus principais registros, incluindo o exemplode montagem do registro 50 como forma de demonstrar aestruturação geral de um registro do SEF.

Continuando a nossa série de artigos sobre o SEF,abordaremos a implementação do arquivo propriamente dita.Através do demo que acompanha o artigo, é demonstrada ageração de todos os registros do SEF e a geração dos principaisregistros do SEF descritos no artigo anterior a partir de dadospré-definidos.

Visão geral da ImplementaçãoComo o SEF se baseia em uma série de informações

fornecidas pelo usuário do sistema gerencial em questão, e comoestas informações devem ser cuidadosamente tratadas antes deserem enviadas para o banco de dados do sistema e por fimutilizadas na geração do arquivo de texto, sob pena de recusa doarquivo gerado por parte do Programa Validador, foi desenvolvida aSEFPE32dll.dll. Esta é uma solução que visa facilitar e agilizar oprocesso de tratamento destas informações, uma vez que seususuários podem abstrair a camada de geração dos registros evalidação das informações, se preocupando apenas em fazer aschamadas à dll passando os parâmetros necessários para acriação dos registros.

É importante lembrar que o arquivo do SEF será geradoreferente a um período anterior (ex. Fevereiro gera-se o SEF deJaneiro), com base em informações que já foram adicionadas emum banco de dados e que devem ser coerentes com o SEF. Então,a SEFPE32dll.dll deve ser usada na verdade em dois momentos, aexemplo:

· Momento A: Em um sistema de controle de notas fiscais com

SEF, as entradas e saídas de notas fiscais e demais operaçõessujeitas ao SEF, devem ser feitas levando em consideração que obanco de dados gerado será usado para geração do arquivomagnético. Assim, logo após o preenchimento de cadainformação, o sistema deve antes de tudo chamar a dll para osregistros correspondentes e testar se houve erro, salvando asinformações no banco de dados, caso nenhum problema sejaencontrado.

· Momento B: No momento da geração do arquivo magnéticopropriamente dita, o sistema deve ler as informações do banco dedados e fazer as chamadas às funções da dll de acordo com osregistros desejados.

por Victory Fernandes e Airton Miranda

Figura 01: Processo de Implementação do SEF

Sobre o autores

Victory Fernandes é Engenheiro, Mestrando em Redes de Computadores e desenvolvedor sócio da TKS Software - Soluções de AutomaçãoSoftwares Dedicados. Pode ser contactado em [email protected], ou através dos sites www.victory.hpg.com.br – www.igara.com.brAirton Miranda é estudante do Engenharia Mecatrônica e desenvolvedor da TKS Software - Soluções de Automação Softwares Dedicados. Podeser contactado em [email protected]

SEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalImplementaçãoImplementaçãoImplementaçãoImplementaçãoImplementação

SEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalSEF - Sistema de Escrituração FiscalImplementaçãoImplementaçãoImplementaçãoImplementaçãoImplementação

Page 5: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

5

SEF

Na Figura 01 vemos ospassos envolvidos naimplementação do SEF quesão descritos a seguir. Ospassos 01, 02, 04 e 05 sãoaqueles que devem serimplementados nosistema gerencial e os passosem 03, 07 e 08 (em verde)podem ser abstraídos a partirda utilização daSEFPE32dll.dll.

1. Tabelas e Campos deacordo com o SEF: Todas astabelas do sistema gerencialem questão devem estarformatadas de acordo com oscampos dos registros do SEF,observando-se tipos de campo(numérico ou alfanumérico)e tamanho máximo dosmesmos.

2. Telas de Cadastro deDados do SEF: As telas dosistema gerencial devem estar de acordo com o banco de dados e,as necessidades do SEF. Atenção principalmente para as telas deVendas, Entrada de Nota Fiscal e Saída de Nota Fiscal quenormalmente precisam ser revistas sendo necessário fazer pelomenos pequenas alterações não previstas até então. Atençãotambém para telas de Cadastro de Informante (Registro 10 e 11) e etc queprecisam ser criadas para satisfazer a geração de algunsregistros específicos do SEF.

3. Validação das Informações + Tratamento de Erros: Paragarantir o máximo de integridade e o mínimo de imprevistos nomomento da geração do arquivo, é aconselhável que os dadospassem pela camada de validação de informações antes de ir parao banco de dados. Assim, no momento da geração, você garanteque os dados do banco estão consistentes.

4. Seleção das informações do Período: Esta é a tela degeração do arquivo propriamente dita, e nela deve haver umaimplementação de seleção das informações a serem utilizadaspara a geração do arquivo, normalmente feita através de Querysno banco de dados, aplicando à Select os filtros referentes aoperíodo das informações, tipo de registros, bem como ordenaçãodos campos (order by) e agrupamentos (group by) caso necessário.

5. Chamadas para as Geração dos registros: As informaçõesretornadas pelo banco de dados serão então passadas comoparâmetros para as chamadas de geração dos registros sob aforma de loops nas Querys de seleção.

As funções de geração dos registros, executam novamente oprocedimento de validação das informações (Passo 3) e por fim,caso não seja encontrado erro nas informações transmitidas,executa a Composição dos Registros, colocando os parâmetrospassados sob a forma descrita na legislação do SEF.

Implementando o SEF com a SEFPE32Dll.dllA SEFPE32dll.dll vem acompanhada de um aplicativo que

demonstra o uso de suas funcionalidades. Para o Momento A há odemo sem utilização de banco de dados, onde são mostradaschamadas a todas as funções presentes na dll. Através de cliquesnos botões respectivos você pode fazer os testes de cada funçãoseparadamente, como mostra a Figura 02.

Assim, ao clicar no botão “Registro 50” o seguinte código éexecutado para a geração da linha do registro 50 conforme aespecificação do SEF.

(…)Function Registro50(CNPJ, Insc_Est,Data_Emissao_Recebimento, UF, Modelo, Serie,

Figura 02: Demo sem banco de dados. Chamadas a todas asfunções disponíveis na SEFPE32dll.dll através do clique nosbotões respectivos

Page 6: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

6

SEF

Nro, CFOP, Emitente, Valor_Total_CFOP,Base_ICMS, Valor_ICMS, Isenta, Outras,Aliquota,Situacao, Data_Operacao,Nro_Lanc_Cont, CODUNC, Cod_Classe_Energia,Data_Inicial_Consumo, Data_Final_Consumo,Complemento_Nro_NF,Demanda_Contratada,Demanda_Contratada_Fora, Nro_Consumidores,Valor_Total_NF,Base_Calculos,Valor_ICMS_Total, Operacoes_Isentas,Outras_Total, Observacao: ShortString):Integer; stdcall; external ‘SEFPE32Dll.dll’;(…)procedure TForm1.Button3Click(Sender:TObject);var TempInt: Integer;begin//Registro50 - Registro de Total de NotaFiscalTempInt :=Registro50(’23.859.507/0001-09', //CNPJ‘7.075.793.310.062’, //Insc_Est’01/01/2006', //Data_Emissao_Recebimento‘BA’, //UF,‘01’, //Modelo‘2’, //Serie‘6’, //Nro‘5111’, //CFOP‘P’, //Emitente‘518,19’, //Valor_Total‘518,19’, //Base_ICMS’36,27', //Valor_ICMS‘’, //Isenta‘0,00’, //Outras‘7,00’, //Aliquota‘N’, //Situacao‘’, //Data de Emissão doDocumento‘1’, //Código de Lançamento

//Associado à Operação‘’, //Complemento do Número

//da Nota Fiscal‘’, //CODUNC‘’, //Código de Consumo de

//Energia Elétrica’01/01/2006', //Data Inicial do Consumo’01/01/2006', //Data Final do Consumo‘’, //Demanda Contratada Ponta‘’, //Demanda Contratada

//Fora-Ponta‘’, //Número de Consumidores

‘518,19’, //Valor Total‘518,19’, //Base de Cálculo do

//ICMS - Total’36,27', //Valor Total do ICMS‘’, //Operações Isentas

// Total‘’, //Valor Total que Não

//Confira Débito ou//Crédito

‘’ //Observação); Trata_SEF_Int(TempInt);end;

Para o Momento B mostraremos como implementar em seusoftware as chamadas aos principais registros do SEF descritosanteriormente. As chamadas às funções da dll deverão ser feitaspassando como parâmetros os valores contidos em um banco dedados, refletindo o exato comportamento que deve serimplementado pelo desenvolvedor quando na adaptação do seusistema.

A seguir, são descritos os passos gerais do algorítmo para autilização da SEFPE32dll.dll no seu software:

1- Inicia o uso da SEFPE32dll.dll a partir de uma chamada àfunção Inicia_SEF que recebe como parâmetro os locais onde serãoarmazenados o Arquivo_SEF, Arquivo_Erro e Arquivo_Log,respectivamente. Neste momento, vale fazer uma ressalva, afunção Inicia_SEF executa a verificação se o arquivo de saída jáexiste e, caso exista, exclui o arquivo existente no local de destino.

2- Realiza a chamada a uma determinada função de registro,que faz uma Query no banco de dados respectivo, buscando pelasinformações necessárias à geração do registro dentro do períododesejado e na ordem de apresentação definida (order by).

3- Realiza um loop na Query fazendo chamadas à SEFPE32dll.dll,passando como parâmetros os resultados retornados pela Query, earmazenando em uma variável temporária um valor integerretornado pela dll (valor -1, caso ocorra algum erro, ou valor 0,caso não ocorra nenhum problema).

4- Caso o valor integer temporário seja de erro, é efetuada adescrição completa do erro no arquivo de erro cujo caminho éindicado ao iniciar o uso da dll– ver Figura 03. Caso contrário, oregistro é devidamente formatado e adicionado ao arquivo SEF,cujo caminho também é indicado ao iniciar o uso da dll.

5- Repete-se os passos 2, 3 e 4 para todos os registros do SEFque se deseja gerar, tendo em vista características específicas doinformante, como por exemplo, se ele é ou não contribuinte do IPI(deve-se gerar registro 51), se ele é ou não Substituto Tributário(deve-se gerar registro 53).

Page 7: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

7

SEF

Vamos agora mostrar passo a passo a implementação doalgoritmo descrito anteriormente para a confecção do registro 50já apresentado nas situações anteriores.

No passo 1, faz-se a chamada a função Inicia_SEF com osparâmetros descritos anteriormente.

procedure TSEF_ListFrm.BitBtn1Click(Sender:TObject);Arquivo_SEF, Arquivo_Erro, Arquivo_Log:String;begin Arquivo_SEF := ‘c:\SEF.txt’; Arquivo_Erro := ‘c:\LOG_ERRO.txt’; Arquivo_Log := ‘c:\LOG_USO.txt’; Inicia_SEF(Arquivo_SEF, Arquivo_Erro,Arquivo_Log);(…)

No passo 2, realiza-se a chamada a uma determinada funçãode registro, que faz uma Query no banco de dados respectivo,buscando pelas informações necessárias à geração do registrodentro do período desejado e na ordem de apresentação definida(order by).

procedure TForm1.sRegistro50;begin //Geração de Registro50 quanto Nota Fiscal //Executa a seleção dos registros no bancode dados with QrySEF do begin Close; UnPrepare; SQL.Clear; SQL.Add(‘SELECT * FROMtabela_notas_fiscais WHERE ‘); SQL.Add(‘(datahora_emissao BETWEEN:datahora_ini AND :datahora_fim)’); SQL.Add(‘ORDER BY datahora_emissao’); ParamByName(‘datahora_ini’).asdatetime :=DataHora_Inicial; ParamByName(‘datahora_fim’).asdatetime :=DataHora_Final; Prepare; Open; end;

No passo 3, realiza-se um loop na Query, fazendo chamadas àSEFPE32dll.dll, passando como parâmetros os resultados

retornados pela Query, e armazenando em uma variáveltemporária o valor integer retornado pela dll.

procedure TForm1.sRegistro50;begin(…)if QrySEF.RecordCount > 0 then beginwhile not QrySEF.EOF do begin {Faz a chamada da dll passando asinformações do banco de dados e armazena numastring temporária} TempInt := Registro50(QrySEF.FieldByName

(‘cnpj_destino’).AsString, //CNPJ QrySEF.FieldByName(‘ie_destinatario’).

AsString, //IE datetostr(QrySEF.FieldByName(‘datahora_emissao’).AsDateTime), //Data QrySEF.FieldByName(‘uf_destinatario’).

AsString, //UF QrySEF.FieldByName(‘modelo_nf’).

AsString, //Modelo QrySEF.FieldByName(‘serie_nf’).

AsString, //Serie QrySEF.FieldByName(‘num_nf’).

AsString, //Nro QrySEF.FieldByName(‘cfop’).AsString,//CFOP QrySEF.FieldByName(‘emitente_nf’).

AsString, //Emitente formatcurr(‘0.00’, QrySEF.FieldByName

(‘subtotal’).AsFloat), //Valor_Total formatcurr(‘0.00’, QrySEF.FieldByName

(‘base_icms’).AsFloat), //Base_ICMS formatcurr(‘0.00’, QrySEF.FieldByName

(‘valor_icms’).AsFloat), //Valor_ICMS formatcurr(‘0.00’, QrySEF.FieldByName

(‘isento_icms’).AsFloat), //Isenta formatcurr(‘0.00’, QrySEF.FieldByName

(‘outras_despesas’).AsFloat), //Outras formatcurr(‘0.00’, QrySEF.FieldByName

(‘aliquota_icms’).AsFloat), //Aliquota QrySEF.FieldByName(‘situacao_nf’).AsString //Situação datetostr(QrySEF.FieldByName(‘data_emissao’).

AsDateTime), //Data Emissão QrySEF.FieldByName(‘cod_lanc’).

AsString, //Cod Lançamento QrySEF.FieldByName(‘complemento_nf’).

Page 8: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

8

SEF

AsString, //Comp. do Nro da NF QrySEF.FieldByName(‘cdunc’).

AsString, //CODUNC QrySEF.FieldByName(‘cod_energia_eletrica’).

AsString, //Consumo de Energia Elétrica datetostr(QrySEF.FieldByName(‘data_inicial’).

AsDateTime), //Data Inicial Consumo datetostr(QrySEF.FieldByName(‘data_final’).

AsDateTime), //Data Final Consumo QrySEF.FieldByName(‘demanda’).

AsString, //Demanda Contratada Ponta QrySEF.FieldByName(‘demanda_fora’).

AsString,//Demanda Contratada Fora-Ponta QrySEF.FieldByName(‘num_consumidores’).

AsString, //Número Consumidores formatcurr(‘0.00’, QrySEF.FieldByName

(‘valor_total’).AsFloat), //Valor Total formatcurr(‘0.00’, QrySEF.FieldByName

(‘base_calc’).AsFloat), //Base Cálculo //ICMS Total

formatcurr(‘0.00’, QrySEF.FieldByName(‘total_icms’).AsFloat), //V. ICMS

formatcurr(‘0.00’, QrySEF.FieldByName(‘operacoes_total’).AsFloat), //Op.

// Isentas Total formatcurr(‘0.00’, QrySEF.FieldByName

(‘sem_credito’).AsFloat), //Valor Tot. //sem Débito/Crédito

QrySEF.FieldByName(‘observacao’).AsString);//Observação

end;end;

Nos passos 3 e 4, deve-se criar um procedimento que irá recebercomo parâmetro um valor integer fornecido por cada registrochamado, com o objetivo de verificar se o valor contém descriçãode erro ou se o registro foi devidamente formatado.

procedure TForm1.Trata_SEF_Int(retorno:integer);begin if retorno = -1 then showmessage(‘Erro na chamada do Registro,verifique o erro em ‘ + edit2.text) else if retorno = 0 then showmessage(‘Registro OK, verifique oregistro em ‘ + edit1.text) else showmessage(‘Retorno desconhecido’);end;

No passo 5, repete-se, os passos 2, 3 e 4 para todos os registrosdo SEF que se deseja gerar, tendo em vista característicasespecíficas do informante, como por exemplo se ele é ou nãocontribuinte do IPI (deve-se gerar registro 51), se ele é ou nãoSubstituto Tributário (deve-se gerar registro 53). Assim o código parachamada e geração dos registros é conforme segue:

procedure TSEF_ListFrm.BitBtn1Click(Sender: TObject);

Arquivo_SEF, Arquivo_Erro, Arquivo_Log:String;begin Arquivo_SEF := ‘c:\SEF.txt’; Arquivo_Erro := ‘c:\LOG_ERRO.txt’; Arquivo_Log := ‘c:\LOG_USO.txt’; DataHora_Inicial :=StartOfTheMonth(Datetimepicker1.DateTime); DataHora_Final :=EndOfTheMonth(Datetimepicker1.DateTime); Inicia_SEF(Arquivo_SEF, Arquivo_Erro,Arquivo_Log); sRegistro10; sRegistro11; sRegistro50; (…) sRegistro90; Finaliza_SEF;end;

Onde as funções sRegistro10, sRegistro11, sRegistro50 e etc executaminternamente as funcionalidades descritas nos passos 2, 3, 4para suas respectivas tabelas do banco de dados.

Para concluir o processo de geração, deve-se por fim fazer achamada do registro 90, obrigatório a todo arquivo e SEF, efinalizar o uso da dll através da chamada da função Finaliza_SEF.Ao chamar a função Finaliza_SEF são gerados 3 arquivos, cujodetalhamento é descrito a seguir.

Arquivo de ErroCaso ocorra algum erro durante as chamadas dos registros, é

gerado um arquivo de erro, conforme mostrado na Figura 03,descrevendo com detalhes todos os erros encontrados durante ageração do SEF.

Definições de campos do arquivo de erro:1 – Registro em que ocorreu o problema;2 – Parâmetros passados pelo usuário para a dll;3 – Parâmetros passados pelo usuário após formatação e tratamento da dll;4 – Erros ocorridos no registro;5 – Observações que foram geradas no registro.

Page 9: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

9

SEF

Arquivo de Log de UsoO arquivo de Log de Uso, mostrado na Figura 04, sintetiza

informações sobre a quantidade de registros gerados no ArquivoSEF, observações e erros encontrados durante a geração.

Arquivo SEFO Arquivo SEF é o arquivo que contém as informações

devidamente formatadas conforme a legislação do SEF e ao finaldo processo de geração, uma vez que não tenham sido geradoserros, o Arquivo SEF está pronto para ser validado. A Figura 05mostra a estrutura do arquivo montado. Para o arquivo SEF servalidado, ele necessita de uma quantidade mínima de registros,os quais estão implementados no demo, clicando com o botãodireito do mouse “Seqüência 01(10, 11, 88, 90)”.

A SEFPE32Dll.dll vem acompanhada da documentaçãocompleta sobre como utilizar suas funções e quais os tipos de

Figura 03: Texto com os erros gerados na SEF32Dll.dll

Figura 04: Arquivo_Log que mostra o resumo dos registros doSEF chamados durante a geração do Arquivo SEF.

erros retornados por cada função. Há ainda um demo completoem Delphi que mostra como conectar a dll ao seu programa etestar a saída da mesma sem banco de dados.

Para obter uma cópia e maiores informações sobre aSEFPE32Dll.dll visite o site:

http://www.igara.com.br/produto.php?cod_produto=86

Page 10: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

10

SEF

Figura 05: Arquivo SEF gerado com a “Seqüência 01” do demo pronto para ser validado

ConclusãoCom este artigo, cobrimos os conceitos gerais acerca da

implementação do SEF, estruturação básica do sistema gerenciale o fluxograma de procedimentos a serem seguidos para ageração arquivo.

Tendo sido demonstrado a partir do exemplo do registro 50 aforma geral de implementação, geração e tratamento de erros deum registro do SEF a partir de informações contidas em umbanco de dados.

Conforme demonstrado a SEFPE32Dll.dll pode ser usada comqualquer banco de dados (do Paradox ao Oracle) uma vez que seusparâmetros são do tipo String, só é preciso gerar as querys e passaros parâmetros para a dll como tipo String.

No próximo artigo da série será descrito todo o processo devalidação, visualização e transmissão do arquivo gerado,abordando as ferramentas oficiais disponíveis relacionadas aotema.

Page 11: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

11

Delphi

O novo componenteO novo componenteO novo componenteO novo componenteO novo componenteTrayIcon do Delphi 2006TrayIcon do Delphi 2006TrayIcon do Delphi 2006TrayIcon do Delphi 2006TrayIcon do Delphi 2006

O novo componenteO novo componenteO novo componenteO novo componenteO novo componenteTrayIcon do Delphi 2006TrayIcon do Delphi 2006TrayIcon do Delphi 2006TrayIcon do Delphi 2006TrayIcon do Delphi 2006

Por Claudinei Rodrigues – [email protected]

O Delphi 2006 traz nativamente um componente que é muitoprocurado pelos programadores. Com certeza quem ainda nãoutilizou agora vai utilizar. O componente TrayIcon pode serencontrado na palheta Additional e é muito simples de serutilizado.

Crie um novo projeto e adicione-o ao formulário. Altere a suapropriedade Visible para True. Agora pressione a tecla F9 paraque o projeto seja compilado e executado. Assim que o seuprograma for executado, veja que aparecerá um ícone ao lado dorelógio na barra de tarefa do seu Windows. Muito simples não? Afunção básica de um trayicon é permitir ao usuário esconder erestaurar a sua aplicação. Esta é uma maneira muitointeressante de manter um atalho para a sua aplicação. Mas estecomponente não se limita apenas a isto. Ele tem mais recursosque com certeza serão muito úteis a sua aplicação.

Trabalhando com o componenteVamos começar com a função básica de um trayicon. Para

esconder a sua aplicação você deve executar o método Hide decada formulário visível. Isto removerá automaticamente o íconeda sua aplicação da barra de tarefas do Windows. O comandoApplication.Minimize pode opcionalmente ser chamado também,mas note que resultará em uma animação do formulário queestá sendo minimizado para a barra da tarefa.

É importante que você esconda os formulários a partir doformulário principal, e restaure os formulários na ordem inversa.Isto irá assegurar que a ordem esteja preservada ao restaurarsua aplicação. Isto é muito importante ao tratar os formuláriosmodais.

Veja na listagem 1 a rotina que utilizaremos para esconder osformulários de nossa aplicação.

procedure TFRM_TrayIcon.Esconde;var i: integer;

begin Application.Minimize; for i := 0 to Screen.FormCount - 1 do Screen.Forms[i].Hide;end;

Listagem 1: Exemplo para esconder a aplicação

Para restaurar a aplicação nós podemos utilizar a rotinamostrada na listagem 2.

procedure TFRM_TrayIcon.Restaura;var i: integer;begin for i := Screen.FormCount - 1 downto 0 do Screen.Forms[i].Show; with Application do begin Restore; BringToFront; end;end;

Listagem 2: Exemplo para restaurar a aplicação

Utilizando um menuAdicionar um menu ao nosso componente trayicon é muito

fácil. Para obter este recurso basta adicionar um componenteTPopupMenu, que está na palheta Stantard, ao formulário eatribuí-lo à propriedade de PopupMenu do componente TrayIcon.

Feito isto, agora vamos adicionar dois itens em nossocomponente TPopupMenu. Um para restaurar e outro para sairdo programa. Sendo assim, inclua dois itens um com o nomeRestaura e outro com o nome Sair.

No evento OnClick do item Restaura nós vamos chamar anossa procedure Restaura, como está sendo mostrado nalistagem a seguir.

Page 12: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

12

Delphi

procedure TFRM_TrayIcon.R1Click(Sender: TObject);

begin Restaura;end;

No evento OnClick do item Sair nós vamos encerrar a nossaaplicação como está sendo mostrado na listagem a seguir.

procedure TFRM_TrayIcon.Sair1Click(Sender: TObject);

begin Application.Terminate;end;

Agora execute novamente a sua aplicação. Vá até o ícone dasua aplicação que está ao lado do relógio e clique com o botãodireito. Ao fazer isto você verá os dois itens do componente deTPopupMenu. Basta clicar sobre eles para realizar os testes.

Trabalhando com imagensPor padrão, o ícone utilizado pelo componente TrayIcon é o

ícone da própria aplicação, mas você pode carregar um outroícone através da propriedade Icon ou ainda utilizar umcomponente ImageList ajustando um valor apropriado para apropriedade de IconIndex.

Se você estiver usando um componente ImageList você pode,ainda, animar os ícones ajustando a propriedade Animate docomponente TrayIcon para True. Isto fará com que cada ícone nalista do componente TImageList seja indicado por sua vez. Vocêainda pode controlar a velocidade desta animação através dapropriedade AnimateInterval.

Trabalhando com HintsA utilização do hint é muito fácil. Atribua algum texto a

propriedade hint e esse texto será apresentado quando o usuáriopausar o cursor do mouse sobre o ícone que está no relógio. Se apropriedade Hint estiver vazia então o título da aplicação serámostrado. Se você não sabe como mudar o titulo da sua aplicaçãofaça o seguinte. Vá até o menu do Delphi e clique em Project edepois em Options. Na próxima tela, clique no item Applicationque estará sendo mostrado do seu lado esquerdo. Do lado direitovocê tem a opção Title. É ali que fica armazenado o título da suaaplicação. Atenção, o Windows limita o tamanho máximo destecampo em 127 caracteres.

Trabalhando com balões de avisoUm recurso bastante interessante é a utilização de avisos. Eu

consegui utilizar este recurso a partir do Windows 2000. Você já

deve ter visto alguma aplicação que indica sugestões através deum hint de balão. Uma vez que um balão é mostrado para ousuário ele pode fazê-lo desaparecer. Se um usuário não clicarsobre que o balão, o mesmo desaparecerá automaticamente apósum determinado tempo. Se o computador estiver inativo, então obalão permanecerá visível até que o usuário comece usar ocomputador outra vez. O intervalo de parada pode ser ajustadopela aplicação, mas o Windows reforça os valores mínimos emáximos que são ajustados tipicamente entre 10 e 30 segundos.

Para fazer com que este aviso seja mostrado é muito simples,veja abaixo o código que estou utilizando no projeto de exemploque você poderá fazer o download.

procedureTFRM_TrayIcon.bt_MostraClick(Sender:TObject);begin // Aqui definimos o icone a ser mostrado if rbErro.Checked then TrayIcon1.BalloonFlags := bfError else if rbInfo.Checked then TrayIcon1.BalloonFlags := bfInfo else if rbAviso.Checked then TrayIcon1.BalloonFlags := bfWarning else if rbNulo.Checked then TrayIcon1.BalloonFlags := bfNone; // Aqui configuramos as informações // e mostramos a mensagem TrayIcon1.BalloonTitle := edTitulo.Text; TrayIcon1.BalloonHint :=memMensagem.Lines.Text; TrayIcon1.ShowBalloonHint;end;

Listagem x

ConclusãoEste componente é muito útil e com certeza vai lhe auxiliar

bastante no seu dia a dia.

Download do projeto em: http://www.theclub.com.br/revista/download/TrayIcon0306.zip

Sobre o autorClaudinei Rodrigues,Consultor Técnico do The [email protected]

Page 13: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

13

Visual Studio

Visual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicProdutividade no CódigoProdutividade no CódigoProdutividade no CódigoProdutividade no CódigoProdutividade no Código

Visual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicVisual Studio 2005 e Visual BasicProdutividade no CódigoProdutividade no CódigoProdutividade no CódigoProdutividade no CódigoProdutividade no Código

O Visual Studio 2005 traz diversos controles com recursosinovadores e produtivos, porém a produtividade não para por ai.Muitos recursos relacionados a melhora de produtividade nocódigo fonte foi adicionado trazendo benefícios expressivos aosdesenvolvedores.

Os dois principais recursos são: Code Snippets e Refactory. Code Snippets

Os Snippets são códigos pré-progamados armazenados Principais Vantagens dos Snippets· Maior produtividade do desenvolvedor.· Padronizaçãoo Dentro de equipes de desenvolvimento, é muito comum

cada desenvolvedor programar a sua maneira, com os Snippets é

possível adicionar os padrões específicos de uma empresa e todosos desenvolvedores vão seguir uma codificação única.

Categorias

A imagem abaixo ilustra as categorias de códigos jáadicionados no Visual Studio 2005.

Refactory A refatoração do código é uma prática muito utilizada em

diversas ferramentas e o Visual Studio não poderia abrir mãodeste benefício. O Visual Studio passa a ter esse benefício e isso émuito comemorado pela comunidade .net no mundo todo.

Obs: Nas versões beta é necessário baixar o pacote derefactory (www.msdn.com/vbasic).

Basicamente refatorar o código significa

reescrever um código já programado, porém quenão seguiu as melhores práticas deprogramação, ou que repita mais de uma vezuma funcionalidade idêntica entre outrastécnicas.

A combinação perfeita A combinação entre Code Snippets e

Refatoração é perfeita, podemos ser altamenteprodutivos utilizando os recursos apresentados.Será criado um exemplo de uma aplicaçãosimples para demonstração dos benefíciosapresentados.

A aplicação

Abra o Visual Studio 2005 e crieum projeto do tipo Windows Aplication comVisual Basic.Net. Adicione um novo formulário

chamado frmExemplo conforme a imagem a seguir: Imagem 1 – Categorias já adicionadas.

Page 14: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

14

Visual Studio

A aplicação é bem simples, em um textbox será exibido oconteúdo de um arquivo texto localizado no computador ao clicarno botão Exibir.

Obs: para o textbox aceitar diversas linhas basta alterar a

propriedade multi-line para true. De um duplo clique no botão exibir para a entrada do código.

Após aberto o editor de código, clique com o botão direito do mousedentro do evento click, e clique em Insert Snippet.

Imagem 3 – Code Snippet.

Ao clicar todas as categorias são exibidas conforme mostradona imagem 4.

Selecione a categoria File System e Read Text From File. Pronto, o código de leitura de arquivo texto é adicionado, com

isso é necessário somente complementar o código. Código adicionado:

Private Sub Button1_Click(ByVal sender AsSystem.Object, ByVal e As System.EventArgs)Handles Button1.Click Dim allText As String

Try allText = My.Computer.FileSystem.

ReadAllText(“test.txt”) Catch fileException As Exception Throw fileException End TryEnd Sub

Todo o conteúdo do arquivo texto é passado para a variável

allText, com isso, só devemos adicionar:

TextBox1.Text = allText O valor do caminho é passado diretamente dentro do método

ReadAllText, porém podemos passar esse valor para umavariável com apenas um clique, simples, basta clicar com o botãodireito do mouse sobre o valor Text.txt , Refactor! e IntroduceConstant. Com isso automaticamente é criada uma constantecom o valor, e o parâmetro é alterado:

Private Const STR_Testtxt As String =“test.txt” Private Sub Button1_Click(ByVal sender AsSystem.Object, ByVal e As System.EventArgs)Handles Button1.Click Dim allText As String Try allText =My.Computer.FileSystem.ReadAllText(STR_Testtxt) TextBox1.Text = allText Catch fileException As Exception Throw fileException End Try End Sub

Imagem 4 – Categorias.

Imagem 2 –Formulário

Page 15: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

15

Visual Studio

Altere o valor da variável para um caminho válido dequalquer arquivo texto, execute a aplicação e pronto, a aplicaçãojá está funcionando.

O que podemos concluir: “Digitamos” oito linhas de código,como o mouse. Isso foi um simples exemplo de muitos outroscódigos já contidos no Visual Studio.

Explorando outros recursos de refatoração No mesmo projeto, adicione uma nova classe clExemplo.vb. Crie uma sub simples chamada ExibirMensagem conforme

abaixo:

Public Sub ExibirMensagem(ByVal Nome AsString, ByVal Idade As Integer) MessageBox.Show(“Nome: “ & Nome & “ -

Idade: “ & Idade) End Sub

Adicione outra sub Teste para a chamada da sub, chame

diversas vezes como valores diferentes conforme abaixo:

Private Sub Teste() ExibirMensagem(“Alexandre”, 23) ExibirMensagem(“João”, 45) ExibirMensagem(“Maria”, 53) ExibirMensagem(“Jorge”, 73) ExibirMensagem(“Bill”, 99) ExibirMensagem(“Joaquim”, 2) ExibirMensagem(“Mario”, 28)End Sub

Agora vem a melhor parte, clique com o botão direito do

mouse sobre o parâmetro Nome da sub ExibirMensagem,Refactor, Reorder Parameters conforme abaixo mostrado naimagem 5. Com isso é possível reordenar os parâmetros, cliquecom a seta para direita e com um efeito muito interessante osparâmetros são invertidos conforme mostrado na imagem 6.Para confirmar dê um enter, com isso todas as chamadas da subpassam a ter problema, pois os parâmetros ficam invertidos.Automaticamente é avisado o problema conforme imagem 7.

Duas opções são dadas: Alterar um a um (Enter) ou todos(Ctrl + Enter), e com isso todas as chamadas podem seralteradas. Imagine isso em um projeto com chamadas emdiversos formulários!?

Para criar um overload da sub ExibirMensagem é muitosimples, clique com o botão direito do mouse sobreExibirMensagem, Refactor! e Create Overload. Confirme com um

enter e já é duplicado o código solicitado. Conclusão A produtividade no código está muito maior com esses dois

recursos principalmente combinando a utilização deles, use eabuse dessas facilidades e consiga uma produtividade e qualidademuito maior em suas aplicações.

Imagem 5 – Instruções de refatoração.

Imagem 6 – Parâmetros invertidos.

Imagem 7 – Parâmetros invertidos na chamada.

Page 16: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

16

Criando arquivo de instalaçãoCriando arquivo de instalaçãoCriando arquivo de instalaçãoCriando arquivo de instalaçãoCriando arquivo de instalaçãopara projeto Web (Windows Installer)para projeto Web (Windows Installer)para projeto Web (Windows Installer)para projeto Web (Windows Installer)para projeto Web (Windows Installer)

Visual Studio

Quando me deparei desenvolvendo minha primeira aplicaçãoWeb, uma das minhas preocupações foi pensar em como iriadistribuií-la entre meus clientes, uma vez que a instalação de umWebSite implicaria em Configurar o IIS (Internet InformatiomService) criando um diretório virtual, dando permissões deexecução entre outras tarefas.

Assim, vou abordar neste artigo, um recurso simples e degrande utilidade para o desenvolvedor que é a criação de arquivode instalação para aplicação web.

Preparativos

Quando formos distribuir uma aplicação seja ela de qualquertipo, WebForms ou WinForms, temos que definir quais osarquivos que realmente são necessários de serem instalados nocliente.

No caso da aplicação web estes arquivos são gerados quando oWeb site é publicado pelo Visual Studio, assim como neste artigoa finalidade é criar apenas uma instalação da aplicação e nãopublicá-la num servidor web, vamos criar um diretório chamadoD:\Arquivos_Instalação onde iremos “publicar” os arquivo querealmente são úteis na instalação.

Para isto na solução web (que no exemplo se chamaTC_Website) clique com o botão direito sobre o projeto e selecionea opção Publish Web Site (Imagem 1).

Na janela Publish Web Site apenas informe o Taget Location(Imagem 2), que é o diretório criado para conter meus arquivoscompilados e outros arquivos como web.config, arquivos de dados,temas e estilos. Ao confirmar este processo veja que no diretórioforam gerados todos os arquivos que deverão ser distribuídos nocliente para o perfeito funcionamento da aplicação.

Criando arquivo de instalaçãoCriando arquivo de instalaçãoCriando arquivo de instalaçãoCriando arquivo de instalaçãoCriando arquivo de instalaçãopara projeto Web (Windows Installer)para projeto Web (Windows Installer)para projeto Web (Windows Installer)para projeto Web (Windows Installer)para projeto Web (Windows Installer)

Por Marcos César Silva

Imagem 2

Imagem 1

Sobre o autorMarcos César Silva, Consultor de Sistemas e ConsultorTécnico do The Club, Bacharel em Ciência da Computação,MCAD (Microsoft Certified Application Developer) eMCSD.NET (Microsoft Certified Solution Developer .NET)[email protected]

Page 17: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

17

Veremos mais à frente que para usarmos em nosso projeto deinstalação estes arquivos compilados de forma que sejamacessíveis ao projeto, devemos adicionar na solução o diretório dearquivos de instalação como um WebSite já existente. Assim emSolution Explorer File selecione Add -> Existing Web Site eselecione o D:\Arquivos_Instalação onde estão os arquivos queacabamos de publicar (Imagem 3). Ao confirmar esta operação oVisual Studio irá exibir uma mensagem informando que vocêdeseja abrir um WebSite pré-compilado, continue confirmandono botão sim.

Imagem 3

O instalador

Agora vamos a criação do projeto de instalação. Para criá-loclique com o botão direito sobre a solução existente em SolutionExplorer File e selecione Add -> New Project , em Project Typesvá em Other Project Types - > Setup and Deployment e Selecionea opção Web Setup Project, em Name informe o nome do novoprojeto onde neste exemplo chamará TC_WebSetup, e emLocation informe o diretório desejado para a criação deste projeto(Imagem 4).

Ao criar o projeto, você observará que um Folder chamadoWeb Application Folder será criado (onde neste caso estaremosvisualizando o File System do projeto), nesta pasta conterá todosos arquivos e pastas de nosso Website.

Veremos agora que temos duas maneiras de relacionar osarquivos ao projeto, a primeira seria selecionado arquivo aarquivo, onde para isto clique com o botão direito do mouse sobrea pasta Web Application Folder e selecione Add - > Web Folder,após criar todas as pastas e subpastas do site, adicione osarquivos que serão publicados nas suas respectivas pastasclicando com o botão direito sobre a pasta Web Application Foldere selecione Add - > File.

Nesta primeira situação que considero menos eficiente e maistrabalhosa, teríamos o problema onde no caso de alteração doprojeto adicionando ou removendo arquivos, o projeto deinstalação ficará desatualizado tendo assim que corrigí-lo a cadamudança do projeto web.

Assim, a maneira que considero mais adequada será osegundo método, que é adicionar ao Web ApplicationFolder um Project OutPut, assim, clique com o botãodireito do mouse sobre a pasta Web Application Folder eselecione Add - > Project OutPut (Imagem 5), aoexibir a caixa de diálogo Add Project Output Group(Imagem 6) selecione em ProjectD:\Arquivos_Instalação.

Desta maneira a cada novo Release de instalaçãoserão lidos sempre os arquivos e pastas que estão nodiretório dos arquivos para instalação, necessitandoapenas que a cada alteração seja “Publicado” nestediretório nosso Website.

Desta forma não teremos que alterar nada noprojeto de instalação, o que não iria acontecer casotivéssemos configurado nosso projeto da primeiramaneira mencionado acima.Imagem 4

Visual Studio

Page 18: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

18

Imagem 5

Imagem 6

Configurações

Para que nossa aplicação funcione perfeitamentenecessitamos configurar pelo menos o Virtual Directory do IIS,para isto selecione a pasta Web Application Folder e em Propertiesna propriedade VirtualDirectory digite TC_WebSite, propriedaderesponsável por indicar o nome do diretório Virtual que serácriado no IIS e o nome do diretório de instalação da aplicação web.

Outras propriedades do instalador podem ser definidas nopróprio projeto assim selecione em Solution Explorer o projetoWebSetup1, veja abaixo algumas propriedades úteis parapersonalizar a aplicação. (ver tabela a seguir)

Podemos também traduzir as mensagens das caixas dediálogo da instalação, para isto com o botão direito no projeto deinstalação selecione a opção View -> User Interface, verá assimtodos os Diálogos de interface do usuário (Imagem 7).

Propriedade Descrição

AddRemoveProgramIcon Define o ícone exibido emAcionar/Remover Programa

Autor Autor da Aplicação

Manufacturer Nome da Empresa

ManufacturerURL URL da Empresa

ProductName Nome do Produto

RestartWWWServiceEspecifica se IIS irá para ereiniciar o serviço nainstalação da aplicação

Title Titulo do instalador

Version Numero da versão daaplicação

Finalmente vamos gerar o instalador, com o botão direito noprojeto clique em Build, após o termino verá que no diretório\Release do projeto de instalação foi criado o arquivo setup.exe.

Conclusão

Observando com maior atenção os recursos disponíveis noVisual Studio para a criação do projeto de instalação, veremosque temos um grande leque de possibilidades na instalação denossas aplicações, mas podemos também observar neste artigo oquanto pode ser simples a criação de um projeto de instalação deuma aplicação web, recurso este simples, mas de grande utilidadepara o desenvolvedor.

Vou ficando por aqui, um abraço a todos e até o próximoartigo.

Imagem 7

Visual Studio

Page 19: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

19

Delphi, uma questão deDelphi, uma questão deDelphi, uma questão deDelphi, uma questão deDelphi, uma questão desobrevivênciasobrevivênciasobrevivênciasobrevivênciasobrevivência

Delphi

Delphi, uma questão deDelphi, uma questão deDelphi, uma questão deDelphi, uma questão deDelphi, uma questão desobrevivênciasobrevivênciasobrevivênciasobrevivênciasobrevivência

Salve, salve Delphianos!

Durante uma longa jornada de 11 anos tivemos em nossasmãos o que pode ser chamado de “O ESTADO DO ARTE” dasferramentas de desenvolvimento, o todo poderoso Delphi.

Quantos milhares de projetos foram desenvolvidos com essafantástica ferramenta? Quantos Delphianos nasceram nesteperíodo? Quantas batalhas conquistamos por conta do poder daferramenta? Quantos sorrisos e alegrias ganhamos de clientes,gerentes e diretores após apresentar um nobre projetodesenvolvido com as novas tecnologias que surgiam a cadaversão? Quantas apostas ganhamos de amigos que trabalhavamcom ferramentas concorrentes?

Delphianos ainda temos uma longa batalha pela frente, masvamos relembrar um pouco nosso passado de glórias.

Delphi 1A primeira versão entrou timidamente no mercado, mas aos

poucos foi conquistando seus seguidores. Desde estudantes atégrandes corporações, incluindo aí o Governo Federal, quecorajosamente desenvolveu um dos mais grandiosos projetos domundo: IRPF.

Delphi 2Em 1995 a Microsoft lançou o seu sistema operacional de 32

bits: Windows 95, e logo em seguida a nossa Nave-Mãe, Borland,colocou no mercado a versão 2 do glorioso Delphi, que trazia comoprincipal mudança o compilador para 32bits, além da VCL comnovos controles da API Win32. Novos adeptos e simpatizantesentraram no Clube dos Delphianos!

Delphi 3Já em 1997 tínhamos uma tecnologia em franca expansão:

Internet! Existiam poucas linguagens de desenvolvimento quecontemplavam a tecnologia. Eu utilizava o Perl para gerarscripts CGI (Common Gateway Interface). Minhas aplicaçõeseram executadas em sistemas operacionais baseados em UNIX.Sinceramente eu achava o máximo ver meu banco de dados naWeb, mas um pouco incomodado com a falta de recursos e umaIDE completa para facilitar o ciclo de desenvolvimento.

Eis que surge a versão 3 do Delphi (meados de 1997), comuma grata surpresa: WebBroker, uma das mais fantásticastecnologias para desenvolvimento de aplicações Web. Até hojesurgem tecnologias baseadas em WebBroker. Sensacional!

Delphi 4O número de Delphianos não parava de crescer, assim como

os milhares de sites especializados. Em meados de 1998, foilançada a versão 4 da ferramenta, com pequenas mudanças. Naépoca alguns engraçadinhos previam o fim da hegemoniaBorland.

Estavam completamente enganados. A energia positivailuminava a criatividade dos engenheiros da Nave-Mãe, quesurpreendiam o mundo com grandes novidades, conquistandouma grande parcela de simpatizantes e uma excelente posição noranking das maiores empresas de software do mundo.

Delphi 5Dessa energia surgiu uma das mais estáveis e produtivas

versões: Delphi 5 (minha preferida). Com forte melhoria natecnologia Midas (presente desde a versão 3), o suporte ao ADO ea estabilidade do WebBroker.

Delphi 6Em 2001, quase 2 anos após o lançamento da versão 5,

estréia no mercado a versão 6, com dezenas de novidades: nova

Page 20: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

20

Delphi

IDE, DataSnap, WebSnap e BizSnap, debugger integrado paraaplicações Web, entre outras. Realmente foi um grande salto,mas haviam alguns problemas que incomodavam odesenvolvedor.

A Borland trabalhou rápido, corrigindo alguns bugs,investindo em novos componentes e parceiros, e lançou o todopoderoso Delphi 7.

Delphi 7Sete, um número místico, ideal para a nova versão, que

trazia consigo o revolucionário Intraweb, encorajando a todosadentrarem o mundo Web. Além disso, disponibilizou uma novaferramenta para criação de relatórios, o Rave Reports. Outragrande novidade despertou o interesse de muitos: NET Preview.Sim, a Borland disponibilizou uma ferramenta integrada à IDE,que compilava Delphi Language para plataforma .NET. Eraapenas o começo.

Delphi 8Eis que surge a versão 8 for .NET. Isso mesmo Delphi 8 for

.NET. Totalmente remodelada com centenas de novidades na IDEe o suporte total à plataforma .NET. Imagine desenvolveraplicações .NET com uma linguagem que você domina!?Imaginou? Pois bem, a ferramenta não decolou! Haviam dezenasde problemas, a barreira da nova plataforma, entre outrasbarreiras.

Delphi 2005Seria a salvação? Pelo menos a Borland agilizou e criou

(ressucitou) o BDS (Borland Developer Studio) integrando aslinguagens Delphi Language, C# e VB.Net (para algumassoluções). Isso mesmo: VB.Net. Ok, mas esta não é a questão. Aquestão aqui é que o Delphi estava perdendo grande terreno paraas outras tecnologias (Java e .Net).

Sinceramente pensei que a versão 2005 daria a volta porcima e conquistaria novamente os Delphianos. Infelizmente issonão aconteceu! Mas a batalha continuou...

Delphi 2006Com grande alarde o Delphi 2006 foi lançado. Dezenas de

novas features, uma nova implementação da tecnologia ECO,melhorias no compilador, correções na IDE, entre outros recursosinteligentes.

Ao meu ver o único problema é que a implementação .Netcontempla apenas a versão 1.1 da tecnologia, sendo que a 2.0 comcentenas de novos recursos já está quente na ferramentaconcorrente. Além disso não foi implementado de maneira plena o

C.F. (Compact Framework), que segundo a Borland não foilicenciado pela Microsoft.

Ok Delphianos, fizemos um rápido passeio entre as versões,mas uma questão ainda assombra o nosso mercado. Será que oDelphi irá sobreviver?

Com o anúncio da Borland sobre a possível venda das IDEspara outra empresa, assustou ainda mais o mercado. Geroudúvidas em todos os Delphianos. Seria esse o fim do Delphi?Sinceramente não vejo desta forma, já que a Borland irácontinuar com parte do controle dessa nova empresa, além determos que garantem a constante atualização das ferramentas.

Obviamente não teremos a Microsoft dentro desse grupo, porquestões éticas e pela saudável concorrência no mercado. Agoraimagine se um gigante como o Google (houve especulação nomercado) adquire parte dessa nova empresa? Ou então umaIBM, eterna concorrente Microsoft?

Bem, como todos vocês sabem, prefiro o Visual Studio 2005por diversas razões:

. trabalha com .net framework 2.0 . estável . compact framework . fácil implantação de sistemas . custos . mercado . curva de aprendizado muito pequena . entre outras.

Mas o que poucos sabiam é que eu nunca irei abandonar oglorioso Delphi, que aliás ainda sustenta esse que vos escreve.

Finalizando, vale a dica: estudem framework 2.0, conheçam oVisual Studio 2005, trabalhem com a linha Express do VS,explorem todo o potencial do .Net, dominem o C#, e se tiveremcoragem como eu, estudem também Visual Basic .Net. Omercado está aí, esperando por você!

Forte abraço e muito sucesso!

Facunte.

Sobre o autorEmerson Facunte, é Consultor de Tecnologia com diversoslivros publicados, especialista em desenvolvimento deaplicações e-business. [email protected]

Page 21: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

21

Delphi

Durante o desenvolvimento de uma aplicação qual odesenvolvedor não se deparou com a duvida de saber qualgerador de relatório iria utilizar?

Diversas vezes fui questionado por amigos desenvolvedoresme pedindo sugestões sobre boas ferramentas geradoras derelatórios, quando começava a falar o nome de algumas comoReportBuilder, CristalReport entre outras, vinha a segundapergunta que era: Estas “Estas ferramentas são free?” E quandodizia que “não” já esperava ao reação de desaprovação de meuscolegas desenvolvedores, assim muitos deles continuavam autilizar o QuickReport. Bom, alguns de vocês devem estarpensando: “Mas também posso utilizar o Rave Report a partir doDelphi 7”, realmente quem está pensando isto têm razão, masobservei que algumas pessoas que já estava acostumado autilizar o QuickReport tinham dificuldade de se adaptar comRaveReport e continuavam a utilizá-lo mesmo reclamando dafalta de alguns recursos ou de outros problemas.

Algum tempo atrás tive contato com uma ferramenta que mechamou a atenção, com o conceito de trabalho e interface basteparecido com o nosso bom e velho Quickreport, esta ferramentageradora de relatório chamada FortesReport da empresa FortesInformática, nos mostra ser uma boa opção, por possuir umReport Designer de desenvolvimento bastante familiar e recursoe filtros bastante interessantes e úteis nos quais veremos mais aseguir.

1. A instalação

O ForteReport pode ser baixando do site do fabricantewww.fortesreport.com.br, sugiro também baixar o Help do pacoteque contém os arquivos no formato windows hlp para oFortesReport, inclusive com o instalador do help.

Verá que na área de downloads existe 2 versões disponíveis do

pacote, para algumas das versões do Delphi VCL ou CLX,C++Builder ou Kylix, para nossos exemplos iremos baixar aversão 3.23 para Delphi 7 VCL.

A instalação é bastante simples, para isto siga os seguintespassos:

Agora chame o seu Delphi. Aqui nós vamos trabalhar noDelphi 7. Estando com o seu Delphi aberto, vá até o menu Tools -> Environment Options e clique na aba Library como mostradona figura a seguir:

Por Marcos César Silva

Fortes Report - Uma boa opção deFortes Report - Uma boa opção deFortes Report - Uma boa opção deFortes Report - Uma boa opção deFortes Report - Uma boa opção degerador de relatório Freewaregerador de relatório Freewaregerador de relatório Freewaregerador de relatório Freewaregerador de relatório Freeware

Fortes Report - Uma boa opção deFortes Report - Uma boa opção deFortes Report - Uma boa opção deFortes Report - Uma boa opção deFortes Report - Uma boa opção degerador de relatório Freewaregerador de relatório Freewaregerador de relatório Freewaregerador de relatório Freewaregerador de relatório Freeware

Clique no botão que fica ao lado direito do item Library Pathpara que possamos incluir o caminho onde foi descompactado ocomponente. Ao clicar no botão você verá uma tela igual àmostrada a seguir:

Page 22: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

22

Delphi

Informe o path como foi mostrado na tela anterior e depoisclique no botão Add e depois em Ok.

Agora vamos adicionar o componente.Agora volte ao menu do Delphi em Component -> Install

Packages. Feito isto você terá uma tela semelhante a seguir:

Clique no botão Add e vá até o diretórioD:\Comps\RLibD7vcl.3.23 e localize o arquivoRLibWinD7vcl.bpl. Depois de selecionar o arquivo clique nobotão Open e depois no botão OK.

Pronto o seu componente já está instalado.

2. Visão geral dos componentes

2.1. Bandas

· RLReportO componente RLReport contém as definições do relatório e

também é o Container de componentes de impressão do pacote

· RLBandBanda de impressão que para representar registros de dados

ou quebras de seqüências de dados, uma característicainteressante é que a banda além de pode ser deve inserida dentrode um Report, também pode ser colocada dentro de outrasbandas do tipo Group ou SubDetail. Sendo o comportamento dabanda controlada a partir da propriedade BandType.

· TRLBandType(btHeader, btTitle, btColumnHeader, btDetail,

btColumnFooter, btSummary, btFooter);

· RLDetailGridBanda semelhante a uma banda detalhe, mas com a

característica de impressão de colunas;

· RLGroupBanda de quebra de grupos de impressão;

· RLSubDetailBanda para impressão de Subdetalhes;

2.2. Componentes de Texto

Page 23: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

23

Delphi

· TRLLabelCaixa de texto padrão;

· TRLDBTextCaixa de texto ligada a campo de dataset;

· TRLMemoCaixa de texto multilinhas;

· TRLDBMemoCaixa de texto multilinhas ligada a campo de dataset;

· TRLAngleLabelCaixa de texto, onde o texto pode ser rotacionado no ângulo

desejado;

· TRLRichEditCaixa de texto multilinhas em formato de texto RTF;

· TRLDBRichEditCaixa de texto multilinhas em formato de texto RTF ligada a

campo de dataset;

2.3. Filtros de Impressão

· RLDraftFilterImplementação do filtro de impressão draft.

· RLRichFilterImplementação do filtro para geração de arquivos no formato

RichText.

· RLHTMLFilterImplementação do filtro para criação de páginas web.

· RLPDFFilterImplementação do filtro para criação de arquivos PDF.

· RLXLSFilterImplementação do filtro para criação de planilhas do Excel.

3. Exemplo

3.1. Os dados

Primeiramente antes de começarmos a trabalhar com oscomponentes do pacote gerador de relatórios iremos criar oscomponentes de acesso a dados, assim após criarmos um novoprojeto no delphi em File | New | Application, adicione doisClientDataSets e dois DataSources no form principal criado nacriação do projeto. Como neste artigo não tenho intenção deexplorar a conexão com o banco de dados, vou criar um simplesrelacionamento mestre detalhe entre arquivos XML, usando osClientDataSets com os arquivos Customer.xml e Orders.xml queencontram-se no diretório C:\Arquivos de programas\Arquivoscomuns\Borland Shared\Data\, veja abaixo as propriedadesconfiguradas dos componentes:

ClientDataSet 1 (Mestre)

DataSource 1

Propriedade Valor

Name cdsMaster

FileNameC:\Arquivos de programas\Arquivoscomuns\Borland Shared\Data\customer.xml

IndexFieldNames CustNo

Propriedade Valor

Name dsMaster

DataSet cdsMaster

Propriedade Valor

Name cdsDetalhe

FileNameC:\Arquivos de programas\Arquivoscomuns\BorlandShared\Data\orders.xml

IndexFieldNames CustNo

MasterSource dsMaster

MasterFiels CustNo

Active True

ClientDataSet 2 (Detalhe)

Page 24: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

24

Delphi

Propriedade Valor

Name dsDetalhe

DataSet cdsDetalhe

DataSource 2

3.2. O Relatório

Agora sim vamos aos componentes do relatório, no formadicione um component RLReport e altere as seguintespropriedades:

RLReport1

Propriedade Valor

DataSource dsMaster

Title The Club - Usando Fortes Report

Dentro deste componente adicione um RLBand que será ocabeçalho, para que ele se comporte assim altere sua propriedadeBandType para btHeader, nele adione os RLlabel para exibirmoso cabeçalho desejado. Adicione mais uma RLBand no RLReport,observe que a propriedade BandType desta banda está comobtDetail, assim ela irá listar todos os registros da tabela Mestre.

Continuando no componente RLReport adicione umRLSubDetail e altere as seguinte propriedades:

RLSubDetail1

Propriedade Valor

Margins | LeftMargin 10

DataSource dsDetalhe

Dentro da banda RLSubDetail adicione duas bandasRLBand onde a primeira será a banda responsável por exibir osregistros da tabela detalhe, logo onde deverão ser inseridos oscomponentes de texto, a segunda banda será a banda de sumarioonde iremos totalizar o valor dos registros detalhes impressospara cada registro mestre, assim altere a propriedade BandTypedesta ultima banda para btSummary.

Veja que estas ultimas duas bandas inseridas dentro dabanda RLSubDetail ficaram alinhadas a partir da margemesquerda definida na banda RLSubDetail. Na banda definidapara ser um sumario adiciono o componente RLDBResult1,

responsável por somar os valores da coluna desejada, e altere asseguintes propriedades:

Propriedade Valor

Propriedade Valor

DataSourde dsDetalhe

DataField AmountPaid

Info riSum

Title Total

MasterFiels CustNo

Active True

RLDBResult1

Finalmente iremos adicionar um botão de preview e inserirno seu evento OnClick a chamada do Preview do componenteRLReport:

procedure TForm1.Button1Click(Sender:TObject);begin RLReport1.Preview;

end;

4. Recursos Adicionais

Este gerador de relatório possui diversos outros recursos ecomponentes que ainda não foram mencionados neste artigo,como não seria possível num único artigo comentar sobre todoseles, veja abaixo alguns destes recursos que elegi como sendoúteis e interessante:

4.1. Mensagens Multilíngua

O Fortes Report possui um unit chamada RLConts commensagens definidas em 3 diferentes idiomas estas mensagemestão em variáveis da unit e podem ser alteradas conforme anecessidade veja abaixo algumas destas variáveis (parte databela retirada do site do fabricante).

(ver tabela a esquerda.)

As bandas do FortesReport podem ser adicionadas emFrames (Containers), permitindo assim que todas asconfigurações a características definidas e criadas na banda

Page 25: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

25

Imagem do layout do Relatório

Variável Significado Meaning Signification*

LS_PrintingInProgressStr Imprimindo... Printing... Impression...

LS_PreparingReportStr Preparando o relatório... Preparing report... Préparation du rapport...

LS_PrinterNotFoundStr Não há impressora cadastrada Printer not found Imprimante non trouvée

LS_LoadDefaultConfigStr Será carregada a configuraçãopadrão

Load defaultconfiguration

Chargement de la configurationstandard

Sobre o autorMarcos César Silva, Consultor de Sistemas e ConsultorTécnico do The Club, Bacharel em Ciência da Computação,MCAD (Microsoft Certified Application Developer) eMCSD.NET (Microsoft Certified Solution Developer .NET)[email protected]

possam ser reaproveitadas, permitindo assim termos cabeçalhose rodapés padrão que podem ser reaproveitados em todos nossosrelatórios

4.3. Filtros

Os Filtros permitem salvamos nossos relatórios em diversosformatos de arquivos como RTF, HTML, PDF ou XLS, bastandoapenas incluir o componente de filtro desejado no form doRelatório para que no Preview | Salvar Como..

Tenhamos a opções de salvamento do relatório.

5. Conclusão

Como já foi dito o FortesReport possui diversos outros

recursos a serem explorados, mas já nos mostrou ser um boaopção de gerador de relatório como acredito que puderamconstatar neste artigo, não se esquecendo de lembrar que éfreeware o que é razão de alegria de muitos amigosdesenvolvedores.

Caro amigo leitor um grande abraço e até o próximo artigo

Delphi

Page 26: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

26

Pergunta: Estou tentando compilar um exemplo que pegueino site do The Club,http://www.theclub.com.br/revista/download/AcessandoFirebird.zip e estou recebendo o erro Bad file format:‘C:\Giovani\Acessandofirebird\Firebird.Data.Firebird.dcpil’.Como resolver este problema?

Resposta: Você está recebendo este erro porque esteexemplo foi desenvolvido no Delphi 8. Para resolver, feche oDelphi, delete este arquivo, chame o Delphi novamente e compileo sistema. O problema estará resolvido.

Dúvida enviada por Giovani, Caxias do Sul – RS

Pergunta: Existe alguma forma de fechar todas as tabelasde uma aplicação? Estou utilizando o BDE.

Resposta: Para fechar todas as tabelas, você pode utilizar oobjeto Session, por exemplo:

var i: integer;begin with Session do for i:= 0 to DatabaseCount - 1 do Databases[I].Close;end;

Dúvida enviada por João, Barretos – SP

Pergunta: Preciso verificar se um diretorio existe, se existirmostrar mensagem ao usuario para excluir ou nao o diretorio. Odiretorio será passado por parametro. Preciso tambem de

renomear um diretorio.

Como faço estas duas coisas, pois tentei de varias maneirassem sucesso.

Resposta: Para verificar se o diretório existe, você podeutilizar a função DirectoryExists, o exemplo abaixo verifica se odiretório existe. Caso contrário o diretório é criado.

uses FileCtrl;

procedure TForm1.Button1Click(Sender:TObject);begin if not DirectoryExists(‘c:\temp’) then if not CreateDir(‘C:\temp’) then raise Exception.Create(‘Cannot createc:\temp’);end;

Para deletar o diretorio, você pode utilizar a funçãoRemoveDir, por exemplo:

RemoveDir(‘c:\temp’);

Para renomear um diretório você pode utilizar a rotinaabaixo:

procedure TForm1.Button1Click(Sender:TObject); var f : file;begin AssignFile(f, ‘C:\2’);

Perguntas & Respostas

Page 27: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

27

Perguntas & Respostas

Canvas.TextOut(5, 10, ‘Renomeando C:\2para C:\3’); Rename(f, ‘C:\3’);end;

Dúvida enviada por Bruno, Três Pontas – MG

Pergunta: Existe alguma forma, de pegar o valor docomponente QRExpression do QuickReport. Pois tenho estecomponente para somatório, e estou necessitando utilizar o valorgerado por ele.

Resposta: Para pegar o valor de um QRExpression vocêpode utilizar a instrução QRExpr1.Value.dblResult.

Veja o exemplo abaixo pegando o valor e atribuindo a umQRLabel.

procedure TForm1.QRLabel4Print(sender:TObject; var Value: String); begin Value :=FloatTostr(QRExpr1.Value.dblResult);end;

Dúvida enviada por Alessandro, Araras – SP

Pergunta: Gostaria de ver um exemplo para a criação deaplicações em pacotes.

Há alguma matéria publicada?

Resposta: Nós temos uma matéria a este respeito que podeser acessada no link http://www.theclub.com.br/revista/pacotes.doc.

Dúvida enviada por Rafael, Belo Horizonte – MG

Pergunta: Gostaria de saber como faco para criar umarotina dentro da minha aplicacao onde o proprio usuario possarodar os scripts de atualizacao do sistema(Banco de dados).

Existe algum componente que faca este tipo de execucao,onde eu coloco os scrip sql num arquivo e o componente executa omesmo.

Resposta: Para rodar scripts no banco de dados você podeutilizar um componente chamado SQLScript que pertence aoDBExpressPlus.

O DBExpressPlus é uma suíte de componentes gratuítos quefacilitam a execução de tarefas comuns no dia-a-dia doprogramador Delphi.

Você poderá fazer o download do DBExpressPlus no seguinteendereço:

http://sourceforge.net/projects/dbexpressplus

A instalação é bastante simples, basta descompactar oarquivo baixado preferencialmente criando uma pasta em$(Delphi)\Source\dbExpressPlus, onde “$(Delphi)” indica apasta de instalação de seu Delphi.

Após isso, abra o pacote dbExprPlus_r?0.dpk (?=versão doDelphi, 6 ou 7) e clique no botão “Compile”.

Continuando, abra o pacote dbExprPlus_d?0.dpk, clique em“Compile” e depois em “Install”.

Para concluir, acesso o menu “Tools | Environment Options| Library | Library Path” e adicione o path onde os arquivosforam descompactados, ou seja,$(Delphi)\Source\dbExpressPlus e com isso finalizamos ainstalação do dbExpressPlus.

Se tudo ocorreu sem problemas, você poderá visualizar osnovos componentes na paleta de componentes dbExpress.

Para conhecer as funcionalidades de todos os componentes,você poderá abrir o projeto de exemplo que acompanha odbExpressPlus, podendo ser encontrado na pasta Demo($(Delphi)\Source\dbExpressPlus\Demo).

Dúvida enviada por Sebastião, Salvador – BA

Pergunta: Por favor, necessito pegar a tabela de Nota/ItemFiscal e envia-los para um cliente no formato xml. Como façopara gerar um arquivo xml a partir do delphi?? Vocês teriamalgum projeto exemplo para me enviar????

Resposta: Nós temos duas matérias sobre este assunto quepodem ser localizadas em nossa Home page nos links:

http://www.theclub.com.br/revista/tran0403.aspx:http://www.theclub.com.br/revista/tran0503.aspx.

Duvida enviada por Wagner, Campinas - SP

Page 28: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

28

Dicas & Truques

Problemas para executar aplicações ASP.NET comDelphi 2005.

Aparece a mensagem Unable to attach to ASP.NET workerprocess (typically aspnet_wp.exe or w3wp.exe)”.

Para resolver o problema basta registrar o .NET frameworkpara o IIS.

Abra a caixa de dialogo Executar (Clique no botão Iniciar, eExecutar), digite o texto abaixo e clique no botão OK:

c:\windows\microsoft.net\framework\v1.1.4322\aspnet_regiis.exe -i

Pronto, feche o Delphi 2005 e compile o sistema novamente.

Arredondar casas decimais de formapersonalizada

Na seção de procedures digite:

Function Arredondar(value: double;casas : integer): double;

Na seção implementation digite a função conforme descritaabaixo.

Function Tform1.Arredondar(value:double;casas : integer): double;Var fracao, Total:real;decimal:string;begintryfracao:=Frac(value); //Retorna a partefracionária de um númerodecimal:=(RightStr(floattostr(fracao),length(floattostr(fracao))-2)); //decimalrecebe a parte decimal//enquanto o tamanho da variavel decimal formaior que o número de casas façawhile length(decimal) > casas dobegin//Verifica se o último digito da variáveldecimal é maior que 5if strtoint(RightStr(decimal,1))>5 thenbegin//Descarta o último digito da variávelDecimaldecimal:=leftstr(decimal,length(decimal)-1);//Soma o valor número da variavel decimal + 1decimal:=floattostr(strtofloat(decimal) + 1);endelsedecimal:=leftstr(decimal,length(decimal)-1);//Descarta o último digito da variável

Page 29: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

29

Decimalend;result:=(int(value) + (strtofloat(decimal)/100)); //devolve o resultado para a funçãoexceptRaise Exception.Create(‘Erro noarredondamento’);end;end;

Como usar...

arredondar(Campo ou vaiável do tipo Real (Float) , númerode casas decimais desejado);

Ex:Var valor,Resultado:real;Valor:=10.005.526Resultado :=Arredondar(valor,2);Resultado=10.005,53

Obs: O codigo foi escrito em Delphi 6 porém isso não a impedede funcionar no Delphi 4 ou 5, é pouco provavel que ocorra erro.

Verificar o estado de uma tabela

procedure CheckState(ATable: TTable);varstrMessage : String[25];wrdMessageResult : word;beginATable.UpdateRecord; { Atualiza a tabela semgravar }if ( ATable.Modified ) and( ATable.State <> dsSetKey ) thenbeginif ATable.State = dsEdit thenstrMessage := ‘Editando registro, ‘;if ATable.State = dsInsert thenstrMessage := ‘Inserindo registro, ‘;

wrdMessageResult := MessageDlg(strMessage+‘as informações que ainda não ‘+‘foram salvas serão perdidas!’+#10+‘Salva as informações ?’, mtConfirmation,[mbYes,mbNo,mbCancel],0);case wrdMessageResult ofmrCancel: Abort;

mrYes : ATable.Post;mrNo : ATable.Cancel;end;endelseATable.Cancel;end;

Verificando se um alias está instalado

varvList: TStringList;x: Integer;beginvList := TStringList.Create;Session.Open;Session.GetAliasNames(vList);if vList.Find(‘NomeDoAlias’, x) then // xreceberá a posição do alias na lista// Alias encontradoelse// Alias não encontradoend;

Que usuário está logado na rede?

Existe na API do BDE uma funcao chamadaDbiGetNetUserName, que retorna o nome do usuário logado.

Tente o seguinte:

function GetUserName:string;varNome: array[0..64] of char;beginif DbiGetNetUserName(Nome) <> DBIERR_NONEthen Nome:=’’;Result:=StrPas(Nome);end;

Usando Locate com mais de um campo

Use VarArrayOf() no segundo parâmetro.

Return := Table1.Locate(‘Campo1;Campo2’,VarArrayOf([Campo1, Campo2]), []);

Dicas & Truques

Page 30: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria

30

procedure TForm1.Button2Click(Sender:TObject);varvList: variant;beginvList := VarArrayCreate([0, 1], varVariant);vList[0] := ‘Christiansted’;vList[1] := ‘VIP Divers Club’;table1.locate(‘city;company’, vList, []);end;

Testa se a janela está abertaTesta se a janela ja foi criada.Obs.: Coloque no evento OnCreate do form:

if IsWindowInMemory (Self.Caption) then

-----------

Halt;

function IsWindowInMemory (WndTitle : String): Boolean;varhSem : THandle;hWndMe : HWnd;beginResult := False;hSem := CreateSemaphore (nil, 0, 1,‘NomeDoSemaforo’);

if (hSem <> 0) and (GetLastError() =ERROR_ALREADY_EXISTS) thenbeginCloseHandle (hSem);hWndMe := FindWindow (nil, PChar (WndTitle));SetWindowText (hWndMe, ‘olzfgowtjoyug’);hWndMe := FindWindow (nil, PChar (WndTitle));

if hWndMe <> 0 thenbeginif IsIconic (hWndMe) thenbeginShowWindow (hWndMe, SW_SHOWNORMAL);endelsebegin

SetForegroundWindow (hWndMe);end;end;Result := True;end;end;

Verificar se o programa já está aberto

program Project1;

usesForms,Windows,Unit1 in ‘Unit1.pas’ {Form1};

{$R *.RES}

// Declare a variavelvarHwnd : THandle;

begin// FindWindow vai procurar pela classeTApplication// que tenha o nome do Title que vcconfigurouHwnd := FindWindow(‘TApplication’, ‘Teste’);// se o Handle e’ 0 significa// que nao encontrou

if Hwnd = 0 thenbegin

Application.Initialize;// Esta linha e’ colocada automaticamentepelo Delphi// ao se configurar o TitleApplication.Title := ‘Teste’;Application.CreateForm(TForm1, Form1);Application.Run;endelse

// Esta funcao traz para frente (da o foco)// para a janela// da aplicacao que ja esta rodando

SetForegroundWindow(Hwnd);end.

Dicas & Truques

Page 31: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria
Page 32: Editorial - The Club · Marcelo Nogueira, Mário Bohm, Aguinaldo P. Silva EDITORIAL Editorial ... Fortes Report - Uma boa opção de gerador ... Começamos pela segunda parte da matéria