segunda-feira, 21 de setembro de 2009

Usando tlist e record como array

{No Clipper costumava-se utilizar arrays de tamanho variável para uma infinidade de coisas, como em Delphi não é possível redimensionar um array então temos de implementar esta solução de forma mais complexa e mais poderosa. Primeiro usamos um record para simular as colunas, a grande vantagem aqui é que um record pode conter dados de diversos tipos de dados.}


type
PLinha = ^TLinha;
TLinha = record
coluna1 : string;
coluna2 : string;
coluna3 : string;
coluna4 : string;
end; {Foi criado um tipo PLinha que será um ponteiro para TLinha, esta jogada funciona muito bem para programas que devem trabalhar com uma grande quantidade de dados em memória, já que as informações serão armazenadas fora do segmento de dados de seu programa,

Crie um TList para guardar todos os itens, ele será o seu array de tamanho variável.}


TList.create; {Sem grandes problemas, só não vá criar vários, você só precisa de um.

Para incluir um novo elemento na lista:}


procedure TForm1.Button1Click(Sender: TObject);
var
LocalLinha : PLinha;
begin
LocalLinha := New(PLinha);
LocalLinha^.coluna1 := 'item1';
LocalLinha^.coluna2 := 'item2';
LocalLinha^.coluna3 := 'item3';
LocalLinha^.coluna4 := 'item4';
DisplayRecord(MLinha.Add(LocalLinha));
end; {A função New() reserva memória para um novo elemento do tipo passado como parâmetro e retorna um ponteiro para esse local.

Para acessar os dados de um item em particular:}


procedure TForm1.DisplayRecord(Const LocalRecord: integer);
var
LocalLinha : PLinha;
begin
LocalLinha := MLinha.items[LocalRecord];
edit1.text := LocalLinha^.coluna1;
edit2.text := LocalLinha^.coluna2;
edit3.text := LocalLinha^.coluna3;
edit4.text := LocalLinha^.coluna4;
end; {Você não deve esquecer que esta trabalhando com ponteiros.

Quando terminar de usar os dados tem de limpar a memória que usou, abaixo segue uma função genérica que vai funcionar com qualquer TList.

Procedimento que limpa uma TList:}


procedure EmptyTList(Var AList: TList);
var
intContador: integer;
begin
for intContador:= (AList.Count-1) Downto 0 do
begin
Dispose(AList.Items[intContador]);
AList.Delete(intContador);
end;
end; {A função Dispose() libera a memória reservada pelo New().

E depois de limpar, destrua(TList.free). }

Nenhum comentário:

Postar um comentário