Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-03-2012
cmfab cmfab is offline
Miembro
 
Registrado: jun 2010
Posts: 419
Poder: 14
cmfab Va por buen camino
Recorrer archivos de un directorio y mostrar graficos en miniaturas

Hola a todos, tengo la siguiente pregunta. alguna recomendacion de como recorrer un arbol de directorios de la PC y que en un panel derecho me vaya mostrando los archivos JPEG o BMP que contenga el directorio en forma de imagenes en miniatura. lo necesitaria con componentes estandar de la paleta de Delphi

Gracias
Responder Con Cita
  #2  
Antiguo 14-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola cmfab.

En tu form poné un TDirectoryListBox (pestaña Win31) y un TScrollBox (pestaña Aditional).
Código Delphi [-]
...

implementation

uses contnrs, jpeg;

var
  ObjList: TObjectList;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DirectoryListBox1.Directory:= '';
  ObjList:= TObjectList.Create;
end;

procedure TForm1.BuscarImagenes(const Ruta: string);
var
  SR: TSearchRec;
  Img: TImage;
  E: string;
  n: Integer;
begin
  if FindFirst(Ruta + '\*.*', faAnyFile, SR) = 0 then
  begin
    n:= 0;
    repeat
      E:= ExtractFileExt(SR.Name);
      if (E='.jpg')or(E='.jpeg')or(E='.bmp')or(E='.emf')or(E='.wmf') then
      begin
        Img:= TImage.Create(Self);
        ObjList.Add(Img);
        with TImage(ObjList.Items[n]) do
        begin
          Height:= 80;
          Width:= 80;
          Left:= 10;
          Top := 120 * n + 10;
          Stretch:= True;
          Picture.LoadFromFile(Ruta+'\'+SR.Name);
          Parent:= ScrollBox1;
          Inc(n);
        end;
      end
    until FindNext(SR) <> 0;
    FindClose(SR)
  end
end;

procedure TForm1.DirectoryListBox1Change(Sender: TObject);
begin
  ObjList.Clear;
  BuscarImagenes(DirectoryListBox1.Directory);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(ObjList) then
    FreeAndNil(ObjList);
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 15-03-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Hola a todos.

Ecfisa he probado este codigo y va de fábula, hace tiempo que quería hacer algo parecido para una secuencia de imagenes.

Mi duda es si en vez de buscar los datos de un directorio, se pueden sacar las imagenes directamente de una tabla para que solo enseñe las del codigo en pantalla.

Me explico, tengo una base de datos con fotos de camiones de bomberos y me gustaria poder visualizar solo las del camion que estoy viendo en este momento, luego que al cambiar de registro me cargue las del nuevo registro y ya rizando el rizo que al hacer click sobre la miniatura me abra la ampliación.

Actualmente hago un savetostream para guardar y un loadfromstream para cargar.

Muchas gracias

Josep
Responder Con Cita
  #4  
Antiguo 15-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jafera.

Si no te interpreto mal, me parece que en tu caso es muchisimo más sencillo.

Creo que podrías usar un TDBControlGrid con su propiedad DataSource asociada al TDataSource correspondiente a la tabla. Luego agregas en el TDBControlGrid un TDBImage y en su propiedad DataField seleccionas el campo que corresponde a la imágen.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 15-03-2012
cmfab cmfab is offline
Miembro
 
Registrado: jun 2010
Posts: 419
Poder: 14
cmfab Va por buen camino
justo lo que necesitaba, gracias por todas la srespuestas y por su tiempo
Responder Con Cita
  #6  
Antiguo 16-03-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Gracias Ecfisa.

Tu proposición funciona bien, solo que tengo un pequeño problema, al asignarle la imagen el TDBImage, me dice que bitmap image is not valid.

He probado con un TImage a secas asignandole el valor y funciona, solo que me muestra una sola foto y no toda la hilera

Código Delphi [-]
 
procedure TF_Camions.Fotos_CAfterScroll(DataSet: TDataSet);
var
        jpg:TJpegImage;
        foto:TMemoryStream;
begin
        If FileExists('C:\Bombers_1.0\Temp\Temporal.jpg') then
        DeleteFile ('C:\Bombers_1.0\Temp\Temporal.jpg');
        If Fotos_CFOTO.Value<>'' then
        begin
                Jpg:=TJpegImage.create;
                Foto:=TMemoryStream.create;
                try
                        Fotos_CFOTO.SaveToStream(Foto);
                        Foto.Seek(0,soFromBeginning);
                        Jpg.LoadFromStream(Foto);
                        Jpg.SaveToFile('C:\Bombers_1.0\Temp\Temporal.jpg');
                        if jpg.Width > jpg.Height then
                        begin
                                Image2.Width := 500;
                                Image2.Height := 376;
                                Image2.Picture.Assign(Jpg);
                                Image1.Width := 500;
                                Image1.Height := 376;
                                Image1.Stretch:=False;
                                Image1.Picture.Assign(Jpg);
                                Image4.Width:=50;
                                Image4.Height:=37;
                                Image4.Stretch:=True;
                                Image4.Picture.Assign(Jpg); 
                        end
                        else
                        begin
                                Image2.Width := 376;
                                Image2.Height:=500;
                                Image2.Picture.Assign(Jpg);
                                Image1.Width := 282;
                                Image1.Height := 376;
                                Image1.Stretch:=True;
                                Image1.Picture.Assign(Jpg);
                                Image4.Width:=37;
                                Image4.Height:=50;
                                Image4.Stretch:=True;
                                Image4.Picture.Assign(Jpg); 
                        end;
                finally
                        Foto.Free;
                        Jpg.Free;
                end;
        end
        else
        begin
                Image2.Picture.Assign(nil);
                Image1.Picture.Assign(nil);
                Image4.Picture.Assign(nil);
        end;
end;

Gracias de nuevo

Josep
Responder Con Cita
  #7  
Antiguo 17-04-2012
MARIA_MAR MARIA_MAR is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 21
Poder: 0
MARIA_MAR Va por buen camino
Hola ecfisa,
Como siempre tus respuestas son muy interesantes. Mi pregunta es, ¿cómo se haria para al hacer click sobre una de esas miniaturas que se viese a tamaño de pantalla completa?.
Gracias.
Responder Con Cita
  #8  
Antiguo 17-04-2012
MARIA_MAR MARIA_MAR is offline
Miembro
NULL
 
Registrado: nov 2011
Posts: 21
Poder: 0
MARIA_MAR Va por buen camino
Perdona ecfisa, quiza deberia aclarar que yo me refiero al codigo que pusiste en la primera respuesta de este post, yo necesito algo sencillo, sin tablas ni base de datos ni nada.
Saludos
Responder Con Cita
  #9  
Antiguo 17-04-2012
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.471
Poder: 21
newtron Va camino a la fama
Hola.

Aunque le preguntas a ecfisa y como le tengo algo de manía te voy a contestar yo.

Esto hay varías formas de hacerlo, una fácil es abrirlo con el visor que tenga predeterminado windows para ese tipo de imágenes y sería tal que así:

Código Delphi [-]
Archivo:='C:\IMAGEN.JPG';
ShellExecute(Handle, 'open', PChar(Archivo), '', '', SW_SHOW)

ten en cuenta que debes de añadir en el uses la unidad ShellApi

Saludos
__________________
Be water my friend.
Responder Con Cita
  #10  
Antiguo 17-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola MARIA_MAR.

Como dice mi compañero de penurias maritales, utilizando el visor de imágenes asociado es la forma más simple.

Pero si deseas hacerlo sobre el código anterior, tendrías que agregarle el evento OnClick a la imágen creada:
Código Delphi [-]
type
  TForm1 = class(TForm)
  ...
  private
    procedure BuscarImagenes(const Ruta: string);
    procedure ImageClick(Sender: TObject);
  end;
...
implementation
...

(* Crear form, Imagen y mostrar seleccion *)
procedure TForm1.ImageClick(Sender: TObject);
var
  Frm: TForm;
  Img: TImage;
begin
  Frm:= TForm.Create(nil);
  try
    Frm.Caption:= 'PRESENTACION';
    Frm.WindowState:= wsMaximized;
    Frm.BorderStyle:= bsSingle;
    Img:= TImage.Create(Frm);
    Img.Align:= alClient;
    Img.Stretch:= True;
    Img.Parent:= Frm;
    Img.Picture.Assign(TImage(Sender).Picture);
    Img.Parent:= Frm;
    Frm.ShowModal;
  finally
    Frm.Free;
  end;
end;

procedure TForm1.BuscarImagenes(const Ruta: string);
var
  SR: TSearchRec;
  Img: TImage;
  E: string;
  n: Integer;
begin
  if FindFirst(Ruta + '\*.*', faAnyFile, SR) = 0 then
  begin
    n:= 0;
    repeat
      E:= ExtractFileExt(SR.Name);
      if (E='.jpg')or(E='.jpeg')or(E='.bmp')or(E='.emf')or(E='.wmf') then
      begin
        Img:= TImage.Create(Self);
        ObjList.Add(Img);
        with TImage(ObjList.Items[n]) do
        begin
          Height:= 80;
          Width:= 80;
          Left:= 10;
          Top := 120 * n + 10;
          Stretch:= True;
          Picture.LoadFromFile(Ruta+'\'+SR.Name);
          Parent:= ScrollBox1;
          OnClick:= ImageClick;  // <== Asignar evento OnClick
          Inc(n);
        end;
      end
    until FindNext(SR) <> 0;
    FindClose(SR)
  end
end;

...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Recorrer directorio Pedro-Juan Conexión con bases de datos 4 09-02-2011 18:50:43
Mostrar ficheros de un directorio y subdirectoros chinchan C++ Builder 3 11-01-2009 22:26:49
Mostrar directorio con ShellExecute MON___ API de Windows 5 26-03-2008 13:07:00
Borrar archivos de un directorio nelem Internet 6 29-10-2007 16:04:00
Mostrar un directorio con el explorador de archivos de windows Jan_polero API de Windows 2 11-01-2005 18:40:21


La franja horaria es GMT +2. Ahora son las 10:48:30.


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