Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con Picture.LoadFromFile (https://www.clubdelphi.com/foros/showthread.php?t=18171)

Ohcan 03-02-2005 19:57:54

Problemas con Picture.LoadFromFile
 
Hola a todos

Estoy teniendo un problema.... :confused:
Os pongo el código:
Código Delphi [-]
procedure TwPrincipal.ShellListViewClick(Sender: TObject);
var
Ruta:string;
Foto:TPicture;
begin
if ShellListView.SelectedFolder<>nil then
Ruta := ExtractFilePath(ShellListView.RootFolder.PathName) +
ShellListView.SelectedFolder.DisplayName
else Exit;
//ShowMessage(Ruta); //Para ver qué pasa
if (UpperCase(ExtractFileExt(Ruta))='.GIF') or
(UpperCase(ExtractFileExt(Ruta))='.BMP') or
(UpperCase(ExtractFileExt(Ruta))='.JPG')then
begin
Foto := TPicture.Create;
Foto.LoadFromFile(Ruta);//'D:\Cosas\101.gif' Si pongo la ruta así funciona
Imagen.Picture := Foto; //Imagen es un TImage
Foto.Free;
end;
end;

El problema está en Foto.LoadFromFile(Ruta);
He comprobado que la ruta "se llena" correctamente... de verdad ¡es correcta!
pero en esa línea me canta el error:
Cannot open file "Aquí pone la ruta". El sistema no puede hallar el archivo especificado.
¡Lo flipo! :confused: :confused: :confused:
Sin embargo, si pongo "a pelo" una ruta (Ej:'D:\Cosas\101.gif') funciona "ferpectamente".

¿Alguno podéis echarme una mano?

Se me olvidaba... uso Delphi7.

Muchas gracias y saludos...:)

Héctor Randolph 03-02-2005 21:39:21

Hola ohcan!

He revisado tú código y encontré un problema.

Si utilizas la función ExtractFilePath() ésta te elimina de la ruta el último nivel del directorio, de tal forma que cuando concatenas con DisplayName la cadena queda incompleta.

Bueno mi sugerencia es la siguiente, sólo hice algunos cambios menores.

Código Delphi [-]
procedure TForm1.ShellListViewClick(Sender: TObject);
var
  Ruta:string;
  Foto:TPicture;
begin
   if ShellListView.SelectedFolder<>nil then
     Ruta := IncludeTrailingPathDelimiter(ShellListView.RootFolder.PathName) +
               ShellListView.SelectedFolder.DisplayName
   else
     Exit;
   if(UpperCase(ExtractFileExt(Ruta))='.GIF') or
    (UpperCase(ExtractFileExt(Ruta))='.BMP') or
    (UpperCase(ExtractFileExt(Ruta))='.JPG')then
    begin
       Foto := TPicture.Create;
       Foto.LoadFromFile(Ruta);
       Imagen.Picture := Foto;
       Foto.Free;
    end
   else
      Imagen.Picture:=nil; // Si el archivo no es algún formato conocido limpia la imagen
end;

Seguimos en contacto, un saludo.

Al González 04-02-2005 01:06:16

Dos sugerencias
 
¡Hola a todos!

Ohcan:

Espero que te haya funcionado la importante observación que hizo Hector.

Por otra parte, después de examinar el código fuente detecté dos bloques que pueden simplificarse:

En lugar de:
Código:

Foto := TPicture.Create;
Foto.LoadFromFile (Ruta);
Imagen.Picture := Foto;
Foto.Free;

creo que puedes poner simplemente:
Código:

Imagen.Picture.LoadFromFile (Ruta);
Y en lugar de:
Código:

if (UpperCase(ExtractFileExt(Ruta))='.GIF') or
(UpperCase(ExtractFileExt(Ruta))='.BMP') or
(UpperCase(ExtractFileExt(Ruta))='.JPG')then

podría sugerir el uso de la función ghEnCadenas (unidad IGHCadenas.pas de Interfaz GH 7) de la siguiente manera:
Código:

If ghEnCadenas (['.GIF', '.BMP', '.JPG'], ExtractFileExt (Ruta)) Then
La función ghEnCadenas devuelve True si la cadena indicada se encuentra dentro (en) del arreglo dado, con la ventaja de que la comparación es insensible al tamañao (no importa si la extensión del archivo está en mayúsculas o en minúsculas).

Espero esto sea de utilidad, seguimos en contacto.

Al González :).

roman 04-02-2005 03:51:37

¿Y qué tal así?

Código Delphi [-]
if Pos(ExtractFileExt(Ruta) + '?', '.GIF?.BMP?.JPG?') <> 0 then

// Saludos

Ohcan 04-02-2005 10:08:04

Gracias
 
¡Muchas gracias a todos!
Ahora funciona perfectamente... y ahora me estudiaré bien el porqué (no me gusta tropezar 2 veces en la misma piedra...).
Al, lo de la variable Foto era porque ayer (hoy funciona bien como tú dices) no me cogía los jpg si no lo hacía así (??).
Lo del ghEn no me funciona, pero investigaré un poco (aún no he podido)...
Y, gracias, Roman. Me ha parecido una solución muy elegante, pero he tendio que modificarla:
if (ExtractFileExt(Ruta)<>'') and //para que no tenga en cuenta las carpetas
(Pos(UpperCase(ExtractFileExt(Ruta)) + '?', '.GIF?.BMP?.JPG?')<>0) then


Saludos

roman 04-02-2005 19:26:16

Cita:

Empezado por Ohcan
pero he tendio que modificarla:
if (ExtractFileExt(Ruta)<>'') and //para que no tenga en cuenta las carpetas
(Pos(UpperCase(ExtractFileExt(Ruta)) + '?', '.GIF?.BMP?.JPG?')<>0) then

Cierto, no cubría el caso de extensiones vacías, aunque creo que esto debe funcionar:

Código Delphi [-]
if Pos('*' + Uppercase(ExtractFileExt(Ruta)) + '?', '*.GIF?*.BMP?*.JPG?') <> 0 then

// Saludos

Al González 04-02-2005 23:29:34

¡Hola de nuevo!

Cita:

Empezado por Ohcan
...Lo del ghEn no me funciona, pero investigaré un poco (aún no he podido)...

Pues estoy a tus órdenes, si te puedo ayudar en algo.

Saludos.

Al González :).

Si el oído pensara, el corazón hablaría.


La franja horaria es GMT +2. Ahora son las 14:14:45.

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