Jump to content


Photo

[RESUELTO] Meter recursos dentro de un ejecutable


  • Please log in to reply
10 replies to this topic

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 01 September 2009 - 11:06 AM

Meter recursos dentro de un ejecutable
Una de las cosas que mas hacen engordar el tamaño de un ejecutable es
meter los mismos botones con imagenes en distintos formularios. Si diseñamos
nuestros propios botones Aceptar y Cancelar y los vamos replicando en cada
formulario el tamaño de nuestro programa puede crecer considerablemente.
Para evitar esto lo que vamos a hacer es meter la imagen dentro de un
recurso compilado y posteriormente accederemos a la misma dentro del
programa. La ventaja de utilizar este método es que la imagen sólo esta una
vez en el programa independientemente del número de formularios donde
vaya a aparecer.
Supongamos que vamos a meter la imagen MiBoton.jpg dentro de nuestro
programa. Creamos al lado de la misma el archivo imagenes.rc el cual
contiene:
1 RCDATA MiBoton.jpg
Se pueden meter en un archivo de recursos tantas imagenes como se desee,
así­ como otros tipos de archivo (sonidos, animaciones flash, etc.). Las
siguientes lí­neas serí­an:
2 RCDATA imagen2.jpg
3 RCDATA imagen3.jpg
...
Ahora abrimos una ventana de sí­mbolo del sistema dentro del mismo
directorio donde este la imagen y compilamos el recurso:
c:\imagenes\brc32 -r -v imagenes.rc
Lo cual nos creará el archivo imagenes.res.
Ahora para utilizar el recurso dentro de nuestro programa hay que añadir
debajo de implementation (del formulario principal de la aplicación) la
directiva {$R imagenes.res}:
[glow=red,2,300]implementation
{$R *.dfm}
{$R imagenes.res}[/glow]
Esto lo que hace es unir todos los recursos de imagenes.res con nuestro
ejecutable. Para cargar la imagen dentro de un objeto TImage hacemos lo
siguiente:


procedure TFPrincipal.FormCreate( Sender: TObject );
var
Recursos: TResourceStream;
Imagen: TJPegImage;
begin
Imagen := TJPegImage.Create;
Recursos := TResourceStream.Create( hInstance, '#1', RT_RCDATA );
Recursos.Seek( 0, soFromBeginning );
Imagen.LoadFromStream( Recursos );
Imagen1.Canvas.Draw( 0, 0, Imagen );
Recursos.Free;
Imagen.Free;
end;



Donde Imagen1 es un objeto TImage. Aunque pueda parecer algo molesto
tiene las siguientes ventajas:
- Evita que un usuario cualquiera utilice nuestras imagenes (a menos claro que
sepa utilizar un editor de recursos).
- Facilita la distribución de nuestro programa (va todo en el exe).
- Se puede añadir cualquier tipo de archivo o dato dentro del ejecutable.
- Ahorramos mucha memoria al cargar una sola vez el recurso.

Pruebas realizadas en Delphi 7. 



Esto lo saque de unos manuales de nombre delphi al limite. 

Mi duda es como crear el archivo    .RC  porque no entiendo como hacerlo y si cuales son los pro y los contra de hacer esto asi.

Lo quiero utilizar basicamente para unos archivos de audio de mi aplicacion y asi poder tenerlos junto con mi ejecutable.

Espero sus comentarios
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 01 September 2009 - 11:12 AM


Mi duda es como crear el archivo    .RC  porque no entiendo como hacerlo y si cuales son los pro y los contra de hacer esto asi.

Lo quiero utilizar basicamente para unos archivos de audio de mi aplicacion y asi poder tenerlos junto con mi ejecutable.

Espero sus comentarios


Si mal no recuerdo el .rc es un simple archivo de texto con esa extensión. Al compilar ese archivito es como se genera el de recursos.

Ahora sobre su uso yo opino que es una excelente solución para aligerar tus aplicaciones cuando le incluirás muchos archivos de imagen o como en tu caso: audio.

Saludos
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 01 September 2009 - 11:16 AM

Ahí­ mismo lo dice, debes abrir notepad y agregar los recursos y guardarlo como archivo .rc, así­ de sencillo.

Saludos.
  • 0

#4 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 01 September 2009 - 12:11 PM

gracias por sus respuestas.

Eso fue lo que entendi, gracias por aclararme, ademas queria saber la opinion de ustedes sobre el asunto.

Dos Preguntas:

1.- Despues de compilar los archivos, puedo borrarlos de mi maquina, porque lo que pretendo hacer es crear una carpeta con todos estos archivos, compilar el .RC y borrar esa carpeta, ya que los archivos estan en varias carpetas.

2.- En caso de un archivo de audio, que vaya a ser tocado por medio del mediaplayer, es factible utilizarlo asi y si se puede como hay que cargarlo al media player.

gracias




  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 01 September 2009 - 12:46 PM

gracias por sus respuestas.

Eso fue lo que entendi, gracias por aclararme, ademas queria saber la opinion de ustedes sobre el asunto.

Dos Preguntas:

1.- Despues de compilar los archivos, puedo borrarlos de mi maquina, porque lo que pretendo hacer es crear una carpeta con todos estos archivos, compilar el .RC y borrar esa carpeta, ya que los archivos estan en varias carpetas.

2.- En caso de un archivo de audio, que vaya a ser tocado por medio del mediaplayer, es factible utilizarlo asi y si se puede como hay que cargarlo al media player.

gracias


1 - Efectivamente amigo, puedes borrarlos pero yo te recomendaria tener un respaldo por si las moscas. :p

2 - si el archivo de audio es un WAVE debe ser de la siguiente manera:

agregas la unidad mmsystem a tu uses

y utilizas este procedimiento:



delphi
  1. procedure TForm1.PlaySound(soundname: String) ;
  2. var
  3.   hFind, hRes: THandle;
  4.   Song: PChar;
  5. begin
  6.   hFind := FindResource(HInstance, soundname, 'WAVE') ;
  7.   if hFind <> 0 then begin
  8.     hRes:=LoadResource(HInstance, hFind) ;
  9.   if hRes <> 0 then begin
  10.     Song:=LockResource(hRes) ;
  11.     if Assigned(Song) then SndPlaySound(Song, snd_ASync or snd_Memory) ;
  12.     UnlockResource(hRes) ;
  13.   end;
  14.   FreeResource(hFind) ;
  15. end;
  16. end;




saludos
  • 0

#6 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 01 September 2009 - 10:28 PM

gracias poliburro por tu respuesta

Si entiendo bien, con este procedure lo que hago es asignar el recurso y tocarlo directamente, no por medio del mediaplayer.

Estoy haciendo lo que me dices y recibo el siguiente error:

Imagen Enviada

que estoy haciendo mal. 

gracias de nuevo
  • 0

#7 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 01 September 2009 - 10:41 PM

Hola luk(skywalker???)2009  (:p chiste estúpido, ya sé  :$)

Te manda una incompatibilidad de tipos... sustituye esto:



delphi
  1. hFind := FindResource(HInstance, soundname, 'WAVE');



por esto:



delphi
  1. hFind := FindResource(HInstance, pChar(soundname), 'WAVE');



Saludox ! :D


  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 02 September 2009 - 07:52 PM

Gracias Fenareth por tu respuesta.

Compila bien y sin errores.

La pregunta ahora es como uso ese procedimiento. Ejemplo si lo pongo en un boton
playsound( ) ;  //que debo poner entre los parentesis?

no me parecio estupido el chiste, mas bien tierno
  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 02 September 2009 - 08:07 PM

Hola luk !!! :D

Pon el nombre de la canción, de esta manera:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.       playsound('Canción chida');
  4. end;



Saludox !  :D
  • 0

#10 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 02 September 2009 - 10:00 PM

Gracias Fenareth por tu ayuda.

lo primero que hice fue crear una carpeta donde puse un archivo que se llama police.wav. Luego de esto cree con notepad el archivo  soni.rc que dice en su interior:

1 RCDATA police.wav   


luego de esto lo compile haciendo lo siguiente:

c:\monitoreo\brc32 -r -v soni.rc     


Con lo cual se creo en la misma carpeta c:\monitoreo el archivo  soni.res.

En delphi creo una aplicacion nueva y pongo un boton en el form
declaro la procedure que me indico poliburro y pongo en el uses mmsystem:

  uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MPlayer, StdCtrls,mmsystem;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure PlaySound(soundname: String) ;
    procedure Button1Click(Sender: TObject); 




luego de implementation:



delphi
  1. implementation
  2.  
  3. {$R *.dfm}
  4. {$R soni.res}
  5.  
  6.  
  7. procedure TForm1.PlaySound(soundname: String) ;
  8. var
  9.   hFind, hRes: THandle;
  10.   Song:PChar;
  11. begin
  12.   //hFind := FindResource(HInstance, soundname, 'WAVE') ;
  13.   hFind := FindResource(HInstance, pChar(soundname), 'WAVE');
  14.   if hFind <> 0 then begin
  15.     hRes:=LoadResource(HInstance, hFind) ;
  16.   if hRes <> 0 then begin
  17.     Song:=LockResource(hRes) ;
  18.     if Assigned(Song) then
  19.           SndPlaySound(Song, snd_ASync or snd_Memory) ;
  20.     UnlockResource(hRes) ;
  21.       end;
  22.   FreeResource(hFind) ;
  23. end;
  24. end;
  25.  
  26.  
  27. procedure TForm1.Button1Click(Sender: TObject);
  28. begin
  29. PlaySound('police');
  30. end; 



Que estoy haciendo mal, porque no suena cuando presiono el boton?.





  • 0

#11 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2040 posts
  • LocationSanto Domingo

Posted 02 September 2009 - 11:13 PM

Hola a todos, el problema hasta donde he visto estaba en la forma en que creo en notepad el archivo de recursos
lo he cambiado a esta forma:

police wave "c:\monitoreo\police.wav"   

y luego lo he vuelto a compilar y si funciona.

gracias por su ayuda.

Ahora voy a realizar las pruebas de como funciona con otro tipo de recursos como mp3 e imagenes y ademas entender bien el codigo de poliburro.  Porque la idea no es solo realizar una cosa, lo mas importante es saber como se hace, para poder crecer en tu aprendizaje.

Por esta razon Poliburro, puedes explicar paso a paso como funciona tu procedure?



  • 0




IP.Board spam blocked by CleanTalk.