Fonte: www.activedelphi.com.br
Há algum tempo atrás precisei criar um enumerado e depois carregar este enumerado em um ComboBox. Toda vez que surgia essa necessidade eu criava o enum e criava um array de string com todas as opções do enum, aí com um loop no array eu populava o ComoboBox. Só que toda vez que precisava acrescentar um nova opção no enum eu tinha que atualizar o array.
Isso começou me incomodar! Foi aí que lembrei que quando desenvolvemos componentes e criamos uma property do tipo de um enum na seção published, o Delphi exibe esse enum no ObjectInspector com um ComboBox, e ele faz isso automaticamente! Aí pensei: “isso deve ser possível” já que o Delphi faz. Então entrei em contato com um amigo meu muito fera em Delphi, “Adriano Santos”, e ele conseguiu a solução que eu gostaria de publicar.
Vamos lá, vou dar o exemplo referente a minha necessidade na época que estava desenvolvendo uma comunicação com uma balança através da porta COM.
Criando o enum:
type
TPorta = (COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9);
Criando a property do tipo do enum:
private
FPort: TPort;
public
property Port: TPort read FPort write FPort;
end;
Criando um método que vai popular uma lista do Tipo TStrings, assim, com esse método posso popular objetos como: TComboBox, TMemo, TListBox ou até mesmo uma variável do Tipo TStrings. Primeiro deve ser declarado na seção uses a unit: TypInfo.
class procedure TSerialComunication.PopulateListPort(AList: TStrings);
var
i: Integer;
Begin
for i := Ord(Low(TPort)) to Ord(High(TPort)) do
AList.Add(GetEnumName(TypeInfo(TPort), i));
end;
Agora basta chamar o método e popular o ComboBox:
procedure TfrmPrincipal.btnPopulatePortClick(Sender: TObject);
Begin
TSerialComunication.PopulateListPort(cbbPort.Items);
end;
Essa foi a solução que meu amigão Adriano Santos meu passou, achei genial.
Agora imagina se precisar pegar um item do ComboBox que é uma string e passar pra uma variável do tipo do Enum? Antigamente eu usaria um case pra saber qual foi o item selecionado e passar a opção do enum correta, mas agora posso usar a mesma idéia e converter automaticamente enum para string ou vice-versa! Então criei dois overload de um método Convert:
class function TSerialComunication.Convert(const APort: string): TPort;
begin
Result := TPort(GetEnumValue(TypeInfo(TPort), APort)) ;
end;
class function TSerialComunication.Convert(const APort: TPort): string;
begin
Result := GetEnumName(TypeInfo(TPort), Integer(APort)) ;
end;
Agora ficou facil, basta chamar os métodos de conversão!
Convertendo o item do combobox para o enum:
procedure TfrmPrincipal.btnStringToEnumClick(Sender: TObject);
var
vPort: TPort;
begin
vPort := TSerialComunication.Convert(cbbPort.Text);
end;
Convertendo de Enum para uma string:
procedure TfrmPrincipal.btnEnumToStringClick(Sender: TObject);
var
vPort: TPort;
begin
vPort := COM1;
ShowMessage(TSerialComunication.Convert(vPort));
end;
Isso começou me incomodar! Foi aí que lembrei que quando desenvolvemos componentes e criamos uma property do tipo de um enum na seção published, o Delphi exibe esse enum no ObjectInspector com um ComboBox, e ele faz isso automaticamente! Aí pensei: “isso deve ser possível” já que o Delphi faz. Então entrei em contato com um amigo meu muito fera em Delphi, “Adriano Santos”, e ele conseguiu a solução que eu gostaria de publicar.
Vamos lá, vou dar o exemplo referente a minha necessidade na época que estava desenvolvendo uma comunicação com uma balança através da porta COM.
Criando o enum:
type
TPorta = (COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9);
Criando a property do tipo do enum:
private
FPort: TPort;
public
property Port: TPort read FPort write FPort;
end;
Criando um método que vai popular uma lista do Tipo TStrings, assim, com esse método posso popular objetos como: TComboBox, TMemo, TListBox ou até mesmo uma variável do Tipo TStrings. Primeiro deve ser declarado na seção uses a unit: TypInfo.
class procedure TSerialComunication.PopulateListPort(AList: TStrings);
var
i: Integer;
Begin
for i := Ord(Low(TPort)) to Ord(High(TPort)) do
AList.Add(GetEnumName(TypeInfo(TPort), i));
end;
Agora basta chamar o método e popular o ComboBox:
procedure TfrmPrincipal.btnPopulatePortClick(Sender: TObject);
Begin
TSerialComunication.PopulateListPort(cbbPort.Items);
end;
Essa foi a solução que meu amigão Adriano Santos meu passou, achei genial.
Agora imagina se precisar pegar um item do ComboBox que é uma string e passar pra uma variável do tipo do Enum? Antigamente eu usaria um case pra saber qual foi o item selecionado e passar a opção do enum correta, mas agora posso usar a mesma idéia e converter automaticamente enum para string ou vice-versa! Então criei dois overload de um método Convert:
class function TSerialComunication.Convert(const APort: string): TPort;
begin
Result := TPort(GetEnumValue(TypeInfo(TPort), APort)) ;
end;
class function TSerialComunication.Convert(const APort: TPort): string;
begin
Result := GetEnumName(TypeInfo(TPort), Integer(APort)) ;
end;
Agora ficou facil, basta chamar os métodos de conversão!
Convertendo o item do combobox para o enum:
procedure TfrmPrincipal.btnStringToEnumClick(Sender: TObject);
var
vPort: TPort;
begin
vPort := TSerialComunication.Convert(cbbPort.Text);
end;
Convertendo de Enum para uma string:
procedure TfrmPrincipal.btnEnumToStringClick(Sender: TObject);
var
vPort: TPort;
begin
vPort := COM1;
ShowMessage(TSerialComunication.Convert(vPort));
end;
Nenhum comentário:
Postar um comentário