• Lunes 6 de Mayo de 2024, 11:11

Autor Tema:  Crecimiento Del Ejecutable Con Archivos Res  (Leído 3420 veces)

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Crecimiento Del Ejecutable Con Archivos Res
« en: Viernes 7 de Julio de 2006, 00:53 »
0
Mi duda es la siguiente, ¿Cuan bueno o No beneficioso es engordar una aplicación (ejecutable) de Delphi?, Todos sabemos, que por evitar ser pirateados algunos íconos, Imágenes, o Sonidos lo trabajamos con arcvhivos RES verdad?.

¿Cuan beneficioso sería introducir en un RES 200 íconos 32x32?
¿Cuan beneficioso sería introducir en un RES 200 imágenes BMP 64x64?
Y como adimento digamos unas 5 imágenes BMP grandes (800x600) para fondos y otros.

TOTAL = 405,

Tal vez no me quedaría otra que tenerlos en un directorio y evitar engordar el Ejecutable, pero con la probabilidad que más adelante lo descarguen éstas imágenes e íconos que me costó construirlos.

Si hablé de una cantidad de 200, es por la sencilla razón de crear una Tabla Periódica Química y para otros trabajos jalándolos y mostrar después de un posterior cálculo en mi aplicación.
Me sugerieron guardar en dll, pero acaso no existen programas que recuperan íconos de una dll? (pues estaríamos en lamisma situación) y si no fuera así como realizo este proceso?
¿Afecta en algo engordar el ejecutable, se vuelve lento, no pasa nada?
¿Cual sería el mejor planteamiento?

Gracias espero vuestras sugerencias

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #1 en: Viernes 7 de Julio de 2006, 15:10 »
0
Pensalo así, NO IMPORTA DONDE ESTEN LAS IMAGENES SIEMPRE OCUPAN ESPACIO.
O sea, si estan dentro o fuera de la ejecutable, siempre será la misma cantidad de espacio en el disco duro que va a ocupar la ejecutable para funcionar normalmente.

Sugerencias:
  200 iconos de 32x32 te ocupan mucho más espacio que una imagen de 640x640 (es decir 32x200) por la paleta.
Te conviene tener una imagen grande con todas las imagenes pequeñas e ir recortando los sectores que necesitas. Algo as'i>
 

Lo que tienes que hacer es hacer una imagen con todos los iconos de la tabla periodica, uno despue sde otro (6400x32) (va a ocupar menos porque por el tema de la paleta que individualmente ocupa más)
Código: Text
  1.  
  2. var
  3.   MainBitmap: TBimap;
  4. begin
  5.   MainBitmap := TBitmap.Create;
  6.   MainBitmap.LoadFRomFile('nombreImagenGrande.bmp');
  7.  
  8.  
despues, creas un vector de 120 elementos de tipo bitmap (el indice del vector sería el numero atómico , 1 hidrogeno, 2 helio... )
Código: Text
  1.  
  2. var
  3.    bmpElementos: Array[1..120] of TBitmap;
  4.    I: Integer;
  5. begin
  6.   for i:=1 to 120 do
  7.   begin
  8.      bmpElementos[i] := TBitmap.Create;
  9.       height := 32;
  10.      width := 32;
  11.   end;
  12.  
  13.  
no te olvides despues de hacer bmpElementos.Free;

ahora que los tienes inicializados, cargas los trozitos de las imagenes a cada indice del vector;
Código: Text
  1.  
  2. SourceRect: TREct;
  3.   for i:=1 to 120 do
  4.   begin
  5.       //es i*32 - 32 porque asi empieza copiando desde 0 y no 32
  6.       // si el priemer indice fuera 0, no haria falta, pero ser'ia incomodo hidrogeno=1        
  7.      SourRect := Rect(i*32-32, 0, i*32, 32);
  8.      bmpElementos.Canvas.CopyRect(Rect(0,0,32,32),mainBitmap.canvas, SourcRect);
  9.  
  10.      //la recta de destino es constante 0,0,32,32
  11.    end;
  12. end;
  13.  
  14.  
Con eto tienes todas las imagenes cargadas en un vector, donde el indice corresponde a la imagen del elemento del numero at'omico correspondiente.

Inclusive podrias hacer algo as'i:
Código: Text
  1.  
  2.    TElemento = record
  3.       Numero: Byte;
  4.       Peso: Real;
  5.       NroOxidacion: ShortInt; //-127..127
  6.       Electronegatividad: ShortInt;  
  7.      
  8.       Imagen: TBitmap; // y cargas todo aca;
  9.    end;
  10.  
  11.   TTablaPeriodica = array[1..120] of TElemento;
  12. end;
  13.  
  14.  

Cualquier otroa duda, avisa
Saludos

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #2 en: Viernes 7 de Julio de 2006, 16:20 »
0
Enko, primero que nada muchas gracias, por responder, siempre lo has hecho a todas mis preguntas. Muy notable tu dominio en química. Tu explicación muy buena la aplicaré mas adelante, cuando termine de construir todos los íconos y de repente ahí tenga muchas preguntas.

Me parece que no planteé bien mi pregunta y no me he dejado entender.

No debí preguntar si ocupa espacio o no, debí preguntar ¿como se vuelve mi aplicación cuando engordo el ejecutable con RES que contienen varios iconos? ¿lenta, normal? ¿es beneficioso o no? ¿Cual la diferencia si guardo en un Directorio todos los iconos bajo el riesgo de ser copiado (ni modo) corre mejor mi aplicación?

- Hable también de DLLs que si tuviera en grupos de dlls los íconos o imágenes, ¿Correría más rápida mi aplicación o sería igual?

¿Cual es el camino más óptimo, o es igual guardar en un RES engordado el ejecutable que guardarlo todo en un directorio a todos los íconos e imágenes, o en dlls? . Perjudico si engordo al ejecutable?

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #3 en: Viernes 7 de Julio de 2006, 16:40 »
0
Respecto a eso, no te sabría decir muy bien, pero según tengo entendido, si cargas las imagenes dentro de la ejecutable tarda un poco más en cargarse (ni te das cuenta en realidad) y ademas, si luego la quieres comprimir (con compresor de ejecutables que ademas cifra, no win zip) es probable que las imagenes no sean leibles.

Cuando cargas una imagen en tiempo de ejecucion, esta se carga "al monton de la memoria", es decir, en una memoria compartida. Si está en la ejecutable, se crga "en la memoria de la pila", es decir, de la ejecutable donde estan las variables que hayas definido, por eso, se puede volver mas lento por ahí la cosa si haces de ese modo.

Igualmente, habría falta una opinion de alguien más para asegurarse.

Personalmente prefiero tenerlas afuera. para engañar al usuario, Puedes cambiarles la extencion por alguna otra *.DAT por ejemplo.

una ventaja de tener las imagenes afuera es que puedes crear SKINS, es decir, tener la misma imagen en distintos colores.

PD: si no quieres dibujar, intenta escanear una tabla periodica sencilla.

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #4 en: Martes 11 de Julio de 2006, 14:49 »
0
Citar
Personalmente prefiero tenerlas afuera. para engañar al usuario, Puedes cambiarles la extencion por alguna otra *.DAT por ejemplo.
Cambie la extensión de BMP x DAT, y sin ningún problema pueden recuperar ALGUNOS programas manejadores de Imágenes (Paint por ejemplo) pero desde ya es una buena idea para engañar al usuario.

¿Y como lo llamo a un DAT desde Delphi? Solo probé con una TIMage y en la propiedad "Picture" no tiene la opción para cargar un DAT.

¿Como trabajo los DATs en Delphi con una TImage, TPaintBox y TImageList?

Saludos!

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #5 en: Miércoles 12 de Julio de 2006, 22:04 »
0
Me olvide de eso. TE queda meter todas las imagenes tal como son. A lo sumo las podes agrupar en una carpeta.

Al cambiar la extension, no cambias el formato de la imagen, pero podes engañar al usuario haciendolo pensar que el archivo en cuestion, no es una imagen sino otra cosa.
Pero el problema, como te diste cuenta, es que no podes cargarlas en tiempo de diseño.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #6 en: Viernes 14 de Julio de 2006, 20:01 »
0
Bueno, sólo agregar que adicionalmente existe otra ventaja de evitar usar íconos: Ahorras recursos de GDI y no tienes que molestar al sistema operativo para reservar y liberar estos recursos con el riesgo que algún bug en tu código impida liberarlos todos. Es más fácil asegurar que liberamos el bitmap grande que liberar 200 iconos chicos. En windows 98 era casi criminal usar tantos íconos y no era raro ver cuando estos empezaban a cambiar o desaparecer por que tenían límite fijo :P.

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #7 en: Martes 17 de Octubre de 2006, 19:01 »
0
Solucioné lo del DAT con un procedimiento de cifrado y descifrado del archivo por código, luego cargo en cualquier: TImage, TPaintBox y TImageList. Gracias muy buena la sugerencia.

Y bien, he dejado Delphi unos cuantos meses (como autodidacta y novato que soy) y retomando nuevamente sobre mis dudas, estoy siguiendo los consejos de todos quienes me orientaron, ahora me nace una duda:
Citar
Inclusive podrias hacer algo as'i:
Código: Text
  1. TElemento = record
  2.      Numero: Byte;
  3.      Peso: Real;
  4.      NroOxidacion: ShortInt; //-127..127
  5.      Electronegatividad: ShortInt;  
  6.      
  7.      Imagen: TBitmap; // y cargas todo aca;
  8.   end;
  9.  
  10.  TTablaPeriodica = array[1..120] of TElemento;
  11. end;
  12.  

¿Cual sería más óptimo para encarar este trabajo y sus datos de cada elemento?:
1.- ¿Crear un Record?
2.- ¿Crear una Clase?
3.- ¿Crear una Base de Datos (digamos en Access)?

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Crecimiento Del Ejecutable Con Archivos Res
« Respuesta #8 en: Martes 17 de Octubre de 2006, 21:22 »
0
Respecto a la base de datos.... mh... podría ser, pero aumentarias la dependencia de tu programa con el BorlandDatabaseEngine (BDE) de Borland.

Entre usar un record y una clase, la diferencia sería que cuando tengas que modificar algo con un procedimiento en un record harías:
Código: Text
  1.  
  2. ModificarDato(Elemento[1].Dato);
  3.  
  4.  

y si es OOP poria ser algo asi:
Código: Text
  1.  
  2. TablaPerdica.Elementos[1].Dato;
  3.  
  4.  
Donde Dato es una propiedad!
Código: Text
  1.  
  2. TElemento = class
  3. private
  4.   FDato: Integer;
  5. public
  6.   propiety Dato read FData write SetData;
  7.   // o read FData write SetData;
  8.  
  9.  
Y claro, la tabla periodica seria una clase mas como lo mestre arriba:
Código: Text
  1.  
  2. TTablaPerdica = class
  3. private
  4.    FElementos: array [1..120] of TElemento;
  5.  public
  6.     propiety Elemento[X: Integer]: TElemento read GetElemento write SetElemento;
  7. end;
  8.  
  9.  
Si llevas esto a una instancia superior... podrias realizar un componente visual de una tabla periodica.

Pd: se nota que me gusta la poo? :whistling: