Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   TJpegImage.LoadFromFile repite parte de mi ruta!! (https://www.clubdelphi.com/foros/showthread.php?t=59565)

Garry 01-09-2008 09:19:11

TJpegImage.LoadFromFile repite parte de mi ruta!!
 
¡Hola, muchachos!

Gracias por la atención. He estado buscando por la red y el foro y no encuentro a nadie con un problema similar, pero seguro que lo hay :o

Uso Delphi 7.0 y quiero cargar imágenes a partir de una ruta base que extraigo desde un archivo a una variable global (G_Img_Logos_URL), que luego concateno al nombre seleccionado con un TOpenPictureDialog (mi instancia se llama M_VOP_Logo). Mi TImage se llama: M_Img_Logo.

Este es el código para seleccionar la imagen al pulsar sobre su espacio del formulario:
Código Delphi [-]
procedure TF_Empresa.M_Img_LogoClick(Sender: TObject); //buscamos foto y cargamos
var
  Jpeg:TJpegImage;
  Corriente:TMemoryStream;
begin
  M_VOP_Logo.InitialDir := G_Img_Logos_URL;
  if M_VOP_Logo.Execute then
    begin   // hacer todo lo que sea
    Jpeg:=nil;
    Corriente:=nil;
    FileLogo:=ExtractFileName(M_VOP_Logo.Filename);
   // URLLogos:=  URLLogos+FileLogo;
    //mostramos la foto para su comprobacion
    try
      Jpeg:=TJpegImage.Create;
     Jpeg.LoadFromFile(M_VOP_Logo.FileName);
     //Jpeg.LoadFromFile(URLLogos);
      Corriente:=TMemoryStream.Create;
      Jpeg.SaveToStream(Corriente);
      Corriente.Seek(0,soFromBeginning);
      Jpeg.LoadFromStream(Corriente);
      M_Img_Logo.Picture.Assign(Jpeg);
    Finally
     // Corriente.Clear;
     // Jpeg.CleanupInstance;
      Corriente.Free;
      Jpeg.Free;
      M_VOP_Logo.InitialDir:='';
    end;
    end
  else // el usuario le ha dado al boton cancelar o ha cerrado la ventana con la X
  begin
  // FileLogo:='';
   M_VOP_Logo.filename := EmptyStr;
  end;
end;

Y este el de mostrarla de nuevo al navegar por la base de datos:
Código Delphi [-]
procedure TF_Empresa.M_CargarLogo (sFoto: String);
var
  Jpeg: TJpegImage;
  Corriente: TMemoryStream;
begin
  if sFoto = '' then begin
    M_Img_Logo.Repaint;
    M_Img_Logo.Picture := nil;
  end else try
    Jpeg:=nil;
    Corriente:=nil;
    Jpeg      := TJpegImage.Create;   //nil;
    Corriente := TMemoryStream.Create;//nil;  
    //Jpeg.LoadFromFile ('\\GARRY\CGeSt\Datos\Logos\'+sFoto);
    Jpeg.LoadFromFile (G_Img_Logos_URL+sFoto);
    Jpeg.SaveToStream (Corriente);
    Corriente.Seek (0, soFromBeginning);
    Jpeg.LoadFromStream (Corriente);
    M_Img_Logo.Picture.Assign (Jpeg);
  finally
    M_Img_Logo.Repaint;
    M_Img_Logo.Picture := nil;
    Corriente.Free;
    Jpeg.Free;
  end;
end;

Mi ruta de la aplicación es "C:\COGS\CGeSt\". Primero selecciono una imagen y me la muestra pero buscarla una segunda vez (el segundo trozo de código), casca. Al depurar la ejecución veo que la variable es correcta y vale "Loly\Datos\Logos\", pero me devuelve el error porque toma una ruta incorrecta (me duplica esta que acabo de ecribir):
Cita:

---------------------------
Debugger Exception Notification
---------------------------
Project CGeSt.exe raised exception class EFOpenError with message 'Cannot open file "C:\COGS\CGeSt\Loly\Datos\Logos\Loly\Datos\Logos\alfa.jpg". El sistema no puede encontrar la ruta especificada'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Van varios días de pruebas y no entiendo ni jota, ¿podría ayudarme alguien, por favor? Si falta aclarar algo, no duden en preguntar. Gracias de antemano :)

coso 01-09-2008 10:07:04

Hola, Jpeg.LoadFromFile (G_Img_Logos_URL+sFoto);
sera eso no? hazte un showmessage antes de cada llamada a loadfromfile de lo que le pasas, creo que simplemente estas sumando un directorio con un nombre de fichero con path

Garry 01-09-2008 10:19:59

Me temo que no es eso
 
Hola, coso, gracias por la asistencia.

Como decía, en la depuración se observa que el valor de las variables es correcto:
G_Img_Logos_URL = 'Loly\Datos\Logos\'
sFoto = 'alfa.jpg'

Y un ShowMessage me lo confirma. Si lo hago literalmente también me rula.

El problema debe estar en que guarda en algún sitio la anterior ruta durante el primer procedimiento (el de asignación). Además, al navegar por la base de datos con valores ya guardados sólo se ejecuta el segundo procedimiento. En este caso, ¡todo marcha perfectamente!

¿Puede ser debido a una mala utilización del ExtractFileName? :confused:

coso 01-09-2008 10:23:50

Código Delphi [-]
  Jpeg:=nil;
    Corriente:=nil;
    FileLogo:=ExtractFileName(M_VOP_Logo.Filename);
   // URLLogos:=  URLLogos+FileLogo;
    //mostramos la foto para su comprobacion
    try
      Jpeg:=TJpegImage.Create;
     Jpeg.LoadFromFile(M_VOP_Logo.FileName);

bueno, aqui jpeg.loadfromfile se tendria que llamar con el path incluido, no haria falta extraer tansolo el filename.

PD : edito, nada, no le veo error

coso 01-09-2008 10:24:47

ni idea, tampoco lo entiendo...:confused: quiza tendrias que poner mas codigo e indicar donde te salta exactamente

Garry 01-09-2008 10:30:35

Sí, perdona. En la siguiente línea del 2º procedimiento:
Código Delphi [-]
Jpeg.LoadFromFile (G_Img_Logos_URL+sFoto);

coso 01-09-2008 10:31:02

Creo que ya se

Código Delphi [-]
G_Img_Logos_URL = 'Loly\Datos\Logos\'
sFoto = 'alfa.jpg'

Al no indicar ni la unidad ni el directorio raiz de Loly\datos\...te inicia en el directorio de la aplicacion. Prueba de poner G_Img_Logos_Url := 'c:\etc...';

Garry 01-09-2008 11:25:27

Me toca aclarar las rutas porque no parece que sea lo que comentas, ya que lo que se repite está fuera de la ruta base de la aplicación:
- Ruta de la aplicación: 'C:\COGS\CGeSt'
- Ruta de imágenes a cargar: 'C:\COGS\CGeSt\Loly\Datos\Logos\'
- Fichero de prueba: 'alfa.jpg'

Garry 01-09-2008 11:39:48

¡Eureka!
 
¡¡¡Biennnn!!! Ya lo tengo: el OpenFileDialog tiene una opción clave que yo desconocía porque me estoy inciando con este componente: ofNoChangeDir, que por defecto está a False, pero debe estar a True.

Esta opción permite desctivar que mi ruta de ejecución cambie cuando se navega con el componente por los directorios, con lo que, al pretender usar una ruta relativa posteriormente, ésta se ve afectada y toma la ruta anteriormente cambiada. :cool:

Oye, coso, muchas gracias por tus intentos. Saludiños ;)

Garry 01-09-2008 11:42:34

Por cierto, si añado la ruta absoluta funciona, claro, pero no me interesa porque quiero que los datos "cuelguen" del mismo directorio que la aplicación :D

coso 01-09-2008 11:51:40

Cita:

Me toca aclarar las rutas porque no parece que sea lo que comentas, ya que lo que se repite está fuera de la ruta base de la aplicación:
- Ruta de la aplicación: 'C:\COGS\CGeSt'
- Ruta de imágenes a cargar: 'C:\COGS\CGeSt\Loly\Datos\Logos\'
- Fichero de prueba: 'alfa.jpg'
bueno, lo que me referia es que si asignas este valor a G_Img_Logos_URL
Código:

G_Img_Logos_URL = 'Loly\Datos\Logos\'
sFoto = 'alfa.jpg'

al estar mal hecha la ruta G_Img_Logos_URL, pues le falta directorio raiz y unidad, te debe tomar el 'Current dir' como raiz, sumandole lo de 'loly\datos\logos\', y el current dir en ese momento seguramente era el mismo 'c:\COGS\CGEST\loly\datos\logos\' probablemente, si no la ruta de la aplicación. G_Img_Logos_URL deberia ser 'c:\...etc...\loly\datos\logos'. Si lo que quisieras es que te colgara desde la aplicacion, entonces :
Código Delphi [-]
G_Img_Logos_URL := ExtractFilePath(Application.Exename) + '\loly\datos\logos';
saludos

pd :
Cita:

el OpenFileDialog tiene una opción clave que yo desconocía porque me estoy inciando con este componente: ofNoChangeDir
casi seguro q es eso, pues con esta opcion no se cambia el 'Current Dir' al navegar con el opendialog. Ahora bien, si tienes alguna ventana del explorador abierta mientras ejecutas tu aplicación, te cambiaria tambien el directorio actual, por lo que te recomiendo que coloques correctamente G_Img_Logos_URL := ExtractFilePath(Application.Exename) + 'loly\datos\logos';

Garry 01-09-2008 13:57:31

Cita:

Empezado por coso (Mensaje 310671)
bueno, lo que me referia es que si asignas este valor a G_Img_Logos_URL [...] si no la ruta de la aplicación. G_Img_Logos_URL deberia ser 'c:\...etc...\loly\datos\logos'. Si lo que quisieras es que te colgara desde la aplicacion, entonces :
Código Delphi [-]G_Img_Logos_URL := ExtractFilePath(Application.Exename) + '\loly\datos\logos';

saludos

¡Ah, vale! Exactamente era como dices, no te había entendido, pero supongo que me sirvió como orientación, gracias.

De todas formas, como soy un fanático de la optimización (lo que puse al principio debía su desorden al desconcierto de las pruebas, jeje :p:D:p).
Cita:

Empezado por coso (Mensaje 310671)
pd :
casi seguro q es eso, pues con esta opcion no se cambia el 'Current Dir' al navegar con el opendialog.

No, sin el "casi": es exactamente por eso, ya está verificado ;)
Cita:

Empezado por coso (Mensaje 310671)
Ahora bien, si tienes alguna ventana del explorador abierta mientras ejecutas tu aplicación, te cambiaria tambien el directorio actual, por lo que te recomiendo que coloques correctamente G_Img_Logos_URL := ExtractFilePath(Application.Exename) + 'loly\datos\logos';

Córcholis, ¿seguro? Yo pensaba que cada aplicación tiene su propio directorio. Mañana lo compruebo... :(:confused::(

coso 01-09-2008 14:03:42

yo lo haria por si acaso

coso 01-09-2008 14:07:25

http://msdn.microsoft.com/en-us/libr...06(VS.85).aspx

si por a o por b se te cambia el directorio activo, ya no te funcionaria

Garry 02-09-2008 09:41:51

He consultado el enlace que mandas, pero no me ilustra sobre si el CurrentDirectory es un dato para cada aplicación o algo más global, del sistema operativo.

Yo creo recordar que, en mis tiempos de facultad (Windows 3, ¡qué tiempos aquellos! :rolleyes:), nos habían enseñado que era un "parámetro local", pero no lo tengo claro hasta que vuelva a tener la aplicación estable para probarlo, que, como dices, creo que es recomendable.

coso 02-09-2008 10:41:04

si, yo tambien hablaba pensando en windows 98 etc... pero ya te digo q lo haria asi, escribiendo la ruta absoluta mediante el extractfilepath, por si acaso. saludos.


La franja horaria es GMT +2. Ahora son las 02:03:24.

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