Mecanismo de leitura e gravação de componentes do Delphi (1)
1. Introdução aos objetos de streaming (Stream) e objetos de leitura e gravação (Filer)
Na programação orientada a objetos, o gerenciamento de dados baseado em objetos desempenha um papel importante. No Delphi, o suporte para gerenciamento de dados baseado em objetos é um recurso importante.
Delphi é um ambiente de desenvolvimento integrado que combina design visual orientado a objetos com linguagem orientada a objetos. O núcleo do Delphi são os componentes. Componente é um tipo de objeto. As aplicações Delphi são inteiramente construídas a partir de componentes, portanto, o desenvolvimento de aplicações Delphi de alto desempenho envolverá inevitavelmente tecnologia de gerenciamento de dados baseada em objetos.
O gerenciamento de dados de objetos inclui dois aspectos:
● Use objetos para gerenciar dados
● Gerenciamento de vários objetos de dados (incluindo objetos e componentes)
Delphi resume classes de gerenciamento de dados baseadas em objetos em objetos Stream (Stream) e objetos Filer (Filer) e os aplica a todos os aspectos da Visual Component Class Library (VCL). Eles fornecem funções avançadas para gerenciar objetos na memória, armazenamento externo e recursos do Windows.
Objeto de fluxo, também conhecido como objeto de streaming, é o nome coletivo de TStream, THandleStream, TFileStream, TMemoryStream, TResourceStream e TBlobStream. Eles representam, respectivamente, a capacidade de armazenar dados em vários meios de comunicação. Eles abstraem as operações de gerenciamento de vários tipos de dados (incluindo objetos e componentes) na memória, memória externa e campos de banco de dados em métodos de objeto e fazem pleno uso da tecnologia orientada a objetos. A vantagem é que os aplicativos podem copiar dados em vários objetos Stream com bastante facilidade.
Objetos de leitura e gravação (Filer) incluem objetos TFiler, objetos TReader e objetos TWriter. O objeto TFiler é o objeto básico para leitura e gravação de arquivos TReader e TWriter são usados principalmente em aplicativos. Os objetos TReader e TWriter herdam diretamente dos objetos TFiler. O objeto TFiler define as propriedades e métodos básicos do objeto Filer.
O objeto Filer completa principalmente duas funções principais:
● Acessar arquivos de formulário e componentes em arquivos de formulário
● Fornece buffer de dados para acelerar as operações de leitura e gravação de dados
Para ter uma compreensão perceptiva de objetos de streaming e objetos de leitura e gravação, vejamos primeiro um exemplo.
a)Escreva um arquivo
Procedimento TFomr1.WriteData (Remetente: TObject r);
Var
FileStream:TFilestream;
Meu escritor:TWriter;
eu: inteiro
Começar
FileStream:=TFilestream.create('c:/Test.txt',fmopenwrite);//Cria um objeto de fluxo de arquivo
Mywriter:=TWriter.create(FileStream,1024); //Associar Mywriter ao FileStream;
Mywriter.writelistbegin; //Escrever sinalizador de início da lista
Para i:=0 para Memo1.lines.count-1 faça
Mywriter.writestring(memo1.lines[i]); //Salva as informações de texto do componente Memo no arquivo
Mywriter.writelistend; //escreve a marca final da lista
FileStream.seek(0,sofrombeginning); //O ponteiro do objeto do fluxo de arquivo se move para o início do fluxo
Mywriter.free; //Libera o objeto Mywriter.
FileStream.free; //Libera o objeto FileStream
Fim;
b) Ler arquivos
procedimento TForm1.ReadData(Remetente: TObject);
Var
FileStream:TFilestream;
Meu leitor: TReader;
Começar
FileStream:=TFilestream.create('c:/Test.txt',fmopenread);
Myreader:=TRreader.create(FileStream,1024); //Associar Myreader ao FileStream;
Myreader.readlistbegin; //Leia a marca inicial da lista escrita
Memo1.lines.clear; //Limpa o conteúdo de texto do componente Memo1
Embora não seja myreader.endoflist do //Preste atenção em um método do TReader: endoflist
Começar
Memo1.lines.add(myreader.readstring); //Adiciona a string de leitura ao componente Memo1
Fim;
Myreader.readlistend; //Lê a marca final da lista escrita
Myreader.free; //Libera o objeto Myreader
FileStream.free; //Libera o objeto FileStream
Fim;
Os dois processos acima, um é um processo de escrita e o outro é um processo de leitura. O processo de gravação passa pelo TWriter e usa o TFilestream para salvar o conteúdo (informações de texto) em um Memo como um arquivo binário salvo no disco. O processo de leitura é exatamente o oposto do processo de escrita. Através do TReader, o TFilestream é usado para converter o conteúdo do arquivo binário em informações de texto e exibi-las no Memo. Ao executar o programa, você pode ver que o processo de leitura restaura fielmente as informações salvas pelo processo de escrita.
O diagrama a seguir descreve o relacionamento entre objetos de dados (incluindo objetos e componentes), objetos de streaming e objetos de leitura e gravação.
Figura (1)
É importante notar que objetos de leitura e gravação, como objetos TFiler, objetos TReader e objetos TWriter, raramente são chamados diretamente pelos criadores de aplicativos. Eles geralmente são usados para ler e gravar o estado dos componentes. -escrever mecanismo de componente.
Para o objeto de streaming Stream, muitos materiais de referência têm introduções muito detalhadas, enquanto materiais de referência para objetos TFiler, objetos TReader e objetos TWriter, especialmente mecanismos de leitura e escrita de componentes, são raros. Este artigo irá rastrear o código original da VCL. e mecanismo de escrita.
2. Ler e escrever objetos (Filer) e mecanismos de leitura e escrita de componentes
O objeto Filer é usado principalmente para acessar arquivos de formulário Delphi e componentes no arquivo de formulário, portanto, para entender claramente o objeto Filer, você deve conhecer a estrutura do arquivo de formulário Delphi (arquivo DFM).
Arquivos DFM são usados para formulários de armazenamento Delphi. A forma é o núcleo da programação visual Delphi. O formulário corresponde à janela do aplicativo Delphi, os componentes visuais do formulário correspondem aos elementos da interface da janela e os componentes não visuais, como TTimer e TOpenDialog, correspondem a uma determinada função do aplicativo Delphi. O design dos aplicativos Delphi é, na verdade, centrado no design do formulário. Portanto, os arquivos DFM também ocupam uma posição muito importante no design de aplicações Delphi. Todos os elementos do formulário, incluindo as propriedades do próprio formulário, estão incluídos no arquivo DFM.
Na janela do aplicativo Delphi, os elementos da interface são relacionados entre si de acordo com a relação de propriedade, de modo que a estrutura em árvore é a forma mais natural de expressão, respectivamente, os componentes no formulário também são organizados de acordo com a estrutura em árvore; o arquivo DFM, também para expressar essa relação. Os arquivos DFM são armazenados fisicamente em formato de texto (antes da versão Delphi2.0, eles eram armazenados como arquivos binários) e, logicamente, os relacionamentos entre os componentes são organizados em uma estrutura de árvore. A estrutura em árvore do formulário pode ser vista claramente neste texto. Abaixo está o conteúdo do arquivo DFM:
objeto Form1: TForm1
Esquerda = 197
Superior = 124
…
PixelsPorPolegada = 96
Altura do Texto = 13
objeto Button1: TButton
Esquerda = 272
…
Legenda = 'Botão1'
OrdemDaTab = 0
fim
objeto Painel1: TPanel
Esquerda = 120
…
Legenda = 'Painel1'
OrdemDaTab = 1
objeto CheckBox1: TCheckBox
Esquerda = 104
…
Legenda = 'CheckBox1'
OrdemDaTab = 0
fim
fim
fim
Este arquivo DFM é gerado pelo TWriter através do objeto de streaming Stream. É claro que também existe um processo de conversão de um arquivo binário para um arquivo de informações de texto.
Quando o programa começa a ser executado, o TReader lê os formulários e componentes através do objeto de streaming Stream, pois quando o Delphi compila o programa, ele compilou as informações do arquivo DFM no arquivo executável usando a instrução de compilação {$R *.dfm} , e daí As leituras do TReader são, na verdade, informações sobre formulários e componentes que são compiladas no arquivo executável.
TReader e TWriter podem não apenas ler e escrever a maioria dos tipos de dados padrão em Object Pascal, mas também ler e escrever tipos avançados, como List e Variant, e até mesmo ler e escrever propriedades e componentes. No entanto, os próprios TReader e TWriter fornecem funções muito limitadas, e a maior parte do trabalho real é feita pela classe muito poderosa TStream. Em outras palavras, TReader e TWriter são, na verdade, apenas ferramentas. Eles são responsáveis apenas pela leitura e gravação de componentes. As operações específicas de leitura e gravação são realizadas pelo TStream.
Como TFiler é a classe ancestral comum de TReader e TWriter, para entender TReader e TWriter, você deve começar primeiro com TFiler.