Mostrando postagens com marcador Delphi. Mostrar todas as postagens
Mostrando postagens com marcador Delphi. Mostrar todas as postagens

quarta-feira, 9 de novembro de 2011

Data por extenso

Ola pessoal!


Uma sacada bacana que eu aprendi outro dia com um amigo.

Pra gerar a data por extenso eu utilizava uma função, mas esse amigo me mostrou uma grande sacada que a Borland fez ;-)

Em apenas uma linha você obtém a data por extenso: FormatDateTime('dddddd',now);

Os incríveis 6 (d)'dês" retornam a data por extenso sem precisar de nenhuma função adicional.


Abraços, Emanuel

terça-feira, 8 de novembro de 2011

Problema com o arquivo midas.dll

Ola pessoal


Estava com esse problema a uma semana, sofrendo pra saber o porque.

Peguei o arquivo na internet. Coloquei na pasta Systems do Windows. No home do projeto. Em tudo que é lugar :-s

Até que li um post em um blog (desculpe! mas não me lembro o nome) que me salvou a vida.

O blog dizia o seguinte:

A partir do Delphi 6, sempre que vocês utilizam ClientDataSet - ele requer a biblioteca midas.

Pra vocês não sofrerem que nem eu ;-) No USES da interface adicione a biblioteca MidasLib. NÃO usem o arquivo midas.dll. Pelo menos pra mim não funcionou.


Abraços

terça-feira, 25 de outubro de 2011

Passagem de parâmetros para o Rave Project.

Sua aplicação deve estar já configurada e funcionando ao gerar o relatório.

Dentro do Rave Report, selecione no Tree Panel, o RaveProject.
E no Object Inspector, selecione a opção Parameters e clique no botão de assistente com os 3 pontinhos (...)
Abrira a janela Strings Editor, dentro desta janela coloque os parâmetros que deseja receber do Delphi.
Clique em OK



Adicione algun(s) Data Text, dependendo da quantidade de parâmetros que ira receber.
Selecione a propriedade DataField e clique no assistente, botão com 3 pontinho (...).
Abrira a janela Data Text Editor, na opção Project Parameters escolha um parâmetro e clique em Insert Parameter.
Clique em OK



 O Rave ja esta pronto para receber os parâmetros.

Agora! dentro do Delphi, no seu código, insira o seguinte código antes da linha de RaveProject1.Execute


//Seta o Parâmetro valortotal
RvProject1.SetParam('ptotal',FormatFloat('#,##0.00',valor_total));

//Seta o Parâmetro dataatual
RvProject1.SetParam('ptotal',FormatDateTime('dd/mm/yyyy',data));
//Executa o rave
RvProject1.Execute;

segunda-feira, 24 de outubro de 2011

Formatações mais usadas.

Boa tarde Pessoal,


Atendendo a alguns pedidos, segue abaixo as formatações que eu mais utilizo no Delphi.


Para moeda - utilizo para formatação de campo numero no rave project, Ztable, ZQuery, ADOTable a ADOQuery
  R$ #,##0.00


Para horario - utilizo em campo date/time (comum no Access) no rave project.
  hh:nn:ss


Para data - este é a mascara para o componente MaskEdit.
  !99/99/0000;1;_



Para data - este é a formatação para função FormatFloat. Comum quando trabalhamos com banco dados MySQL.
  'yyyy-mm-dd' ou 'dd/mm/yyyy'


Espero ter ajudado alunos,

Abraços, Emanuel

domingo, 23 de outubro de 2011

Criando PDF com Rave Report.

Ola


Como criar um arquivo PDF no Rave Report e abri-lo. Tenho que chamar atenção de vocês a um pequeno detalhe: utilizo a função ShellExecute para abrir o arquivo pdf, então temos que adicionar a biblioteca ShellAPI no USES.


procedure Tfrm_form1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var 
  Pdir: Pchar;
begin
    if (key = VK_F4) then
      begin
         dm.Query_bancos.Close;
         dm.Query_bancos.Open;
         RvSystem1.SystemSetups := RvSystem1.SystemSetups - [ssAllowSetup];
         RvSystem1.DefaultDest := rdFile;
         RvSystem1.DoNativeOutput := false;
         RvSystem1.RenderObject := RvRenderPDF1;
         RvSystem1.OutputFileName := 'C:\tmp.pdf';
         RvProject1.Execute;
         //ABRINDO O ARQUIVO PDF CRIADO
         GetMem(pDir,256);
         StrPCopy(pDir, 'C:\tmp.pdf'); {Aqui vc coloca o caminho + o nome do arquivo}
         ShellExecute(0, nil, 'tmp.pdf', nil, Pdir, SW_NORMAL);
         FreeMem(pdir,256);
        end;
       end;
end;

sexta-feira, 14 de outubro de 2011

Evitando digitação de virgula em componente Edit - Delphi

Procedimento para serem  usados em um componente Edit para evitar a digitação de virgula e só aceitar números.

No seu componente Edit coloque os dois códigos nos eventos OnChange e OnKeyPress.

procedure Tfrm_formulario.edt_valorChange(Sender: TObject);
var
  s:string;
  v:double;
  I:integer;
begin
  //1º Passo : se o edit estiver vazio, nada pode ser feito.
If (edt_valor.Text = emptystr) then
edt_valor.Text := '0,00';

  //2º Passo : obter o texto do edit, SEM a virgula e SEM o ponto decimal:
s := '';
for I := 1 to length(edt_valor.Text) do
if (edt_valor.text[I] in ['0'..'9']) then
s := s + edt_valor.text[I];

//3º Passo : fazer com que o conteúdo do edit apresente 2 casas decimais:
v := strtofloat(s);
v := (v /100); // para criar 2 casa decimais

//4º Passo : Formata o valor de (V) para aceitar valores do tipo 0,10.
edt_valor.text := FormatFloat('###,##0.00',v);
edt_valor.SelStart := 0;

end;

procedure Tfrm_formulario.edt_valorKeyPress(Sender: TObject;
  var Key: Char);
begin
   if NOT (Key in ['0'..'9', #8, #9, #13]) then
   begin
      key := #0;
   end;
  //Função para posicionar o cursor sempre na direita
  edt_valor.selstart := Length(edt_valor.text);
end;

sábado, 8 de outubro de 2011

Instalação do ZeosLib e RaveProject no Delphi 2010.

Ola,

Recentemente consegui a instalação do Delphi 2010, nada contra o Delphi 7, mas estava curioso de pegar uma IDE mais robusta, mais nova. Pois estou acostumado a programar em Java e as IDEs Eclipse e NetBeans fornece vários recursos que eu sinto muita falta quando estou no Delphi.

Bom! após a instalação do Embarcadero Delphi 2010 (passo o link pra vocês depois), tentei abrir alguns projetos meus e pra minha surpresa ele não vem com o Rave e precisamos instalar o Zeos. Segue abaixo o caminho das pedras.

INSTALAR RAVEPROJECT

1) http://www.4shared.com/file/q-c_JCwa/RaveReports_D2010.html


INSTALAR ZEOSLIB


1 – Faça o download do arquivo zeosdbo-7.0.0-alpha em http://zeos.firmos.at/portal.php

2 – Crie uma pasta chamada zeos7 dentro da pasta lib do rad studio. Por exemplo, meu rad studio está em c:\Arquivos de programas\codegear\rad studio\6.0\lib, então meu diretório base será:  c:\arquivos de programas\codegear\rad studio\6.0\lib\zeos7

3 – Descompacte os arquivos dentro do diretório recem criado no ítem 2.

4 – Com o delphi 2009/2010 aberto, vá em file -open project (ctrl+f11) e abra o arquivo zeosdbo.groupproj, dentro de c:\Arquivos de programas\codegear\rad studio\6.0\lib\zeos7\packages\delphi12

5 – vá ao menu project – build all projects

6 – Antes de continuar, se você estiver usando o Windows Vista ou Windows 7 com o UAC habilitado, você terá que dar permissão total para a pasta zeos7 criada, caso contrário não irá funcionar.

7 – Agora, antes da instalação vá ao menu Tools – Options – Environment Options – Delphi Options – Library – win 32 e adicione o caminho a seguir no Library Path: $(bds)\lib\zeos7\packages\delphi12\build

8 – Feito isto, minimize o delphi, abra o diretório c:\Arquivos de programas\codegear\rad studio\6.0\lib\zeos7\packages\delphi12\build, selecione todos os arquivos “.bpl” copie-os e cole-o dentro da pasta bpl do rad studio: c:\users\public\documents\rad studio\6.0\bpl

9 – Volte ao delphi vá ao menu View – Project Manager (ctrl + atl + f11). Selecione e compile as bpls abaixo, uma a uma. Para compilar, clique com o botão direto sobre o bpl. é a primeira opção(Compile).

– zcore120.bpl
– zplain120.bpl
– zparsesql120.bpl
– zdbc120.blq
– zcomponent120.bpl
– zcomponentdesign120.bpl


10 – Depois de compiladas, clique com o botão direito sobre o pacote ZComponentDesign120.bpl (o único em negrito) e clique em Install.

11 – Pronto, feche tudo (File – Close All). Crie um novo projeto e veja que os componentes já podem ser utilizados.

quarta-feira, 5 de outubro de 2011

Delphi - CheckBox no DBGrid.

Ola Pessoal,

Após um tempo de turbulência no trabalho, mais um post.


Estava desenvolvendo mais um sistema para um cliente e me deparei com uma duvida.
- Criei uma tabela nova pro cliente, com um campo Boolean.
- Coloquei um DBGrid para ele acessar essa tabela (adicionar, remover, editar e excluir).
- E um DBNavigator

Uma tabela simples mesmo, possível de controlar com um DBNavigator. Só que fiquei pensando: Porque eu não coloco um simples CheckBox pro cliente neste campo boolean, pra evitar que ele tenha que ficar digitando FALSE/TRUE. Um clique e pronto!

Vamos ao código pra fazer isso ;-)

1) Crie seu formulário, com o DBGrid conectado a tabela.
2) Selecione o seu DBGrid e acione o evento OnDrawColumnCell.
3) Coloque o seguinte código

procedure Tfrm_tarefas.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Check: Integer;
  R: TRect;
begin
  if Column.FieldName = 'concluido' then //COLOQUE O NOME DA COLUNA, NO MEU CASO 'CONCLUIDO'
  begin
    DBGrid1.Canvas.FillRect(Rect);
    Check := 0;
    if tarefasconcluido.AsBoolean = true then
      Check := DFCS_CHECKED
    else
      Check := 0;
    R:=Rect;
    InflateRect(R,-2,-2); {Diminue o tamanho do CheckBox}
    DrawFrameControl(DBGrid1.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check);
  end;
end;

4) Selecione o seu DBGrid e acione o evento OnCellClick
5) Coloque o seguinte código:


procedure Tfrm_tarefas.DBGrid1CellClick(Column: TColumn);
begin
  tarefas.Edit;
  if tarefasconcluido.AsBoolean = true then
    tarefasconcluido.AsBoolean := false
  else
    tarefasconcluido.AsBoolean := true;
  tarefas.Post;
end;


É isso ai pessoal! Bem simples e fácil

Espero ter ajudado, Abraços

quarta-feira, 20 de julho de 2011

Decodificando Data.

Ola Pessoal,


Atendendo a mais um pedido de um ex-aluno, vamos ver como decodificar uma data no Delphi.

Neste exemplo usarei a função DecodeDate(), mas existem outras formas de fazer a decodificação.
Lembrando que estou utilizando Delphi7.

Vamos a utilização deste em um programa meu:


procedure Tfrm_Formulario.FormActivate(Sender: TObject);
var
  dia, mes, ano:word;
begin
  DecodeDate(Date, ano, mes, dia);
  mske_data_inic.Text := '01/01/'+IntToStr(ano);
  mske_data_final.Text := DateToStr(now);
end;


Espero ter ajudado mais uma vez.

Abraços, Emanuel

quinta-feira, 14 de julho de 2011

Problema em salva ponto flutuante no banco de dados.

Ola pessoal,


Recebi uma duvida de um ex-aluno e achei que seria mais um dica interessante pra colocar aqui.

Acontece muito este problema dependendo da forma como você definiu seu banco de dados ou definiram(o que é comum em grandes empresas, este procedimento ser feito por um DB manager).

Sem controle do banco de dados você pode se deparar com o seguinte problema: Is not a valid floating point value.

Exemplo: "12.345,67 is not a valid floating point value"

Este problema acontece pela simples razão de o DB não aceitar o '.' na variável.

O correto seria 12345,67. Então para resolver isso, utilizo a função StringReplace no Delphi.

valor := '12.345,67';
Exemplo: dm.tabela.FiealdByName('valor').asString := StringReplace(valor,'.','',[rfReplaceAll]);
ShowMessage(valor); // Saida: 12345,67


Isso ai! até a próxima!


Abraços

domingo, 3 de julho de 2011

Inserção em banco de dados com múltiplas interfaces em rede (web, desktop, celular).

Ola pessoal,


Tentando manter um sequência de posts, mas falo para vocês! esta difícil, muito trabalho, sistemas a desenvolver, sites, estudos.

Bom! a ideia deste post me ocorreu após uma conversa com um amigo da área. Para mim é solução fácil mas que as vezes pode complicar para os novatos ou os que não estão acostumados a desenvolver sistemas em rede. Então ai vai!

Primeiro, vamos a descrição do sistema desse meu amigo, talvez se assemalha ao de vocês:

Um servidor dedicado a um Banco de Dados em MySQL.
Uma tabela principal (Ordem de Serviço) que se conecta com varias outras tabelas pelo código.
Então temos uma idéia da estrutura:
TabelaOrdemServico - CampoCódigo, ..., CampoCodCliente, CampoCodMotorista, CampoCodVeiculo;
TabelaCliente - CampoCodCliente, CampoNome, ...;
TabelaMotorista - CampoCodMotorista, CampoNome, CampoRG, ...;
TabelaVeiculo - CampoCodVeiculo, CampoDescricao, ...;
TabelaServicos - CampoCodServico, CampoDescricao, ..., CampoCodOrdemServico.

Como vocês podem perceber o Relacionamento esta definido nos Códigos e estão definidos como  AutoIncremental.

O problema do meu amigo era que várias interfaces (Web, Desktop e Celular) -terminais faziam inserções simultâneas. Ele não sabia como controla os códigos gerados para informar o usuário.

Neste caso eu não faço a exibição do código porque quem define este código é o próprio Banco de Dados. Só o faço no final da inserção.

Quem quiser exibir o código no início. Uma solução é você modificar os campos para não serem AutoIncrementais e fazer com que seu programa gere o código. Mas mesmo assim ocorreram alguns problemas em sistemas de rede.

Meus programas quando exigem a exibição do código na tela inicial, funcionam em duas etapas para controle do código.

Primeiro eu verifico o ultimo registro no banco de dados e exibo para o usuário este ultimo código + 1.
Por exemplo: se tivermos 10 registros, mostro que a próxima inserção sera á 11.
Só que se dois terminais abrirem simultaneamente, os dois exibiram o código 11.

Pra resolver isso temos a segunda etapa:
Os dois terminais estão exibindo o código 11 e quem salvar primeiro, pegara o código. O que acontecerá com o segundo terminal? Temos que estar preparado para esse caso.
Eu desenvolvo atualmente em Delphi então mostro a baixo o meu código.


if (dm.ordem_servico.Locate('codigo',codigo,[])) then
    begin
      Query_pega_ultimo_codigo.Close;
      Query_pega_ultimo_codigo.Open;
      Query_pega_ultimo_codigo.Last;
      ShowMessage('Ordem de Serviço gerado com novo código: '+IntToStr(Query_pega_ultimo_codigo.FieldByName('codigo').AsInteger + 1));
      Query_pega_ultimo_codigo.Close;
    end;

Que ele apenas faz uma verificação, caso tente salvar com código existente, ele informara o usuário que o sistemas salvou com outro código (neste caso o código 12).

É isso ai gente! Simples e rápido ;-) E funcional! O mais importante porque utilizo esta idéia em muitos programas e funciona com vários bancos de dados (access, mysql, postgre, ...).

Espero que eu tenha ajudado os novatos já que programação em rede realmente exige mais atenção do que o usual, mas que com um pouco de prática se supera isso.


Abraços

sábado, 18 de junho de 2011

Colocando mascara de moeda em um MaskEdit - Delphi7.

Algumas vezes é necessário utilizar um MaskEdit com mascara de moeda para manipular os dados antes de serem salvos no Banco de Dados.

Eu recomendo utilizar DBEdit conectado a uma tabela e definir a propriedade Currency do campo como True.
Mais fácil e mais rápido: Componente Table -> Campo (float) -> Propriedade Currency = True.

Mas, como eu disse, caso seja necessário utilizar MaskEdit ai vai a mascara que devem utilizar: R$ 999,99;0;


E caso queiram criar a sua própria mascara para um MaskEdit, ai vai algumas explicações de como utiliza-lo:


A máscara basicamente consiste de três campos, separados por ponto e vírgula. A primeira parte é a máscara propriamente dita.
A segunda parte determina se os caracteres fixos devem ser ou não salvos com a máscara (ex: /, -, (, ...).
A terceira parte da máscara representa o caracter em branco, podendo ser substituído por outro (ex: _, @, ...).

Caracteres especiais utilizados com a máscara:

! Faz com que a digitação da máscara fique parada no primeiro caracter, fazendo com que os caracteres digitados que se movam. Ex: !;0;_

> Todos os caracteres alfabéticos digitados após este símbolo serão convertidos para maiúsculos. Ex: >aaa;0;_

< Todos os caracteres alfabéticos digitados após este símbolo serão convertidos para minúsculos. Ex: <aaa;0;_

<> Anula o uso dos caracteres > e <. Ex: >aaa<>aaa;0;_

\ Utilizado para marcar determinado caractere não especial como fixo, não podendo sobrescrevê-lo. Ex: !\(999\)000-0000;0;_

L Caracteres alfabéticos (A-Z, a-z.) de preenchimento obrigatório. Ex: LLL;1;_

l (Letra ele minúscula) Caracteres alfabéticos (A-Z, a-z.) de preenchimento opcional. Ex: lll;1;_

A Caracteres alfanuméricos (A-Z, a-z, 0-9) de preenchimento obrigatório. Ex: AAA;1;_

a Caracteres alfanuméricos (A-Z, a-z, 0-9) de preenchimento opcional. Ex: aaa;1;_

C Exige preenchimento obrigatório com qualquer caractere para a posição. Ex: CCC;1;_

c Permite qualquer caractere para a posição de preenchimento opcional. Ex: ccc;1;_

0 Caracteres numéricos (0-9) de preenchimento obrigatório. Ex: 000;1;_

9 Caracteres numéricos (0-9) de preenchimento opcional. Ex: 999;1;_

# Caracteres numéricos (0-9) e os sinais de - ou + de preenchimento opcional. Ex: ###;1;_

: Utilizado como separador de horas, minutos e segundos. Ex: !00:00:00;1;_

/ Utilizado como separador de dia, mês e ano. Ex: !99/99/9999;1;_

; Separa os três campos da máscara.

_ Caractere usado normalmente nas posições do campo ainda não preenchidas.



Abraços e até a próxima

sexta-feira, 17 de junho de 2011

Apresentação

Ola!

Estou começando este blog com o intuito de compartilhar meus conhecimentos na programação com outros programadores (que possam eventualmente colaborar, perguntar, etc). E utiliza-lo como uma forma de guardar todo o conhecimento adquirido durante os meus anos de trabalho.

Me formei em Ciência da Computação pela UNIVAP em 2003. De lá até aqui (17/06/2011) são 8 anos de programação. Neste tempo aprendi várias linguagens de programação (Pascal, C e Java na faculdade - ASP, PHP, JavaScript, C++, SQL, PL/SQL, FORTRAN, XML, J2ME, CSV, SVN, UML, DotProject - nas empresas que trabalhei). Ou seja, uma infinidade de ferramentas que nós programadores utiliza-mos.

Um ou outro conhecimento é perdido, devido a quantidade de informação que lidamos hoje em dia. Alguns essenciais e as vezes acabo perdendo muito tempo procurando na internet, um "truque" simples por exemplo  mas que ajuda muito!
Aqui eles permaneceram acessíveis pra mim e pra outros programadores se assim desejarem.

Tentarei escrever sobre todas elas, mas darei enfase inicialmente as linguagens que trabalho hoje Delphi7 e PHP que fazem parte do meu dia-a-dia e a Java que é a minha linguagem favorita.

Aliás! Postarei material de Ubuntu também, eu gosto muito, utilizo no meu notebook. Mas terá tópicos em Windows também pois desenvolvo programas para usuários Windows, fazer o que!

Que Deus me ajude nessa encruzilhada :-)

Abraços, Emanuel