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