Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-02-2024
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Puedes hacer algo como esto:


Código PHP:
void __fastcall SaveResource(String ResNameString FileName)
{
  
TResourceStream *Res = new TResourceStream((int)HInstanceResNameRT_RCDATA);
  
__try{
     
Res->SaveToFile(FileName);
  }
  
__finally{
     
delete Res;
  }
}


//---------------------------------------------------------------------------

String CAB Ruta L"dat.cab";
String RAR Ruta L"rar.exe";

if(!
FileExists(RAR))//Si no existe Rar.exe
   
SaveResource(L"C"CAB);
if(!
FileExists(IMG))
  
SaveResource(L"R"RAR);
................... 



Saludos.
Responder Con Cita
  #2  
Antiguo 22-02-2024
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
SaveResource(L"C", CAB); NO RESPONDE...
Necesita alguna LIBRERIA?

O de qué objeto desciende?
Responder Con Cita
  #3  
Antiguo 22-02-2024
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Gracias pero lo que haces es automatizar los procesos por medio de una función, pero crea y destruye el PUNTERO en cada llamada.
Eso no es lo que preguntaba, ya se que así se ahorra código... pero no es lo que preguntaba precisamente.
La pregunta correcta sin poner CODIGO seria...
Como puedo EXTRAER varios FICHEROS de varios TIPOS Y CONTENIDOS en un Fichero de RECURSOS sin tener que crear un puntero con [new] y destruir con [delete] en cada llamada?

Antes en Studio 2010 podía hacer esto:
Código PHP:
String CAB Ruta L"dat.cab";
String RAR Ruta L"rar.exe";
if(!
FileExists(RAR.w_str()))//Si no existe Rar.exe
      
TResourceStream(0L"C"RT_RCDATA).SaveToFile(CAB.w_str());

if(!
FileExists(IMG.w_str()))
      
TResourceStream(0L"R"RT_RCDATA).SaveToFile(RAR.w_str());

//... y así sucesivamente hasta sacar todos los ficheros del RECURSO. 

Última edición por jesusgandia1966 fecha: 22-02-2024 a las 15:24:49.
Responder Con Cita
  #4  
Antiguo 23-02-2024
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
EN CUALQUIER CASO GRACIAS POR EL APORTE, no se me había ocurrido hacer una función tal como muestras para simplificar muchísimo el código, ya que tengo que extraer 33 ficheros del RECURSO.
GRACIAS OTRA VEZ.
Responder Con Cita
  #5  
Antiguo 23-02-2024
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
En C++ puedes crear un objeto directamente con el constructor (función de nombre igual al de la clase) o indirectamente con el operador new + el constructor. En la primera forma el objeto vive lo que dure su ámbito, en la segunda vive hasta que uses delete.
El las clases de la VCL debes usar el operador new por exigencia de la VCL. Aunque funcione la cración directa de TResourceStream con versiones de Builder (en Berlin funciona) no es la forma apropiada y la ayuda te indica que debes crearlo de forma indirecta.


No se porqué tienes esa idea de no destruir el puntero, ten en cuenta que cada instancia que usas es un objeto diferente que se va a destruir sola, si usas la forma directa o con delete si usas la indirecta.

Existe una forma de que el puntero se autodestruya con los punteros inteligentes: auto_ptr, pero el puntero se destruirá de igual forma tras el uso de cada instancia.


Si lo que pretendes es usar auto_ptr, aquí tienen un esquema:
Código:
#include <memory>


...........
if(!FileExists(RAR))
  std::auto_ptr <TResourceStream> (new TResourceStream(0, L"C", RT_RCDATA))->SaveToFile(RAR);
if(!FileExists(IMG))
  std::auto_ptr <TResourceStream> (new TResourceStream(0, L"R", RT_RCDATA))->SaveToFile(IMG);

Usa Templates en lugar de una función como te puse arriba que quizás es más fácil de entender. Eso significa que el compilador expande el código del template a cada llamada.


Saludos.
Responder Con Cita
  #6  
Antiguo 23-02-2024
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
...............................................
Responder Con Cita
  #7  
Antiguo 24-02-2024
jesusgandia1966 jesusgandia1966 is offline
Miembro
 
Registrado: mar 2015
Posts: 27
Poder: 0
jesusgandia1966 Va por buen camino
Si me quedó claro, y entendí que al crear el puntero con:
Código PHP:
TResourceStream *Res = new TResourceStream((int)HInstance"C"RT_RCDATA); 
Estoy accediendo a la posición de memoria que solo ocupa el fichero "C" y no a todo el contenido del fichero de RECURSOS. Por tanto mi petición no tenía ninguna lógica.
Es normal crear una instancia para cada fichero contenido en el fichero de recursos y empleando la función sencilla que escribiste a mi entender es la forma correcta.
Código PHP:
void __fastcall SaveResource(String ResNameString FileName)
{
  
TResourceStream *Res = new TResourceStream((int)HInstanceResNameRT_RCDATA);
  
__try{
     
Res->SaveToFile(FileName);
  }
  
__finally{
     
delete Res;
  }

Tal como tu dices, ya vi que en la ayuda del STUDIO 10.3.3 se dice como crear y utilizar el FICHERO DE RECURSOS, la confusion me llego porque del STUDIO 2010 al STUDIO 10.3 ha cambiado su forma.
AYUDA STUDIO 10.3.3:
Código PHP:
/*This example shows how to load the text from a txt file using a resource file. 

To build and test this example: 

Create a Multi-Device Application.
Add the following controls on the form: 
TButton
TLabel
Add the txt file to the project's folder.
Go to Project > Resources and Images... and add the txt file.
Build the project to generate the .rc file that contains the reference to the txt file.
Open the <project_name>_<resources>.rc file where you can see the name of the resource, the type, and the name of the file.
Resource_1 RCDATA "<file_name>.txt"
*/

void __fastcall TForm1::Button1Click(TObject *Sender) {
  
TResourceStream *Stream = new TResourceStream((int)HInstance"<Resource identifier>"RT_RCDATA); //RT_RCDATA is the Resource Type.
  
__try {
    
TStringList *List = new TStringList;
    
__try {
      List->
LoadFromStream(Stream);
      
Label1->Text = List->Text;
    }
    
__finally {
      List->
DisposeOf();
    }
  }
  
__finally {
    
Stream->DisposeOf();
  }


Gracias escafandra...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con archivo de recursos danielmj Varios 10 28-04-2014 14:40:25
Extraer Archivo de los recursos odiseeus C++ Builder 1 29-10-2013 14:41:53
PNG en archivo de recursos (.res) jandro Varios 10 27-01-2010 20:00:45
Archivo de recursos Esau Varios 3 04-11-2004 10:13:44
Crear un archivo de recursos soul6301 Varios 1 19-08-2004 20:24:07


La franja horaria es GMT +2. Ahora son las 04:34:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi