3. Aplicação Prática 2: Usando streams para criar cartões eletrônicos executáveis
Muitas vezes vemos alguns softwares de criação de cartões eletrônicos que permitem que você mesmo escolha as fotos e depois
Ele irá gerar um arquivo executável EXE para você. Ao abrir o cartão comemorativo, a imagem será exibida enquanto a música é reproduzida.
Agora que aprendemos as operações de fluxo, também podemos fazer uma.
No processo de adição de imagens, podemos usar diretamente o Cjt_AddtoFile anterior, e o que precisamos fazer agora é como
A imagem é lida e exibida. Usamos o Cjt_LoadFromFile anterior para ler a imagem e salvá-la como um arquivo.
Também é possível transferir, mas existe uma maneira mais simples, que é ler diretamente o fluxo de arquivos e exibi-lo com.
Com esta poderosa ferramenta tudo fica mais fácil.
As imagens mais populares hoje em dia são os formatos BMP e JPG. Escreveremos agora sobre esses dois tipos de imagens
Saia da função de leitura e exibição.
Função Cjt_BmpLoad(ImgBmp:TImage;SourceFile:String):Boolean;
var
Fonte:TFileStream;
MeuFileSize:inteiro;
começar
Fonte:=TFileStream.Create(SourceFile,fmOpenRead ou fmShareDenyNone);
tentar
tentar
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//Lê recursos
Source.Seek(-MyFileSize,soFromEnd);//Localiza a posição inicial do recurso
ImgBmp.Picture.Bitmap.LoadFromStream(Fonte);
finalmente
Fonte.Grátis;
fim;
exceto
Resultado:=Falso;
Saída;
fim;
Resultado:=Verdadeiro;
fim;
A descrição acima é uma função para leitura de imagens BMP e a seguir é uma função para leitura de imagens JPG. Como são usadas unidades JPG, portanto.
Para adicionar uma frase ao programa: usa jpeg.
Função Cjt_JpgLoad(JpgImg:Timage;SourceFile:String):Boolean;
var
Fonte:TFileStream;
MeuFileSize:inteiro;
Meujpg: TJpegImage;
começar
tentar
Meujpg:= TJpegImage.Create;
Fonte:=TFileStream.Create(SourceFile,fmOpenRead ou fmShareDenyNone);
tentar
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));
Source.Seek(-MyFileSize,soFromEnd);
Myjpg.LoadFromStream(Fonte);
JpgImg.Picture.Bitmap.Assign(Meujpg);
finalmente
Fonte.Grátis;
Meujpg.free;
fim;
exceto
Resultado:=falso;
Saída;
fim;
Resultado:=verdadeiro;
fim;
Com estas duas funções podemos fazer um programa de leitura. Vamos pegar fotos BMP como exemplo:
Execute o Delphi, crie um novo projeto e coloque um controle de exibição de imagem Image1. Criar na janela
Basta escrever uma frase no evento:
Cjt_BmpLoad(Image1,aplicativo.ExeName);
Este é o arquivo de cabeçalho e, em seguida, usamos o método anterior para gerar um arquivo de recurso head.res.
Agora podemos começar a fazer nosso programa complementar. Todo o código é o seguinte:
unidade Unidade1;
interface
usa
Windows, Mensagens, SysUtils, Classes, Gráficos, Controles, Formulários, Diálogos,
ExtCtrls, StdCtrls, ExtDlgs;
tipo
TForm1 = classe(TForm)
Editar1: TEdit;
Botão1: Botão T;
Botão2: Botão T;
OpenPictureDialog1:TOpenPictureDialog;
PRocedure FormCreate(Remetente: TObject);
procedimento Button1Click(Remetente: TObject);
procedimento Button2Click(Remetente: TObject);
privado
Função ExtractRes(ResType, ResName, ResNewName: String):boolean;
Função Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
{Declarações privadas}
público
{Declarações públicas}
fim;
var
Formulário1: TForm1;
implementação
{$R *.DFM}
Função TForm1.ExtractRes(ResType, ResName, ResNewName : String):boolean;
var
Res: TResourceStream;
começar
tentar
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
tentar
Res.SavetoFile(ResNovoNome);
Resultado:=verdadeiro;
finalmente
Res.Livre;
fim;
exceto
Resultado:=falso;
fim;
fim;
Função TForm1.Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;
var
Destino,Fonte:TFileStream;
MeuFileSize:inteiro;
começar
tentar
Fonte:=TFileStream.Create(SourceFile,fmOpenRead ou fmShareExclusive);
Destino:=TFileStream.Create(TargetFile,fmOpenWrite ou fmShareExclusive);
tentar
Target.Seek(0,soFromEnd);//Adiciona recursos ao final
Target.CopyFrom(Fonte,0);
MyFileSize:=Source.Size+Sizeof(MyFileSize);//Calcula o tamanho do recurso e escreve-o no final do processo auxiliar
Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));
finalmente
Alvo.Grátis;
Fonte.Grátis;
fim;
exceto
Resultado:=Falso;
Saída;
fim;
Resultado:=Verdadeiro;
fim;
procedimento TForm1.FormCreate(Remetente: TObject);
começar
Legenda:='Programa de demonstração Bmp2Exe Autor: Chen Jingtao';
Editar1.Texto:=';
OpenPictureDialog1.DefaultExt := GraphicExtension(TBitmap);
OpenPictureDialog1.Filter := GraphicFilter(TBitmap);
Button1.Caption:='Selecionar imagem BMP';
Button2.Caption:='Gerar EXE';
fim;
procedimento TForm1.Button1Click(Remetente: TObject);
começar
se OpenPictureDialog1.Execute então
Edit1.Text:=OpenPictureDialog1.NomeArquivo;
fim;
procedimento TForm1.Button2Click(Remetente: TObject);
var
HeadTemp:Corda;
começar
se FileExists(Edit1.Text) então
começar
Application.MessageBox('Arquivo de imagem BMP não existe, selecione novamente!','Mensagem',MB_ICONINFORMATION+MB_OK)
Saída;
fim;
HeadTemp:=ChangeFileExt(Edit1.Text,'.exe');
se ExtractRes('exefile','head',HeadTemp) então
se Cjt_AddtoFile(Edit1.Text,HeadTemp) então
Application.MessageBox('Arquivo EXE gerado com sucesso!','Mensagem',MB_ICONINFORMATION+MB_OK)
outro
começar
se FileExists(HeadTemp) então DeleteFile(HeadTemp);
Application.MessageBox('Falha na geração do arquivo EXE!','Mensagem',MB_ICONINFORMATION+MB_OK)
fim;
fim;
fim.
Que tal? É incrível :) Deixe a interface do programa mais bonita e adicione algumas funções, você descobrirá que é melhor que
Não será muito pior do que aqueles softwares que precisam ser registrados.