Trabalhando com string lists




Aplicações freqüentemente necessitam controlar listas de caracteres strings. Exemplo: incluir itens em um combo box, linhas em um memo, nomes de fonts, e nomes de linhas e colunas num string grid.


A VCL provê uma interface comum para qualquer lista de strings através de um objeto chamado TStrings e seu descendente TStringList. Além disso para prover funcionalidade para manutenção de string lists, esses objetos permitem fácil inter-operacionalidade; por exemplo, você pode editar as linha de um memo (o qual é uma instância de TStrings) e então usar essas linha como itens num combo box (também uma instância de TStrings).


Uma propriedade string list aparece no Object Inspector com TStrings na coluna da direita (exemplo Lines - TString; Items - TString). Dê um duplo clique em TStrings para abrir o String list editor, onde você pode editar, adicionar ou deletar linhas.


Você também pode trabalhar com objetos string list em tempo de execução para realizar tarefas como:


Carregar e salvar string lists;


Criar uma nova string list;


Manipular strings numa lista;


Associar objetos com uma string list;





Carregando e salvando string lists




Objetos string list provêem métodos SaveToFile e LoadFromFile que nos permitem armazenar uma string list num arquivo texto e carregar o arquivo texto para dentro de uma string. Cada linha no arquivo texto corresponde a uma string numa lista. Usando esses métodos, você pode, por exemplo, criar um simples editor de textos para carregar um arquivo em um componente memo, ou salvar listas de itens para combo boxes.

O exemplo a seguir carrega uma cópia do arquivo WIN.INI para dentro de um campo memo e faz uma cópia (backup) chamada WIN.BAK.



void __fastcall EditWinIni()

{
AnsiString FileName = "C:\WINDOWS\WIN.INI"; // marque o nome do arquivo
Form1->Memo1->Lines->LoadFromFile(FileName); // carregue o arquivo
Form1->Memo1->Lines->SaveToFile(ChangeFileExt(FileName, ".BAK")); // salve o backup
}




Criando uma nova string list




Um string list é, tipicamente, parte de um componente. Mas, de qualquer forma, há horas em que é conveniente criar string lists independentes, por exemplo para armazenar strings para uma tabela look up. O caminho para você criar e gerenciar um string list depende se a lista é para período curto de prazo (construída, usada e destruída numa simples rotina) ou longo período (disponível até que a aplicação feche). Dependendo do tipo de sring list que você criar, lembre-se que você é responsável por liberar a lista quando você terminar com ela (liberar a memória).


Lista para período curto de prazo


Se você usar um string list somente para a duração de uma rotina, você deve criá-la, usá-la e destruí-la totalmente em único local. Este é o caminho seguro para trabalhar com strings lists:


NOTA: Visto que o objeto string list aloca memória para si e para suas strings, você deve usar um bloco try...__finally para assegurar que a memória é liberada mesmo se ocorrer uma exceção.


1 - Construir o objeto string-list.


2 - Na parte tentativa de um bloco try...__finally, use a string list.


3 - Na parte final __finally, libere o objeto string-list.


O seguinte evento handler responde a um clique de um botão para construir uma string list, usá-la, e então destruí-la.



void __fastcall TForm1::ButtonClick1(TObject *Sender)

{
TStringList *TempList = new TStringList; // declare a lista 
Try
{
//use o string list
}

__finally
{
delete TempList; // destrói o objeto list 
}
}



String lists para longo período


Se uma string list precisa estar disponível por mais tempo enquanto sua aplicação executa, construir a lista no início da aplicação (start-up) e destruí-la antes de a aplicação terminar.


1 No arquivo Unit para o form principal de sua aplicação, adicione um campo do tipo TStrings para a declaração do form.


2 Escreva um evento handler para o construtor de form principal, o qual executa antes de o form aparecer. Ele deve criar um string list e designá-lo para o campo que você declarou no primeiro passo.


3 Escreva um evento handler que libera o pelo evento OnDestroy do form.


Este exemplo usa um string list de longo período para gravar os cliques no mouse do usuário no form principal, então salva a lista em um arquivo antes de a aplicação terminar.



//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ClickList = new TStringList;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
ClickList->SaveToFile(ChangeFileExt(Application->ExeName, ".LOG")); //Salve a lista
delete ClickList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
TVarRec v[] = {X,Y};
ClickList->Add(Format("Click at (%d, %d)",v,ARRAYSIZE(v) - 1)); //adicione um string para a lista 
}




Manipulando strings numa lista




Operações que geralmente executam uma string lists incluem:


Conta as strings numa lista;

Acesso a uma string particular;

Busca a posição de uma string em uma lista;

Repetir strings numa lista;

Adicionar uma string na lista;

Mover uma string dentro de uma lista;

Deletar um string de uma lista;

Copiar um string list por completo.




Contando a strings numa lista




A propriedade Count retorna o número de strings numa lista. Visto que string lists usam índex base zero (zero-based indexes), Count é um (1) a mais que o índex da última string.




Acessando uma particular string




A propriedade Strings array contém a string na lista, referenciado por um índex base zero. Pelo fato de Strings ser uma propriedade default para string lists, você pode omitir o identificador Strings quando acessar uma lista; desse modo:


StringList1->Strings[0] = "Esta é a primeira string.";


É equivalente a


StringList1[0] = "Esta é a primeira string.";


Usamos Strings para ler ou modificar a string de uma posição em particular. Index contém a posição da string, onde 0 é a posição da primeira string, 1 é a posição da segunda string, e assim por diante. Para localizar uma string em especial na lista, devemos chamar o método IndexOf.




Buscando a posição de uma string numa lista




Para localizar um string numa string list, use o método IndexOf.


IndexOf retorna o índex da primeira string numa lista que compara o parâmetro que lhe foi passado, e retorna - 1 se o parâmetro string não foi encontrado. IndexOf procura somente a exata identidade; Se você quiser identificar strings parciais, você deve procurar através da string list por si mesmo.


Por exemplo, você pode usar IndexOf para determinar se um determinado nome de arquivo encontra-se entre os itens de um list box:


if (FileListBox1->Items->IndexOf("WIN.INI") > -1) ...




Reiterando através de strings na lista



Para reformar strings numa lista, use um loop for que executa desde zero a Count – 1.

Este exemplo converte cada string de um list box para caracteres maiúsculos.



void __fastcallTForm1::Button1Click(TObject *Sender)

{
for (int i = 0; i < ListBox1->Items->Count; i++)
ListBox1->Items->Strings[i] = UpperCase(ListBox1->Items->Strings[i]);
}




Adicionando uma string a uma lista




Para adicionar uma string ao fim de um string list, chamar o método Add, passando a nova string como parâmetro. Para inserir um string numa lista, chamar o método Insert, passando dois parâmetros: a string e o índex da posição onde você quer que ela seja colocada. Por exemplo, para tornar a string “Three” a terceira string numa lista, você poderia usar:


StringList1->Insert(2, "Three");



Para anexar a string de uma lista em outra, chamar AddStrings:


StringList1->AddStrings(StringList2); // anexa a string de StringList2 em StringList1





Deletando uma string desde uma lista




Para deletar um string de um string list, chamar o método Delete list’s, passando o índex da string que você quer deletar. Se você não sabe o índex da lista que você quer deletar, use o método IndexOf para localizá-lo. Para deletar todas as strings num string list, use o método Clear.


Este exemplo usa IndexOf e Delete para encontrar e deletar uma string:



int BIndex = ListBox1->Items->IndexOf("bureaucracy");

if (BIndex > -1)
ListBox1->Items->Delete(BIndex);




Copiando uma completa string list



Você pode usar o método Assign para copiar strings de uma lista e destiná-la a outra lista, sobrescrevendo o conteúdo da lista de destino. Para anexar strings fora da escrita da lista de destino, use AddStrings. Por exemplo,


Memo1->Lines->Assign(ComboBox1->Item)s; //sobrescreve strings originais


copia as linhas de um combo box em um memo (sobrescrevendo o memo), enquanto


Memo1->Lines->AddStrings(ComboBox1->Items); //anexa strings no fim


anexa as linhas de um combo box no memo.


Quando fizer cópia local de um string list, use o método Assign. Se você determinar um (1) variável string list para outro —


StringList1 = StringList2;


— o objeto string-list original perde-se, freqüentemente com resultados imprevisíveis.




Associando objetos com um string list




Além disso para as strings armazenadas na propriedade Strings, um string list pode manter referências a objetos, o qual armazena em sua propriedade Objects. Assim Strings, Objects são umas array com índex baseado em zero. O uso mais comum para Objects é associação de bitmaps com strings por controles owner-draw (desenho proprietário).


Use o método AddObject ou InsertObject para adicionar uma string e um objeto associado à uma lista em um único passo. IndexOfObject retorna o índex da primeira string na lista associada com um objeto específico. Métodos como Delete, Clear, e Move operam tanto em strings como nos objetos; Por exemplo, deletar uma string remove o objeto correspondente (se havia um).


Para associar um objeto com uma string existente, assinar o objeto para a propriedade Objects em um mesmo índex. Você não pode adicionar um objeto de fora acrescentando a string correspondente.




anterior

índice

próxima


HOME || MAPA DO SITE || CURSOS || TUTORIAIS || LINKS || FORUM || CONTATO