Explicando o artigo
Dando continuidade ao nosso material. Hoje veremos como salvar os objetos do nosso form e restaurá-los. Dentre as possíveis funções e metodologias existentes optei por salvar o conteúdo configurado dentro de um arquivo de texto. Você poderá usar o código abaixo e adaptá-lo para utilizá-lo de uma melhor forma em seu projeto. Vamos começar por descrever alguns métodos auxiliares que foram implementados.
1. function ComponentToString (const loComponent : TComponent) : String;
Esse método é responsável por transformar qualquer componente descendente de TComponent em um string com formatação equivalente a que é usada durante a persistência dos objetos no arquivo .dfm dos formulários.
2. function StringToComponent (const lcString : String) : TComponent;
Esse método é exatamente o oposto do descrito anteriormente. A partir de uma string formatada poderemos gerar um componente
3. procedure CreateTextFile(lcFileName, lcData: String);
Cria um arquivo de texto com conteúdo especificado pelo parâmetro lcData
4. function GetTextFile(lcFileName: String): String;
Ler um arquivo de texto e retorna o seu conteúdo
Salvando os Objetos doSaveControls
O código abaixo mostra como salvar cada componente do form em um arquivo de texto
procedure doSaveControls;
var
lcPath: String;
lcDirSave: String;
lcDirForm: String;
lnCont: Integer;
lcTexto: String;
lcArquivo: String;
begin
// todos os componentes serao salvos dentro do diretorio da apllicacao
// obedecendo a seguinte estrutura
// pasta save
// ... pasta com o nome do form
// ... arquivo de texto com o nome dos componentes
lcPath := ExtractFilePath(Application.ExeName);
lcDirSave := lcPath + 'save\';
lcDirForm := lcDirSave + Self.Name + '\';
// cria os diretorios caso nao existam
if not DirectoryExists(lcDirSave) then CreateDir(lcDirSave);
if not DirectoryExists(lcDirForm) then CreateDir(lcDirForm);
// salva os componentes
for lnCont := 0 to ComponentCount - 1 do
if Components[lnCont].Tag = TAG_DINAMICO then
begin
lcTexto := ComponentToString(Components[lnCont]);
lcArquivo := lcDirForm + Components[lnCont].Name + '.txt';
CreateTextFile(lcArquivo, lcTexto);
end;
end;
Carregando os Objetos doLoadControls
procedure doLoadControls;
var
lcPath: String;
lcDirSave: String;
lcDirForm: String;
lcTexto: String;
loSearchRec: TSearchRec;
lnResult: integer;
loObj: TComponent;
begin
// caminho onde os arquivos estao salvos
lcPath := ExtractFilePath(Application.ExeName);
lcDirSave := lcPath + 'save\';
lcDirForm := lcDirSave + Self.Name + '\';
// localiza o primeiro arquivo de texto no diretorio e retorna-o para o
// objeto loSearchRec
lnResult := FindFirst(lcDirForm + '*.txt', faArchive, loSearchRec);
try
// enquanto encontrar algo
while (lnResult = 0) do
begin
// load texto
lcTexto := GetTextFile(lcDirForm + loSearchRec.Name);
// recria o componente com base no texto carregado
loObj := StringToComponent(lcTexto);
if (loObj is TWinControl) then
(loObj as TWinControl).Parent := Self
else
(loObj as TGraphicControl).Parent := Self;
// se for um memo devolve com o conteudo em branco
if (loObj is TMemo) then
(loObj as TMemo).Lines.Clear;
// adiciona o component ao form
InsertComponent(loObj);
// vai para o proximo
lnResult := FindNext( loSearchRec );
end;
finally
FindClose( loSearchRec );
end;
end;
Com isso terminamos mais um artigo.
O código fonte completo está em anexo.
Agora é com vocês.
Abaixo o link da parte 1