como extrair arquivos de recursos para um diretório?

Delphi

15/05/2004

Pretendo adicionar 02 arquivos (teste.bmp e Teste.ini) num arquivo de
recursos e depois chamá-lo fazendo com que os arquivos Teste.bmp e
Teste.ini sejam extraídos para o diretório C:

Meu arquivo de recursos (Teste.rc) está assim:

BITMAP_1 BITMAP ´Teste.bmp´

RECURSO1 RCDATA ´Teste.ini´

No meu exemplo, acho que o arquivo Teste.ini é copiado sem problemas,
porém o arquivo Teste.bmp é copiado com problemas! Aparece a seguinte mensagem: O Paint não pode ler este arquivo. Este não é um arquivo de bitmap válido ou o seu formato não é atualmente aceito.
Com certeza esta chamada que usei para o arquivo Teste.bmp está
errada ou incorreta! [color=red:ff62e961bb]Será que alguém pode explicar como acertar isto?[/color:ff62e961bb]

{código fonte do meu exemplo:}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, FileCtrl;

type
TForm1 = class(TForm)
EdCaminho: TEdit;
Label1: TLabel;
BtnCopiar: TButton;
procedure BtnCopiarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
{$R Teste.res}

procedure TForm1.BtnCopiarClick(Sender: TObject);
var
DirDestino : String;
NomeArquivo1: String;
NomeArquivo2: String;
Fres : TResourceStream;
Fres2 : TResourceStream;
fFile : TFileStream;
fFile2 : TFileStream;
begin
DirDestino := EdCaminho.Text;
if DirDestino = ´´ then
MessageDlg(´Preencha o Diretório de Destino.´,mtError,[mbOK],0)
{para usar DirectoryExists, FileCtrl deve ser declarado na cláusula uses.}
else if not (DirectoryExists(EdCaminho.Text)) then
MessageDlg(´O diretório de destino não existe.´,mtError,[mbOK],0)
else
begin
NomeArquivo1 := ´Teste.ini´;
NomeArquivo2:= ´Teste.bmp´;
{Cria uma instância de TResourceStream para manipulá-lo mais tarde}
Fres := TResourceStream.Create(0,´RECURSO_1´ ,RT_RCDATA);
Fres2 := TResourceStream.Create(0,´BITMAP_1´, RT_BITMAP);
{Cria em memória o arquivo gravado no Resource}
fFile := TFileStream.Create(DirDestino + ´\´ + NomeArquivo1,fmCreate);
fFile2 := TFileStream.Create(DirDestino + ´\´ + NomeArquivo2,fmCreate);
try
{Cópia do Resource}
Ffile.CopyFrom(Fres,Fres.Size);
Ffile2.CopyFrom(Fres2,Fres2.Size);
MessageDlg(´Os Arquivos: ´ + NomeArquivo1 +´ ,´ + NomeArquivo2 + ´ foram copiados com êxito.´,mtInformation,[mbOK],0);
finally
{Libera as variáveis necessárias.}
Fres.Free;
Fres2.Free;
Ffile.Free;
Ffile2.Free;
end;
end;
end;

end.


Ginosam

Ginosam

Curtidas 0

Respostas

Ginosam

Ginosam

15/05/2004

Opa, desculpem, meu arquivo de recursos (Teste.rc) está assim:


BITMAP_1 BITMAP ´Teste.bmp´

RECURSO_1 RCDATA ´Teste.ini´


GOSTEI 0
Ginosam

Ginosam

15/05/2004

Oi, pessoal, valeu, mas já consegui acertar o meu programa! Alterei o arquivo de recursos e agora está funcionando beleza!

Aonde está escrito BITMAP, alterei para RCDATA

(não sei se isto é o correto mas o que interessa é que está funcionando sem nenhum erro!)


GOSTEI 0
Gustavoguim

Gustavoguim

15/05/2004

Arquivos de Recursos

“Resource Files” ou “Arquivos de Recurso” são o assunto deste artigo. É comum entre os programadores criar arquivos de recurso que contenham
imagens para utilização em botões, menus e outras áreas visuais do projeto. Mas o que pouca gente sabe, é que arquivos de recurso suportam outras extensões além de bitmaps ou ícones como a maioria costuma usar.

Os arquivos de recurso podem conter extensões MP3, JPG, DLL, TXT e até mesmo outros executáveis. O que torna nossa aplicação bastante flexível, já que os recursos são compilados com nosso executável. Desta forma vamos aprender como extrair “txts” de nosso executável já compilado.

Esta prática pode ser útil na hora de instalar nosso aplicativo em novos clientes. Vamos imaginar que em determinado diretório do computador ao qual receberá nossa aplicação, precisamos de três arquivos de configuração para que o mesmo funcione corretamente. Estes arquivos serão Arquivo1.txt, Arquivo2.txt e Arquivo3.txt.

Não entrarei em detalhes sobre o conteúdo dos arquivos, vamos apenas criá-los fisicamente no diretório indicado.

A primeira providência é criar um diretório para nossa nova aplicação. Logo após, no diretório criado, crie um arquivo (texto) com a extensão “RC”. Para isso abra o Bloco de Notas ou outro aplicativo de edição de textos de sua preferência e nele digite o seguinte:

Recurso1 RCDATA arquivo1.txt
Recurso2 RCDATA arquivo2.txt
Recurso3 RCDATA arquivo2.txt

Salve este arquivo como recursos.rc.

Crie agora três arquivos texto com os nomes arquivo1.txt,arquivo2.txt e arquivo3.txt).
Não esqueça: você deve criar todos os arquivos no mesmo local do seu arquivo recursos.rc

Para transformá-lo em um “resource file”, você precisa rodar o aplicativo BRCC32.EXE. Este programa acompanha a instalação do Delphi e pode ser “rodado” diretamente no prompt do DOS. Então abra uma janela DOS e vá até o diretório de sua aplicação e digite o comando:

BRCC32 –r –32 recursos.rc

Será criado um novo arquivo com o nome “recursos.res”.
Pronto, agora vamos a programação.

Abra o Delphi e vamos desenvolver uma aplicação capaz de extrair do Resource File os três txts nele contido.

Inicie um novo projeto.
Vá até o código fonte do Form1 e encontre a linha:

{$R *.dfm}


Adicione logo a baixo a diretiva de compilação:

{$R arquivos.res}

Desta maneira o recursos.res será agregado ao nosso executável.
Insira em nosso form os seguintes componentes e configure suas propriedades conforme mostrado abaixo:

1 Edit
Text = C:\
Name = edCaminho

1 Label
Caption = Destino do Arquivo

1 Button
Caption = Copiar
Name = btnCopiar

Agora faremos a extração dos arquivos.
Para a extração digite os o código da listagem abaixo no evento onClick de nosso Botão:

procedure TForm1.btnCopiarClick(Sender: TObject);
var
DirDestino : String;
NomeArquivo: String;
I : Integer;
Fres : TResourceStream;
fFile : TFileStream;
begin
DirDestino := edCaminho.Text;
if DirDestino = ´´ then
MessageDlg(´Preencha o Diretório de Destino.´,mtError,[mbOK],0)
else if not (DirectoryExists(edCaminho.Text)) then
MessageDlg(´O diretório de destino não existe.´,mtError,[mbOK],0)
else
begin
{For de 1 a 3, pois no exemplo temos 3 arquivos declarados no .RES}
for I := 1 to 3 do
begin
NomeArquivo := ´Arquivo´ + IntToStr(I) + ´.cdr´;
{Cria uma instância de TResourceStream para manipulá-lo mais tarde}
Fres := TResourceStream.Create(0,´RECURSO´ + IntToStr(I),RT_RCDATA);
{Cria em memória o arquivo gravado no Resource}
fFile := TFileStream.Create(DirDestino + ´\´ + NomeArquivo,fmCreate);
try
{Copia do Resource}
Ffile.CopyFrom(Fres,Fres.Size);
MessageDlg(´O Arquivo: ´ + NomeArquivo + ´ foi copiado com êxito.´,mtError,[mbOK],0);
finally
{Libera as variáveis necessárias.}
Fres.Free;
Ffile.Free;
end;
end;
end;
end;


Pronto, agora basta compilar o executável.
Com nosso exemplo aberto digite um caminho no Edit (edCaminho) e clique no botão Copiar. Os arquivos Arquivo1.txt, Arquivo2.txt e Arquivo3.txt serão copiados para o caminho especificado no Edit.


Por Adriano Santos


eu achei isso aqui tenta ai...... 8)


GOSTEI 0
Ginosam

Ginosam

15/05/2004

É isso aí, Gustavoguim. Este exemplo, que você mostrou é o mesmo que eu usei, na verdade, acho que que ele está disponível aqui mesmo num artigo do ClubeDelphi, mas fiz pequenas alterações de acordo com às minhas necessidades.
Valeu, Gu!


GOSTEI 0
POSTAR