sábado, 17 de outubro de 2009

Usando a classe tstream

{Usando a classe TStream:
A classe TStream é uma base para componentes que trabalham com dados acumulados em forma de bytes.
Como a classe TStream é uma base ela não pode ser utilizada diretamente, será necessário usar uma classe descendente como TFileStream ou TMemoryStream, existem outras mas nós vamos falar somente destas.
Como ler dados usando o TStream:
Para ter acesso aos dados de um TStream em primeiro lugar deve ser verificada a propriedade Size para saber se o stream não está vazio ou seja, maior que zero.
Outra coisa que deve ser verificada é a propriedade position para saber posição do stream. Por exemplo: Se o tamanho (Size) do stream é 5 bytes e a posição (position) é 3, só será possível ler os últimos 2 bytes.
Para ler os bytes use a função Read, esta função retorna o número de bytes que foram lidos. ?
}
var
MeuByte: byte;
begin
Stream1.Position:= 0;
if Stream1.Size > 0 then Stream1.Read(MeuByte,SizeOf(MeuByte));
end;
{Veja que neste exemplo foi declarado a variável MeuByte do tipo byte para servir de reservatório, a posição foi movida para zero e foi verificado o tamanho do stream e a função Read pegou 1 byte do stream copiou para a variável MeuByte alem disso a função Read também mudou a posição para 1 e retornou o numero 1 que indica que foi copiado 1 byte.
A variável MeuByte deve conter o valor do primeiro byte do stream que será um número entre 0 e 255.
Note que usamos a função SizeOf para saber o tamanho da variável MeuByte mas nós poderíamos ter colocado 1 no lugar de SizeOf porque variáveis do tipo byte tem o tamanho de 1 byte.
Como gravar dados no TStream:
Para gravar dados nós utilizamos a função Write, deve-se levar em consideração a propriedade Position para saber onde serão gravados os dados, se a posição for 0 a função Write vai sobrepor os dados do stream, se a posição for igual ao tamanho do stream (Position = Size) a função vai adicionar os novos dados aos já existentes e aumentar o tamanho do stream. }
var
MeuByte: byte;
begin
MeuByte:= 23;
Stream1.Write(MeuByte,SizeOf(MeuByte));
end;
{No exemplo acima nós mudamos o valor da variável MeuByte para 23 e a função Write gravou o número 23 no stream ocupando 1 byte de espaço na memória e também somou 1 a posição atual.
Copiando dados de um stream para outro:
A classe TStream tem uma função chamada CopyFrom que serve para copiar um determinado número de bytes de outro stream. }
begin
Stream2.Position:= 25;
Stream1.CopyFrom(Stream2,250);
end;
{A função CopyFrom pegou 250 bytes a partir da posição 25 do Stream2 e copiou para o Stream1.
Neste exemplo nós não verificamos se o Stream2 tem 275 bytes de tamanho para que fossem copiados os 250 bytes, se o Stream2 tiver menos de 275 byte a função CopyFrom vai copiar todos os bytes que puder e retornar o número de bytes que foram copiados, isto também vale para função Read.
Usando a função Seek:
Até agora nós usamos a propriedade Position para mudar a posição do stream mas também podemos utilizar a função Seek que tem algumas opções que facilitam nossa programação.
function Seek(Offset: Longint; Origin: Word): Longint;
A função Seek tem dois parâmetros:
Offset - Indica o número de bytes vamos mover a posição.
Origin - Especifica a partir de onde deve ser movido. Podem ser usadas uma das três opções abaixo:
soFromBeginning: indica que a posição deve ser movida a partir do inicio ou seja, da posição zero.
soFromCurrent:: indica que deve movido a partir da posição atual. (Position + Offset)
soFromEnd: indica que deve ser movido a partir do fim. Então o valor do Offset deverá ser negativo para não haver erro. }
begin
Stream1.Seek(-25,soFromEnd);
end;
{Neste exemplo nós voltamos 25 bytes na posição a partir do fim, se o tamanho do Stream1 for de 100 bytes a posição atual será 75.
Usando o TFileStream:
O TFileStream é o descendente do TStream usado para manipular arquivos.
O método Create é um pouco diferente dos outros.
constructor Create(const FileName: string; Mode: Word);
Para criar um TFileStream devemos informar o nome do arquivo desde a letra da unidade de disco incluindo pastas e sub-pastas até a extensão mesmo que este arquivo não exista.
O parâmetro Mode vai definir como será usado o arquivo, podemos usar as seguintes opções:
fmCreate: para criar um novo arquivo.
fmOpenRead: para abrir e apenas ler os dados do arquivo
fmOpenWrite: para abrir e apenas gravar dados no arquivo, isto faz com que os dados atuais do arquivo sejam completamente apagados.
fmOpenReadWrite: para abrir, ler e gravar dados no arquivo.
Exemplo geral para abrir e ler um arquivo: }
var
Arquivo: TFileStream;
Texto: array[0..19]of Char;
begin
Arquivo:= TFileStream.Create('c:Autoexec.bat',fmOpenRead);
Arquvo.Read(Texto, SizeOf(Texto));
Arquivo.Free;
end;
{Neste exemplo nós abrimos o Autoexec.bat e copiamos os 20 primeiros caracteres para a variável Texto.
O TMemoryStream:
O MemoryStream é usado para manipular dados na memória, a diferença mais importante é a alta velocidade no acesso aos dados e o MemoryStream também tem a capacidade de abrir e salvar arquivos através das funções LoadFromFile e SaveToFile.
Acho que já deu para ter uma idéia de como funciona um TStream, o que está aqui é só uma pequena parte, consulte a ajuda do Delphi e veja outros componentes descendentes do TStream tenho certeza que será de grande ajuda em seus futuros projetos.
Inserindo arquivos dentro do aplicativo:
Provavelmente você já deve conhecer os arquivos de recursos(.res) que são usados por seu aplicativo para acessar bitmaps, ícones e cursores e que podem ser criados pelo Image Editor do próprio Delphi.
Mas estes arquivos não servem apenas para isso você pode inserir outros arquivos como os de som Mp3, Wave, Midi e qualquer outro formato e também é possível por qualquer outro arquivo até mesmo outro Aplicativo.
Como inserir os arquivos?
1. Crie uma pasta no seu HD com um nome amigável. Por exemplo 'C:MP3 Res'.
2. Copie todos os arquivos que deseja inserir em seu arquivo de recursos.
3. Crie um arquivo de texto(.txt) nessa pasta. Exemplo 'Mp3Res.txt'.
4. Neste arquivo de texto digite um nome que será usado como referência para o arquivo, dê um espaço e digite a classificação de tipo do arquivo por exemplo(WAVFILE para Arquivos de som Wave), dê outro espaço e digite o nome real do arquivo com a exetensão, para outro arquivo digite na linha seguinte.
Exemplo geral( SOM_ROCK MP3FILE ROCK.MP3 ).
5. Compile o arquivo de texto usando o Brcc32.exe(no diretório DelphiBin) por linha de comando. Exemplo: Brcc32.exe C:MP3 ResMp3Res.txt.
6. O Brcc32 vai gerar um arquivo de recursos com o mesmo nome do arquivo de texto. Exemplo 'Mp3Res.RES'.
7. Copie este arquivo para a pasta onde está o projeto.
8. Agora no Delphi abra o projeto que você deseja inserir o arquivo de recursos, click no menu Projects | View Source e digite {$R Mp3Res.RES}
{9. Pronto agora é só Compilar o projeto e os arquivos vão estar dentro do aplicativo.
DICA: No tópico 5 você pode criar na pasta um atalho para o Brcc32, depois dê um clique com o botão esquerdo do mouse sobre o arquivo de atalho e clique em 'Propriedades', no campo objeto depois do "C:...DelphiBinbrcc32.exe" dê um espaço e digite entre aspas duplas o nome do arquivo de texto que você criou com o caminho completo. Exemplo: "C:MP3 ResMp3Res.txt".
Pronto para compilar o arquivo dê um clique duplo no atalho.
OBS.: Se for colocar muitos arquivos como em programas de instalação é recomendável compactar os arquivos antes de criar o arquivo de recursos.
Como usar os arquivos?
Abaixo está o procedimento que vamos usar para extrair o Rock.mp3 e grava-lo no disco.}
procedure ExtraiArq;
var
Arq: TResourceStream;
begin
Arq:= TResourceStream.Create(HInstance, 'SOM_ROCK', 'MP3FILE');
try
Arq.SaveToFile('Rock.mp3');
finally
Arq.Free;
end;
end;
{OBS.: Se os arquivos estiverem compactados inclua o algoritmo de descompactação antes de salvar o arquivo.}

Nenhum comentário:

Postar um comentário