RTL – Andreano Lanusse | Tecnologia e Desenvolvimento de Software http://www.andreanolanusse.com/pt Andreano Lanusse blog - artigos, tutoriais e vídeos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e técnicas de programação Fri, 03 May 2013 03:34:10 +0000 pt-BR hourly 1 https://wordpress.org/?v=6.5.7 Utilizando expressões regulares para validar endereço IP no Delphi XE http://www.andreanolanusse.com/pt/utilizando-expressoes-regulares-para-validar-endereco-ip-no-delphi-xe/ http://www.andreanolanusse.com/pt/utilizando-expressoes-regulares-para-validar-endereco-ip-no-delphi-xe/#comments Thu, 09 Sep 2010 06:46:26 +0000 http://www.andreanolanusse.com/pt/?p=1025 Umas das novidades no Delphi XE e o suporte a expressões regulares na RTL, esse recursos nos permite fazer diversos tipos de validações, este artigo explicar como utilizar este recurso para validar se o valor em uma string é realmente contém um endereço IP.

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
Umas das novidades no Delphi XE e o suporte a expressões regulares (unit RegularExpressions) na RTL, esse recursos nos permite fazer diversos tipos de validações, abaixo um exemplo de como utilizar este recurso para validar se o valor em uma string é realmente um endereço IP.

program RegExpIP;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  RegularExpressions;

var
 ipRegExp : String;
begin
  try

    ipRegExp := '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b';

  if TRegEx.IsMatch(paramstr(1), ipRegExp) then
    Writeln('Text DOES match the regular expression')
  else
    Writeln('Text DOES NOT match the regular expression');

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Para validar basta executar o programa e passar como parâmetro o endereço IP

Neste caso o IP é válido
RegExpIP 200.100.2.21
Text DOES match the regular expression

Neste caso o IP não é valido, pois 263 está fora do intervalo permitido
RegExpIP 200.100.2.263
Text DOES match the regular expression

No repositório de exemplos do RAD Studio você pode encontrar um exemplo com outros tipos de expressões regulares.

Faça o download da versão trial do Delphi XE aqui

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/pt/utilizando-expressoes-regulares-para-validar-endereco-ip-no-delphi-xe/feed/ 3
Resolvendo problemas de intervalo de data com Records em Delphi http://www.andreanolanusse.com/pt/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi/ http://www.andreanolanusse.com/pt/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi/#comments Thu, 04 Mar 2010 07:19:02 +0000 http://www.andreanolanusse.com/pt/?p=756 Record é um tipo de dado que lhe permite estruturar dados, a partir do Delphi 2006 Record se tornou quase uma classe, suportando: Construtores Sobreposição de operadores Declaração de métodos não-virtuais Métodos e propriedades estáticos Podemos utilizar os Record de várias maneiras, no meu caso utilizo muito em parâmetros de métodos que devem representar chaves […]

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
Record é um tipo de dado que lhe permite estruturar dados, a partir do Delphi 2006 Record se tornou quase uma classe, suportando:

  • Construtores
  • Sobreposição de operadores
  • Declaração de métodos não-virtuais
  • Métodos e propriedades estáticos

Podemos utilizar os Record de várias maneiras, no meu caso utilizo muito em parâmetros de métodos que devem representar chaves primárias (Primary Key), desta forma facilita a leitura e manutenção do código, é verdade que você não fica mudando as chaves primárias das tabelas do seu banco de dados o tempo todo, mas quando precisar o mudança no código será simples. Outro exemplo seria informar intervalo de dados.

Imagine que você precise gerar um conjunto de boletos de um determinado período, você iria declarar algo assim.

    procedure GerarBoleto( DataInicial, DataFinal : TDateTime );

Geralmente temos problema com periodos, porque os bancos de dados armazenam data e hora no mesmo campo, desta forma temos que na data inicial estar certo que a hora está acertada para ’00:00:00′ e para a data final teremos que estar certos de ter como hora final ’23:59:59′, existem outros aspectos e artifícios dependendo do banco de dados para contornar esta situação, mas isso depende de cada banco.

Record é uma excelente solução para estes casos, para isso representamos os parâmetros do método GerarBoleto como um Record e ele irá fazer todo o trabalho para evitar os problema de data e hora, assim como facilitar a leitura, entendimento e manutenção do código.

O método passaria a ser declarado assim:

    procedure GerarBoleto( periodo : TPeriodo );

A declaração do Record teria as propriedades DataInicial e DataFinal, estas por suas vez quando receberam valores terão os mesmo ajustados de acordo com os método Set.

Abaixo a declaração do Record e a seguir algumas explicações para o mesmo.

unit Perido;

interface

uses SysUtils, DateUtils;

type

  TPeriodo = Record
  private
    FDataFinal: TDateTime;
    FDataInicial: TDateTime;
    procedure SetDataFinal(const Value: TDateTime);
    procedure SetDataInicial(const Value: TDateTime);

  public
    property DataInicial: TDateTime read FDataInicial write SetDataInicial;
    property DataFinal: TDateTime read FDataFinal write SetDataFinal;

    Constructor Create(Di, Df: TDateTime);

    procedure SetIntervaloAnual( Anoi, Anof : Integer );
  end;

implementation

{ TPeriodo }

constructor TPeriodo.Create(Di, Df: TDateTime);
begin
  DataInicial := Di;
  DataFinal := Df
end;

procedure TPeriodo.SetDataFinal(const Value: TDateTime);
begin
  FDataFinal := EncodeDateTime(Yearof(Value), MonthOf(Value), Dayof(Value), 23, 59, 59, 1000);
end;

procedure TPeriodo.SetDataInicial(const Value: TDateTime);
begin
  FDataInicial := EncodeDateTime(Yearof(Value), MonthOf(Value), Dayof(Value), 0, 0, 0, 0);
end;

procedure TPeriodo.SetIntervaloAnual(Anoi, Anof: Integer);
begin
  DataInicial := EncodeDate(Anoi, 1, 1);
  DataFinal   := EncodeDate(Anof, 12, 31);
end;

end.
  • Toda e qualquer atribuição de valor para DataInicial e DataFinal serão ajustados de acordo com o horário inicial e final
  • Foi criado um método adicional SetIntervaloAnual, onde você pode informar o ano inicial e final para o período e o método irá gerar os intervalos.

Abaixo uma das formas onde podemos utilizar este Record, informando período inicial e final;

var
  periodo : TPeriodo;
begin
  periodo.DataInicial := EncodeDate( 2009, 1, 1);
  periodo.DataFinal   := Now;

  GerarBoleto(periodo);

Outra forma é passar o período utilizando o construtor do Record

var
  periodo : TPeriodo;
begin
  periodo.Create(EncodeDate( 2009, 1, 1), Now);
  GerarBoleto(periodo);

Outra forma seria utilizar o método SetIntervaloAnual, onde você apenas especifica o período anual.

var
  periodo : TPeriodo;
begin

  periodo.SetIntervaloAnual(2008, 2009);

  GerarBoleto(periodo);

Em todos os casos, os valores horários foram acertados.

Mas este record pode fazer muito mais por nós, porque não gerar a declaração where do SQL para as datas de acordo com os valores? Dois simples métodos pode resolver todos os problemas.

Field, é o nome do campo que representa a data em sua tabela.

function TPeriodo.DataDBFormat(const Value: TDateTime): String;
begin
  Result := FormatDateTime('mm/dd/yyyy hh:mm:ss', Value);
end;

function TPeriodo.GenerateSQL(Field: String): String;
Const
  sql: String = '%s between ''%s'' and ''%s'' ';
begin
  Result := Format(sql, [FieldI, DataDBFormat(DataInicial), DataDBFormat(DataFinal)]);
end;

Na prática usamos desta forma:

var
  periodo : TPeriodo;
begin

  periodo.SetIntervaloAnual(2008, 2009);

  ShowMessage( periodo.GenerateSQL('DATA_BOLETO'));

O resultado no ShowMessage será: DATA_BOLETO between ’01/01/2008 00:00:00′ and ’12/31/2009 23:59:59′

Espero que este post seja útil e lhe ajude no seu dia-a-dia. Download código fonte

Até o próximo post.

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/pt/resolvendo-problemas-de-intervalo-de-data-com-records-em-delphi/feed/ 3
Utilizando atributos (Attributes) para criar framework objeto relacional em Delphi 2010 – Parte 1 http://www.andreanolanusse.com/pt/utilizando-atributos-attributes-para-criar-framework-objeto-relacional-em-delphi-2010-parte-1/ http://www.andreanolanusse.com/pt/utilizando-atributos-attributes-para-criar-framework-objeto-relacional-em-delphi-2010-parte-1/#comments Wed, 02 Sep 2009 12:14:36 +0000 http://www.andreanolanusse.com/pt/?p=285 De todas as novidades trazidas pelo Delphi 2010, sem dúvida o suporte a atributo (Attributes) é uma das que mais gosto. Para aqueles que já conhecem este recursos em outras linguagens como C# e Java, sabem que Attributes traz um mundo de possibilidades e associado com as novas funcionalidades da RTTI faz o casamento perfeito. […]

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
Delphi iconDe todas as novidades trazidas pelo Delphi 2010, sem dúvida o suporte a atributo (Attributes) é uma das que mais gosto. Para aqueles que já conhecem este recursos em outras linguagens como C# e Java, sabem que Attributes traz um mundo de possibilidades e associado com as novas funcionalidades da RTTI faz o casamento perfeito.

Em resumo atributos nos permite definir características para classes e seus respectivos elementos, existem vários exemplos que mostram a utilidade dos atributos. O melhor exemplo onde podemos utilizar atributos é a criação de framework objeto relacional (O/R Mapping), assim sendo começo hoje uma série de post explicando atributos e utilizando OR/Mapping como exemplo, além disso vamos ver dbExpress Framework que será parte da solução.

Atributos obrigatoriamente são definidos através de classes, estas devem herdar de TCustomAttribute a classe base para criação dos mesmos. Abaixo a classe TableAttribute que será utilizada para mapear as classes da aplicação com o banco de dados, a propriedade TableName define o nome da tabela.

TableAttribute = class(TCustomAttribute)
private
  FTableName: string;

public
  { TRttiType can be used as a parameter type; TypeInfo() supplies the argument. }
  property TableName: string read FTableName;
  constructor Create(ATableName: string); overload;
end;

implementation

constructor TableAttribute.Create(ATableName: string);
begin
  FTableName := ATableName;
end;

Definido o atributo para mapeamento das tabelas, basta agora você utilizá-lo nas suas classes, abaixo um exemplo onde a classe TCliente está mapeando a tabela CLIENTE.

[TableAttribute('CLIENTE')]
TCliente = class
public
  { public declarations }
  property Nome : String read FNome write FNome;
  property Endereco : String read FEndereco write FEndereco;
end;

Esse foi o primeiro post, no próximo vamos criar atributos para mapear propriedades com os campos das tabelas.

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/pt/utilizando-atributos-attributes-para-criar-framework-objeto-relacional-em-delphi-2010-parte-1/feed/ 18