|
Usuários |
|
120 Usuários Online
|
|
[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)
2 Comentários Enviar para um amigo Versão para impressão
|
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 pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|