Desenvolvimento - Delphi
Criação de Componente Vinculado a Lista Encadeada
Criação de um componente ComboBox linkado com uma lista encadeada, lista essa que tem os dados que irão popular o combo, o artigo mostra cada passo desde a criação do combobox, criação da lista e a forma de vincular os dois, possui um link para baixar a classe lista e o componente para auxiliar na didática.
por Alexandre Telles EstanieskiRealizando várias pesquisas pela WEB a procura de artigos e aulas sobre criação de componentes em Delphi sempre encontrei artigos muito conceituais e algumas vezes pouco didáticos, deixando a seguinte pergunta no ar “Quando e como vou usar isso?”
Diante dessa dúvida e dificuldade que enfrentei resolvi escrever este artigo tomando o cuidado para deixá-lo o mais didático e prático possível para que você desenvolvedor Delphi possa ter uma boa concepção da idéia aqui apresentada, pois não desejo apenas ensinar a criar componente, mas também mostrar um dos vários tipos de utilização que você pode dar ao componente criado.
COMBOBOX COM PROPRIEDADE TIPO LISTA
Bem todos nos conhecemos o componentes ComboBox do Delphi muito útil para o nosso dia-a-dia, vejamos alguns conceitos básicos deste componente:
ADICIONAR ITENS DESIGN TIME:
Object Inspector-à itemsà ... [Clique]
Vai Ficar Assim:
Também é possível inserir itens via código:
ComboBox1.items.add('ActiveDelphi 1');
ComboBox1.items.add('ActiveDelphi 2');
ComboBox1.items.add('ActiveDelphi 3');
Sendo este o resultado:
Muito bem isso tudo é muito simples e fácil, mas imagine uma tabela onde você tem centenas, milhares de nomes ou endereços ou qualquer outra informação que você precisa carregar na memória trabalhar com está informação e depois gravar, ai é que entra a Lista encadeada vinculada com o ComboBox.
CONCEITO DE LISTA
Diversos autores descrevem lista como estruturas de dados que contém um conjunto de blocos de memória que armazenam dados. Esses blocos são encadeados (ligados) por ponteiros, formando uma espécie de “corrente”, onde as peças dessa corrente estão ligadas umas as outras.
Bem acesse esse link para baixar a Unit da Classe Lista www.sinaiinformatica.com.br/baixar/artigos/artigo.zip
Sem ela não haverá o vinculo com o comboBox.
CRIANDO O COMBOBOX
MENUàCOMPONENTàNEW VCL COMPONENT
PREENCHA OS DADOS...
Finalizando o seu código inicial vai ficar assim:
unit ComboBoxLista_ActiveDelphi;
interface
uses
SysUtils, Classes, Controls, StdCtrls;
type
TComboBoxLista_ActiveDelphi = class(TComboBox)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('ACTIVEDELPHI', [TComboBoxLista_ActiveDelphi]);
end;
end.
O CABEÇALHO DEVE FICAR ASSIM APÓS ALGUMAS ALTERAÇÕES:
unit ComboBoxLista_ActiveDelphi;
interface
uses
SysUtils, Classes, Controls, StdCtrls, UtilList;
type
TComboBoxLista_ActiveDelphi = class(TComboBox)
procedure DoEnter; override;
procedure DoExit; override;
public procedure SetIndexByText(text: string);
public procedure SetIndexByStringKey(string_key: string);
public procedure SetIndexByIntegerKey(integer_key: Integer);
public procedure SetIndexByCount(count_key: Integer);
public function GetSelectedStringKey: string;
public function GetSelectedIntegerKey: Integer;
private FUtilList: TUtilList;
procedure SetUtilList(const Value: TUtilList);
published property UtilList: TUtilList read FUtilList write SetUtilList; //Pripriedade que será utilizada
end;
APÓS CRTL+SHIFT+C
CÓDIGO COMPLETO
unit ComboBoxLista_ActiveDelphi;
interface
uses
SysUtils, Classes, Controls, StdCtrls, UtilList;
type
TComboBoxLista_ActiveDelphi = class(TComboBox)
procedure DoEnter; override;
procedure DoExit; override;
public procedure SetIndexByText(text: string);
public procedure SetIndexByStringKey(string_key: string);
public procedure SetIndexByIntegerKey(integer_key: Integer);
public procedure SetIndexByCount(count_key: Integer);
public function GetSelectedStringKey: string;
public function GetSelectedIntegerKey: Integer;
private FUtilList: TUtilList;
procedure SetUtilList(const Value: TUtilList);
published property UtilList: TUtilList read FUtilList write SetUtilList; //Pripriedade que será utilizada
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('ACTIVEDELPHI', [TComboBoxLista_ActiveDelphi]);
end;
{ TComboBoxLista_ActiveDelphi }
procedure TComboBoxLista_ActiveDelphi.DoEnter;
begin
inherited;
Color := clInfoBk;
Font.Style := Font.Style + [fsBold];
end;
procedure TComboBoxLista_ActiveDelphi.DoExit;
begin
inherited;
Color := clWhite;
Font.Style := Font.Style - [fsBold];
end;
function TComboBoxLista_ActiveDelphi.GetSelectedIntegerKey: Integer;
begin
Result := FUtilList.GetIntegerKey(TComboBoxLista_ActiveDelphi(Self).ItemIndex);
end;
function TComboBoxLista_ActiveDelphi.GetSelectedStringKey: string;
begin
Result := FUtilList.GetStringKey(TComboBoxLista_ActiveDelphi(Self).ItemIndex);
end;
procedure TComboBoxLista_ActiveDelphi.SetIndexByCount(count_key: Integer);
begin
TComboBoxLista_ActiveDelphi(Self).ItemIndex:=Items.IndexOf(FUtilList.GetItem(count_key));
end;
procedure TComboBoxLista_ActiveDelphi.SetIndexByIntegerKey(integer_key: Integer);
begin TComboBoxLista_ActiveDelphi(Self).ItemIndex:=Items.IndexOf(FUtilList.GetItemByIntegerKey(integer_key));
end;
procedure TComboBoxLista_ActiveDelphi.SetIndexByStringKey(string_key: string);
begin TComboBoxLista_ActiveDelphi(Self).ItemIndex:=Items.IndexOf(FUtilList.GetItemByStringKey(string_key));
end;
procedure TComboBoxLista_ActiveDelphi.SetIndexByText(text: string);
begin
TComboBoxLista_ActiveDelphi(Self).ItemIndex:=Items.IndexOf(text);
end;
procedure TComboBoxLista_ActiveDelphi.SetUtilList(const Value: TUtilList);
var
i: Integer;
begin
FUtilList := Value;
TComboBoxLista_ActiveDelphi(Self).Clear;
for i := 0 to FUtilList.Count-1 do begin
TComboBoxLista_ActiveDelphi(Self).Items.Add(FUtilList.GetItem(i));
end;
TComboBoxLista_ActiveDelphi(Self).Refresh;
end;
end.
O próximo passo será criar um pacote e colocar está unit acima dentro para ser instalado no nosso Delphi 2007.
· FileàNewàPackage;
· Object ManageràClique com o botão direito no nome do pacote e adicione a unit do componente, salve e compile;
· Clique novamente o botão direito novamente no nome do pacote e após clique em Install;
Instalado o pacote sem erros abra um novo projeto e procure a aba conforme figura abaixo:
Adicione um TComboBoxLista_ActiveDelphi.
Iremos observar que ele o componente ganhou um propriedade NOVA
ComboBoxLista_ActiveDelphi1.UtilList
Está propriedade abrirá a porta para adicionarmos uma lista com os dados que devem ser inseridos no combo.
CRIANDO A LISTA
Adicione Na Uses a Classe UtilList(Deve estar no mesmo diretório do projeto).
Após declare a variável tipo LISTA
type
TForm1 = class(TForm)
ComboBoxLista_ActiveDelphi1: TComboBoxLista_ActiveDelphi;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
VarList:TUtilList;//pode ser aqui
public
{ Public declarations }
end;
Apost adicionar o ComboList e um Button no Projeto, no evento OnClick do Button adicione o seguinte código:
VarList:=TUtilList.Create; // Estanciando a Lista
//escolha qualquer tabela sua e selecione o campo que deverá popular o Combo.
Table1.First;
while not Table1.Eof do begin
VarList.Add(Table1.FieldByName('Company').asString); //Adicionando na lista pode
//ser String, Integer, Double, olhe dentro da classe UtilList
Table1.next;
end;
//Carrega a Lista no comboBox;
ComboBoxLista_ActiveDelphi1.UtilList:=VarList;
COMPILE O PROJETO, DEVE FICAR ASSIM:
CLIQUE NO BOTÃO:
CARREGADA A LISTA
Através da lista você pode trabalhar com os dados(Toda a tabela) na memória sem alterar nada no disco e após realizar as transações necessárias pode salvar somente o que foi alterado.
Espero que este artigo possa ter ajudado você a criar um componente utilizando Delphi e não somente isso, mas tendo essa pequeníssima introdução a Lista.
Qualquer dúvida, comentário ou sugestão entre em contato atestanieski@gmail.com ou comercial@sinaiinformatica.com.br.