Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 12 de Setembro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
120 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Classe Genérica para Transformar Tipos ENUM Enumerados Para TStrings
Publicado por rboaro : Terça, Junho 05, 2012 - 09:05 GMT-3 (825 leituras)
Comentários 2 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Marcos Salles Quem é que nunca utilizou Tipos Enumerados para dar um suporte mais orientado a Aplicação. Quem é que nunca precisou carregar um Tstrings com as opções do Tipo Enum? Quem é que nunca fez certas artimanhas para passar de String para Tipos Enumerados e Vice Versa. Pois bem, o artigo de hoje é não é somente mais uma, das inúmeras opções que se encontra espalhadas na rede sobre o assunto. O Propósito é criar um classe que seja desaclopada com um tipo Enum especifico . Com isto teremos mais flexibilidade e reaproveitamento do código em toda a VCL, onde tentamos andar sempre perto da POO , pois todo esforço a mais agora , será recompensado num futuro próximo . Vamos ao código ???


Numa Unit Escreva a classe a Seguir

unit uEnunConvertString;
interface
uses
classes,Generics.Collections;
Type
TGenerico = 0..255;
TConvert<T:record> = class
private
public
class procedure PopulateListEnum(AList: TStrings);
class function StrConvertEnum(const AStr: string):T;
class function EnumConvertStr(const eEnum:T):string;
end;

implementation

uses
Variants,SysUtils,TypInfo;

{ TConvert }

class procedure TConvert<T>.PopulateListEnum(AList: TStrings);
var
i:integer;
StrTexto:String;
Enum:Integer;
begin
i:=0;
try
repeat
StrTexto:=trim(GetEnumName(TypeInfo(T), i));
Enum:=GetEnumValue(TypeInfo(T),StrTexto);
AList.Add(StrTexto);
inc(i);
until Enum < 0 ;
AList.Delete(pred(AList.Count));
except;
raise EConvertError.Create('O Parâmetro passado não corresponde a um Tipo ENUM');
end;
end;
{*******************************************************************************}
class function TConvert<T>.StrConvertEnum(const AStr: string):T;
var
P:^T;
num:Integer;
begin
try
num:=GetEnumValue(TypeInfo(T),Astr);
if num = -1 then
abort;
P:=@num;
result:=P^;
except
raise EConvertError.Create('O Parâmetro "'+Astr+'" passado não '+sLineBreak + ' corresponde a um Tipo Enumerado');
end;
end;
{******************************************************************************}
class function TConvert<T>.EnumConvertStr(const eEnum:T): String;
var
P:PInteger;
Num:integer;
begin
try
P:=@eEnum;
Num:=integer(TGenerico((P^)));
Result := GetEnumName(TypeInfo(T),Num);
except
raise EConvertError.Create('O Parâmetro passado não corresponde a '+sLineBreak+'um inteiro Ou a um Tipo Enumerado');
end;
end;
end.

Algumas observaçoes:
Esta Unidade contém uma classe TConvert utilizando o conceito de Generics introduzido no Delphi2009.
Também aplicamos o conceito de Constraints utilizado neste caso para parametrizar o tipo genérico. Ao fazermos <T:record> definimos que o tipo real a ser utilizado deve ser uma estrtutura de valor e não de referencia, podendo ser um valor ordinário, ponto flutuante, ou um Record Limitamos com isto , que se use de forma errada a classe, restringindo mau uso e mau funcionamento da mesma.Por exemplo : TConvert.PopulateListEnum<TObject>() ; não chega nen a compilar. Vamos agora fritar os bolinhos , Afinal uma classe deve fornecer os bolinhos para serem consumidos: Em um Formulário qualquer , vamos definir vários tipos a seguir enumerados

Type TAcao= (ftFirist, ftNext, ftPrior, FtLast, ftIgnore ) ;
Type TRemuneracao = (ftHorario, ftDiario, FtSemanal , ftquinzenal , Ftmensal);
Type TVencimentos = (ftMedia30, FtMedia45 , ftMedia60);
Type TDinheiro = (ftReal , ftDollar , FtEuros, ftLibra , ftYen , ftPeso );
Type TSorte = (ftPar , FtImpar);
Type TPort = (COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9);

Nosso primeiro Objetivo é popular Seis combobox respectivamente (cbAcao , cbRemuneracao . cbVencimentos , cbDinheiro, cbSorte ,cbPort) , utilizando a Classe que se encontra na Unidade UEnunConvertString . Para Isto De Uses a esta Unidade no Formulário que se encontra os sies Combobox e programe no evento Onclick do Botão o seguinte Código

procedure TForm1.btnPopularClick(Sender: TObject);
begin
TConvert<TAcao>.PopulateListEnum(CbAcao.Items);
TConvert<TRemuneracao>.PopulateListEnum(cbRemuneracao.Items);
TConvert<TVencimentos>.PopulateListEnum(cbVencimentos.Items);
TConvert<TDinheiro>.PopulateListEnum(cbDinheiro.Items);
TConvert<TSorte>.PopulateListEnum(cbSorte.Items); TConvert<TPort>.PopulateListEnum(cbPort.Items);
end;

O Resultado são os seis Combobox “populados” sem alterarmos um linha sequer do código. Esta Classe ela é expansível , flexível , suporta a principio todos os tipos Enumerados. Os outros métodos , eu não vou detalhar , visto a sua simplicidade e alto didática. Se por ventura alguém tiver alguma dúvida na utilização desses métodos pode entrar em contado que será atendido. Tambem poderei estar disponibilizando os fontes exemplos com os todos os métodos. Peço por último , por questões de gentileza e cordialidade , bem como respeito aos direitos autorais , que se alguém quiser acrescentar esta classe em algum veiculo de comunicação, que faça referência a fonte da informação original. No mais meu muito obrigado.

Link Original: http://marcosalles.wordpress.com/2011/03/28/classe-generica-para-transformar-tipos-enumerados-para-tstrings/

Marcos Salles
salhamoda@uol.com.br


Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: EliomarOffice (eliomar0910@gmail.com) : Jun 09, 2012 - 08:25
(Informações sobre o membro | Enviar uma mensagem)
Opa... muito bom Marcos Salles, obrigado por partilhar os conhecimentos, muito útil sua class.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados