sábado, 31 de março de 2018

Como usar while no Delphi?

No inicio do estudo em qualquer linguagem de programação é normal buscarmos as funcionalidades básicas da linguagem, entre elas: tipos, sintaxes, IDE, e laços de repetição.

Neste post vou mostrar como usar a estrutura de repetição while.

Basicamente o while é um laço de repetição que executa o código em seu bloco até que uma determinada condição seja falsa, caso contrário continuará executando as instruções no bloco.

Veja o esboço abaixo:

while (condição = verdadeira) do
begin  < bloco de código>
end ;
Vemos no esboço acima que a função while possui um cabeçalho onde é verificada uma determinada condição, e caso ela seja verdadeira, o bloco de código (entre begin e end;) será executado.


Veja o exemplo abaixo:

var
   numero: integer ;
begin
      
      numero := 0 ;
      while numero < 10 do
      begin
           numero := numero + 1 ;
      end ;

end ;

no exemplo apresentado acima, foi declarada uma variável inteira cujo nome é "numero".
Antes do loop esta variável recebe o valor '0' (zero) e então o while começa.
É verificado se a variável "numero" é menor que '10' (dez), caso seja, então a variável "numero" recebe o valor dela mesma mais '1' (um).
Em um determinado momento o valor em 'numero' será igual ou superior à '10' (dez), neste momento o laço while não será mais executado.

Espero que seja útil!

Até+



Como evitar que seja digitado letras em um edit no Delphi?

Em alguns casos é necessário impedir que o usuário digite letras e outros tipos de caracteres diferentes de números, e em casos mais específicos, é necessário isolar a digitação, focando em permitir apenas números e alguns tipos de teclas.

O Delphi disponibiliza uma propriedade booleana que monitora isto, porém vou mostrar uma forma via codificação que também atende esta necessidade.

1º Com o form aberto, arraste para ele um componente do tipo TEdit ;

2º Clique no componente "Edit" e em Object Inspector clique na aba Events e então clique duas vezes no evento "OnKeyPress" ;

3º Será criado um método (procedure). Após begin, digite o seguinte:

     if not ( Key in ['0'..'9', #8] ) then key := #0 ;

4º Pode salvar, compilar e executar o projeto. Tente digitar letras ou qualquer outro caractere diferente de números, você perceberá que a digitação está bloqueada.

Nesta configuração, são aceitos apenas: números e a digitação da tecla Backspace que corresponde à 8 na tabela ASCII.

Espero que seja útil.

Até+

Como criar um botão em runtime no Delphi?

É muito comum encontrar programadores de outras linguagens que acham que no Delphi para criar um objeto visual ou componente, é só clicar no ícone do componente, arrastá-lo para o form e então soltá-lo e tudo estará bem.

De fato existe esta facilidade, visto que o Delphi é uma ferramenta RAD, porém existe também a outra forma de se criar um componente, é através de codificação.

Para exemplificar, vou mostrar como criar um botão ou button em runtime.

1º Vou considerar que você já está com um projeto do Delphi aberto ;

2º Em "Object Inspector" clique na aba "events" e então clique duas vezes sobre "OnShow".

3º antes de begin, digite o seguinte

var   loBTN : TButton ;

4º Após o begin, digite o seguinte:

     loBTN := TButton.Create( self ) ;
     loBTN.Parent := self ;
     loBTN.Left := 40 ;
     loBTN.Top := 50 ;
     loBTN.Caption := 'BtnTeste' ; 

 5º agora é só compilar e executar. Quando o form for apresentado na tela, você verá que existe um botão do lado esquerdo:


É isso pessoal. Espero que seja útil.

Até+

terça-feira, 27 de março de 2018

Como formatar field do tipo Float em run time no Delphi?

Quando criamos uma consulta em SQL usando qualquer componente que suporte este tipo de operação, no modo Design Time, automaticamente quando "ativamos" o componente e na sequência fazemos o conhecido "Add all Fields", trazendo assim todos campos da consulta, caso exista um campo "float" que tenha um valor "quebrado", é muito fácil formatar o campo diretamente:

Clicar no field > Clicar na propriedade "DisplayFormat" > definir uma formatação, '###,##0.00' por exemplo.

 Ok!

Mas, e quando os campos são gerados obtidos dinamicamente, ou seja, a consulta SQL é "construída" e obtida em runtime, como fazer para formatar os campos "float"?

...exatamente...temos que pensar um pouco!

Mas para isso venho através deste post tentar ajudá-lo. Abaixo, segue o processo necessário para tratar a situação apresentada acima:

1º Dentro do método em que ocorro o "<Query>.Open" declare uma variável do tipo integer, neste exemplo vou declarar "loCT":

var loCT: Integer

2º Depois da linha de código "<Query>.Open" insira as seguintes linhas de código:

for loCT := 0 to pred( <Query>.FieldCount ) do
     if <Query>.Fields[loCT].DataType in [ ftFloat ] then                    TNumericField( <Query>.Fields[loCT] ).DisplayFormat := '###,##0.00' ;

Desta forma, todos os fields que forem do tipo ftFloat serão formatados dinamicamente e o melhor, em runtime.

Espero que seja útil!

Até+

sábado, 24 de março de 2018

Como usar arquivos '.gif' no Delphi

Para utilizar um arquivo do tipo '.gif' é necessário fazer o seguinte:

1º Inclua um componente da classe TImage no formulário ;

2º Faça o load do arquivo '.gif' na propriedade Picture do componente TImage ;

3º Defina em algum evento anterior a exibição do formulário a seguinte instrução:

TGIFImage( <TImage>.Picture.Graphic ).Animate := true ;

obs: A linha de código acima somente será disponível caso esteja declarada a unit GIFImg no uses.

Pronto, seu "gif" já estará funcionando.

Até+

domingo, 18 de março de 2018

Como usar o For..In

Qual a forma de usar a estrutura de repetição For..in?

Esta estrutura de repetição, opção ao "For..to..do", consiste em varrer uma coleção de dados, e então permite ao programador definir operações específicas com cada um dos dados obtidos.

Vamos aos exemplos de uso:

1º) Usando "String"

const Nome = 'Brasil'
var
     _letra: char

for _letra in Nome do
     showmessage( _letra ) ;

neste exemplo, defini uma constante de caracteres ("Brasil"). Na sequência defini uma variável do tipo 'char'.
O For..in internamente, identifica cada um dos dados na coleção referenciada após o in, e então a cada iteração é atribuída a variável antes do in, o dado em foco, algo assim:

na primeira iteração

[ B ] rasil

_letra := 'B'

na segunda iteração

B [ r ] asil

_letra := 'r'

na terceira iteração

Br [ a ] sil

_letra := 'a'

na quarta iteração

Bra [ s ] il

_letra := 's'

na quinta iteração

Bras [ i ] l

_letra := 'i'

na sexta iteração

Brasi [ l ]

_letra := 'l'

ou seja, a variável que recebe o dado contido na coleção, deve corresponder à menor parcela desta coleção. Neste exemplo, a constante é uma cadeia de caracteres, ou seja, uma String, sendo necessário que a variável "_letra" seja do tipo char.

2º) Usando "Integer"

const Numeros: array [0..2] of integer = ( 1, 2, 3 ) ;
var
     _numero: integer
for _numero in Numeros do     showmessage( IntToStr( _numero ) ) ;

no caso do trato de "integer" é necessário passar um array visto que se passemos um número "direto", como:

Numeros = 123

e tentasse varrer via For..in o compilador iria entender que não existe coleção mas sim um número qualquer.
Desta forma torna-se necessário separar os números em memória e atribuí-los ao mesmo identificador, no caso, a constante "Numeros".

O funcionamento de varredura é exatamente o mesmo aplicado no primeiro exemplo.

Espero que este conteúdo seja útil!

Até +

terça-feira, 13 de março de 2018

Simular algum cenário em DEBUG

Como testar uma determinada situação sem ter que inserir valores através da interface gráfica? Vou mostrar um exemplo.

Como sempre, usarei um exemplo simples para demonstrar o uso de Diretivas de compilação na simplificação de testes, porém existem outras formas de se fazer testes. Vamos lá!

A título de teste, criei uma função chamada "IsNumber", que basicamente verifica se um determinado char recebido como parâmetro é um número, segue a declaração da função:


function IsNumber( loChar: char ): boolean ;

Após isto, no evento "OnClick" de um botão qualquer, faço um teste:


procedure TfrmMain.btnIsNumberClick(Sender: TObject);
begin
     showmessage( ifThen( IsNumber( '1' ), 'É um número', 'Não é um número' ) );
end;

// falei sobre ifThen neste post...

Porém existem situações muito mais complexas, que existem muito mais que um input, neste caso, seria muito trabalhoso ficar preenchendo campos e etc...precisamos testar a função o mais rápido possível dependendo do projeto. Para isso, podemos automatizar o teste, condicionando esta operação ao modo como a aplicação está sendo compilada: DEBUG ou RELEASE.

Veja como é a implementação da função "IsNumber":

function TfrmMain.IsNumber(loChar: char): boolean;
begin
     result := loChar in ['0'..'9'] ;     
end;

Agora, vou incluir o preenchimento do parâmetro "loChar" dentro da própria função, quando a forma de compilação estiver em DEBUG:

function TfrmMain.IsNumber(loChar: char): boolean;
begin
     {$IFDEF DEBUG}
     loChar := 'a' ;
     {$ENDIF}

     result := loChar in ['0'..'9'] ;

     {$IFDEF DEBUG}
     showmessage( ifThen( result, 'É um número', 'Não é um número' ) );
     {$ENDIF}
end;
Veja que coloquei a verificação de "Debug" em dois momentos. Para resumir, quando o projeto estiver em modo "Debug", não será necessário passar nenhum valor como parâmetro para a função "IsNumber", visto que internamente já existe a alimentação deste parâmetro.

Espero que seja útil!

Até+
 

Como obter a classe ancestral?

Durante a execução de um projeto surgiu uma dúvida: "Como saber qual a classe exatamente ancestral a que eu criei?"

Acredito que esta situação seja comum para muitos programadores, que assim como eu, estão nesta jornada.

Para mostrar a solução, vou usar um exemplo:

* Crio uma classe chamada "TNomeStringField", ela deriva de "TStringField", segue a declaração:

  TNomeStringField = class( TStringField )
  end ;

* Declaro um "objeto" do tipo TNomeStringField :

var
     TNome: TNomeStringField ;

* Instancio o objeto de fato:

TNome := TNomeStringField.Create( self ) ;

* Para obter o nome da class do objeto TNome, faça o seguinte:

showmessage( TClass( TNome.ClassType ).ClassName ) ;

* Para obter o nome da class exatamente ancestral à que eu criei:

if TNome.ClassParent <> nil then showmessage( TNome.ClassParent.ClassName ) ; 

obs: Veja que antes de obter o valor de ClassParent, fiz a verificação se esta propriedade era diferente de nil.

É isso!

Até+

PHP para iniciantes - Vídeo #1