Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recorrer archivos de un directorio y mostrar graficos en miniaturas (https://www.clubdelphi.com/foros/showthread.php?t=78033)

cmfab 14-03-2012 19:24:25

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

ecfisa 14-03-2012 23:34:24

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.

jafera 15-03-2012 12:39:36

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

ecfisa 15-03-2012 12:59:57

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.

cmfab 15-03-2012 14:09:05

justo lo que necesitaba, gracias por todas la srespuestas y por su tiempo

jafera 16-03-2012 11:29:25

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

ecfisa 18-03-2012 07:43:21

Hola jafera.

Entiendo el problema pero al menos yo, no pude encontrar en forma directa evento o redefinición de método alguno para hacer la conversión de TJPEGImage a TBitmap, antes de que se produzca la asignación del campo al TDBImage.

Se me ocurrió que una opción, si no son muchos datos, podría ser utilizar un TClientDataSet en memoria. Para el ejemplo que te adjunto hice una tabla con sólo dos campos, un campo entero llamado ('ID') y otro blob que contiente la imágen ('IMAGEN'). Datos estos que cargo en el TClientDataSet mediante un TIBQuery.

Código Delphi [-]
uses jpeg;

procedure JpgToBitmap(AField: TField; B:TBitmap);
var
  J: TJPEGImage;
begin
  J:= TJPEGImage.Create;
  try
    J.Assign(TBlobField(AField));
    B.Height:= J.Height;
    B.Width:= J.Width;
    B.Assign(J)
  finally
    J.Free
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  B: TBitmap;
begin
  CDS1.CreateDataSet;
  CDS1.Open;
  IBQuery1.Open;
  B:= TBitmap.Create;
  try
    while not IBQuery1.Eof do
    begin
      CDS1.Append;
      CDS1ID.Value:= IBQuery1.FieldByName('ID').Value;
      JpgToBitmap(IBQuery1.FieldByName('IMAGEN'), B);
      CDS1Imagen.Assign(B);
      CDS1.Post;
      IBQuery1.Next
    end;
  finally
    B.Free
  end;
  IBQuery1.Close;
  DBCtrlGrid1.DataSource:= DataSourceCDS1;
  DBImage1.DataField:= 'IMAGEN';
  DBImage1.Stretch:= True
end;
A partir de aquí podés utilizar todos los DBControls a traves del ClientDataSet, es decir que para mostrar información no se precisa más. Pero si existe la posibilidad de que se modifique algún dato deberías actualizar lo realizado al finalizar...

Saludos.

jafera 19-03-2012 10:49:21

Gracias por la respuesta Ecfisa.

He implementado el codigo que me pasaste y como el componente ClientDataSet no lo habia usado nunca me arrojó algún problema.

Primero que no encontraba el data provider, le adjunte un dataset provider, luego me dice que no esta declarado el CDS1ID ni el CDS1Imagen (Undeclared Identifier), no se si me dejo alguna cosa la vuelo, ya que repito no había usado jamás este componente.

Saludos

Josep

ecfisa 19-03-2012 13:03:31

Hola jafera.

No tendría que darte ningún problema, lo único engorroso es que tenes que crear los campos persistentes que se correspondan a los de tu tabla. Estos campos no existen físicamente solo en memoria, no se requiere de ningún data provider.

Los campos persistentes se crean al igual que en cualquier TDataSet. Por ejemplo para crear el campo Imagen:
Doble click sobre el componente CDS1 -> Click botón derecho -> New Field y luego:



Del mismo modo con los demás campos, por supuesto que Type tendrá que ser del tipo correspondiente al valor que se le asignará.
Los nombres CDS1ID y CDS1Imagen se pueden dar arbitrariamente, en este caso coinciden con el nombre del componente + nombre de campo.

Si no te queda totalmente claro avisame que adjunto un ejemplo.

Saludos.

jafera 19-03-2012 13:39:16

Gracias de nuevo.

Es que hoy tengo el coco un poco espeso.

Ahora si que los campos aparecen, no sabia que se creaban igual.

El nuevo problema es que ahora me aparece el DBImage en blanco y solo uno, aunque el registro tenga 3 imagenes

No se, sigo investigando

Josep

ecfisa 19-03-2012 14:48:37

1 Archivos Adjunto(s)
Hola jafera.

Te adjunto el ejemplo con la tabla incluída, crea una carpeta y descomprimelo allí, en el evento OnCreate se asignan los valores necesarios al TIBDatabase.

Para evitarte inconvenientes cambié el acceso al predeterminado:
user_name: SYSDBA
password: masterkey

Saludos.

jafera 19-03-2012 15:46:27

No me deja abrir la tabla, ni con el IBConsole, me da este error:

Unsupported on-disk structure for file C:\EJEMPLO\PRUEBA.FDB; found 32779, support 10.

Imagino que es la version de Firebird, yo uso la 1.5.6

Saludos

Josep

ecfisa 19-03-2012 16:42:45

Hola.

Si es eso sin dudas. Pero igual no va a ser problema para que realices la prueba.

Desde el IBExpert, create una tabla:
Código SQL [-]
CREATE TABLE TBIMAGE (
    ID      INTEGER,
    IMAGEN  BLOB SUB_TYPE 1 SEGMENT SIZE 100
);
Luego desde Delphi, cargala con imágenes de tu disco:
Código Delphi [-]
procedure TForm1.GuardarImagenes(Ruta: string);
var
  SR: TSearchRec;
  cc: integer;
begin
  Ruta:= IncludeTrailingPathDelimiter(Ruta);
  if FindFirst(Ruta+'*.JPG', faAnyFile, SR) = 0 then
  begin
    cc:= 1;
    repeat
      IBDataSet1.Append;
      IBDataSet1.FieldByName('ID').AsInteger:= cc;
      TBlobField(IBDataSet1.FieldByName('IMAGEN')).LoadFromFile(Ruta+SR.Name);
      IBDataSet1.Post;
      Inc(cc);
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   IBDataSet1.Open;
   GuardarImagenes('C:\RUTA_A_TUS_IMAGENES');
   IBDataSet1.Close;
end;
Ajustá en el demo los nuevos valores del TIBDatabase y tendrías que poder ejecutarlo sin problemas.

Saludos.

jafera 19-03-2012 18:40:38

Hola Ecfisa, eres como mi angel de la guarda.

Hoy ya no se si echarme a llorar o que.

He puesto un TIBDataSet con su correspondiente DataSource para cargar las imagenes de prueba.

Cuando intento ejecutar el código del button1, me da un error de sql

tokken unknow -line 2 char 1 from

En la tabla he puesto select * from tbimage.

Por hoy abandono porque veo que mi Santo Patrón no me ayuda en nada.

Saludos

Josep

José Luis Garcí 20-03-2012 09:02:15

jafera, tu tabla se llama tbimagen, o es un campo, si es un campo, cambialo por el nombre de la tabla, y has editados los campo (sobre el ibdataset, raton boton derecho, seleccionas la primera columna el campo indice, seleccionas todos de la segunda columna , marcas el checkbox, pulsas el segundo botón empezando por abajo y aceptas el resultado ya puedes conectar.)

jafera 20-03-2012 16:02:37

Bueno, parece que ya he conseguido que se carguen las imagenes.

En vez de colocar el código en el OnCreate, lo he colocado en el OnChange del DBEdit1 para que cada vez que cambio de registro reemplace los valores de las miniaturas.

Pero......

Siempre hay un pero, solo consigo ver una foto en el TDBControilGrid, y moviendome por la barra de desplazamiento va cambiando a la segunda, la tercera, etc, pero seimpre en el primer "frame", no consigo ver toda la ristra de miniaturas.

No se si me dejo algun parámetro por ajustar.

Gracias

Josep

jafera 20-03-2012 17:17:04

Me respondo a mi mismo.

No se que pasaba pero el componente DBImage no habia quedado bien, se movia independientemente del TDBControlGrid.

Lo he borrado, lo he vuelto a insertar y ya se ven las imagenes en miniatura.

Ahora lo que me pasa es que cuando cierro el form y lo vuelvo a abrir sin cerrar la aplicación, me da un error de Database not asigned.

Siguiendo con las imagenes, he modificado la fuente de datos para el TDBControlGrid ya que tenia un IBDataSet en el mismo form con los datos que necesito.

Ahora lo que quiero conseguir es que al dar click en la imagen me la abra en grande.

Saludos

Josep

jafera 21-03-2012 12:38:39

Bueno, pues el componente funciona de verdad.

Ya he conseguido ajustarlo para que me muestre bien las imagenes, antes si me desplazaba a fondo con la barra de desplazamiento horizontal (scroll), me intentaba añadir un registro nuevo, creando una imagen en blanco. Esto lo he solucionado poniendo la propiedad AllowInsert y AllowDelete en false.

Lo unico que de momento no consigo es que al hacer click sobre la miniatura me abra una ampliación de la misma.

En el form existe un TImage al que le asigno el valor del Blob de la tabla mediante un LoadFromStream en el evento AfterScroll del TIBDataSet.

No se si algo de esto me puede servir para pasar este valor desde el click en el DBImage.

En el mismo form tengo un DBgrid con los nombres de las fotos y al hacer click en este DBGrid, me cambia el valor de la foto, o sea la imagen.

Gracias a todos

Saludos

Josep

ecfisa 21-03-2012 19:52:42

Cita:

Lo unico que de momento no consigo es que al hacer click sobre la miniatura me abra una ampliación de la misma.

En el form existe un TImage al que le asigno el valor del Blob de la tabla mediante un LoadFromStream en el evento AfterScroll del TIBDataSet.

No se si algo de esto me puede servir para pasar este valor desde el click en el DBImage.
Hola jafera.

Si lo que buscas es pasar la miniatura del DBImage al Image para verla ampliada allí, es muy sencillo:
Código Delphi [-]
procedure TForm1.DBImage1Click(Sender: TObject);
begin
  Image1.Picture.Assign(DBImage1.Picture);
end;
Para limpiar el TImage:
Código Delphi [-]
   Image1.Picture:= nil;

Saludos.

jafera 22-03-2012 09:40:25

Gracias Ecfisa, espero que disfrutases de tu aniversario, tal como disfruté yo del mio hace un més.

En cuanto al tema de la asignación, claro que si, ya comenté que tenía el coco en otro sitio y muchas veces las soluciones más simples se vuelven un problema inmenso y sin ver la salida del túnel.

Pero....

Otra vez con el pero, como dije utilizé un IBDataSet que tengo en el form para cargar los datos del ClientDataDet en vez de una consulta nueva.

Hay alguna posibilidad de que el cursor se mueva en los registros de la tabla cuando hago click en la miniatura?

Lo que pasa es que si muevo el cursor en el grid asociado a la tabla con el cursor y luego hago click en la miniatura, el cursor no se mueve y me marca un registro que no es el que estoy visualizando.

Saludos

Josep

jafera 22-03-2012 10:10:41

Otra duda, en este procedimiento, cambio la anchura y altura de la imagen dependiendo de la posición en el formulario, esto funciona bien es lo que comentaba en el post anterior. Con el añadido de las miniaturas igual esto se puede quitar y basarnos solo en el click en la miniatura para verla, no se si es mejor.

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);
                        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);
                        end;
                finally
                        Foto.Free;
                        Jpg.Free;
                end;
        end
        else
        begin
                Image2.Picture.Assign(nil);
                Image1.Picture.Assign(nil);
        end;
end;

Cuando asigno el valor de la tabla FOTO al DBImage de la miniatura, puedo ajustar la medida de la misma dependiendo de si la foto es horizontal o vertical?

He intentado con:

Código Delphi [-]
begin
                TumbN.Close;
                TumbN.CreateDataSet;
                TumbN.Open;
                B:= TBitmap.Create;
                try
                        while not Fotos_C.Eof do
                        begin
                              TumbN.Append;
                              TumbNID.Value:= Fotos_C.FieldByName('ID').Value;
                              JpgToBitmap(Fotos_C.FieldByName('FOTO'), B);
                              TumbNFOTO.Assign(B);
                              TumbN.Post;
                              Fotos_C.Next;
                        end;
                finally
                        B.Free
                end;
                TumbN.Last;
                TumbN.First;
                If TumbN.RecordCount = 0 then
                begin
                        DBCtrlGrid1.Visible:=False;
                end
                else
                begin
                        DBCtrlGrid1.Visible:=True;
                        If (TumbN.RecordCount >= 1) and (TumbN.RecordCount <= 10) then
                        begin
                                DBCtrlGrid1.ColCount:=TumbN.RecordCount;
                        end
                        else
                        begin
                                DBCtrlGrid1.ColCount:=10;
                        end;
                end;
                DBCtrlGrid1.DataSource:= DSTumbN;
                DBImage1.DataField:= 'FOTO';
                If DBImage1.Width > DBImage1.Heigth then
                begin
                        DBImage1.Width:=100;
                        DBImage1.Heigth:=75;
                end
                else
                begin
                        DBImage1.Width:=75;
                        DBImage1.Heigth:=10;
                end;
                DBImage1.Stretch:= True;
        end;

La parte en rojo no funciona, no se si el código está mal colocado o no es la función correcta.

Saludos

Josep

jafera 22-03-2012 10:42:56

Y otra consulta, espero sea la última de este post.

Cuando añado nuevas fotos al DataSet, no se refrescan en el Client DataSet, he probado a ejecutar el código en rojo y no funciona, solo cuando cambio de registro, creo porqué la carga del ClientDataSet se realiza en el OnChange del DBEdit1

procedure TF_Camions.Fotos_CAfterPost(DataSet: TDataSet);
var Pos: TBookmark;
begin
Pos := Fotos_C.GetBookmark;
F_ModulFotos.IBTFotosBombers.CommitRetaining;
Fotos_C.Close;
Fotos_C.Open;
TumbN.Close;
TumbN.Open;
Fotos_C.GotoBookmark(Pos);
Fotos_C.FreeBookmark(Pos);
end;

Saludos

Josep

MARIA_MAR 17-04-2012 17:23:20

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.

MARIA_MAR 17-04-2012 17:47:34

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

newtron 17-04-2012 19:01:52

Hola.

Aunque le preguntas a ecfisa y como le tengo algo de manía :p 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

ecfisa 17-04-2012 19:35:20

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.

roman 17-04-2012 20:26:38

Otra opción es ejecutar directamente el visor de imágenes de windows. La solución de newtron abrirá la aplicación asociada para ver/editar imágenes, que no necesariamente es el visor.

// Saludos

MARIA_MAR 18-04-2012 18:07:45

Gracias ecfisa, como siempre me solucionas mis problemas rápidamente. Es justo lo que queria.
La respuesta de newtrom tambien es buena idea.

Gracias a todos por ser tan atentos.

newtron 18-04-2012 19:27:37

Cita:

Empezado por roman (Mensaje 430241)
Otra opción es ejecutar directamente el visor de imágenes de windows. La solución de newtron abrirá la aplicación asociada para ver/editar imágenes, que no necesariamente es el visor.

// Saludos

Tiquismiquis. :p

jafera 19-04-2012 17:40:10

Hola a todos.

Encontre un componente en las jedi, el JvDBImage, que si acepta archivos en jpg y no es necesario convertirlos a bitmap paso necesario para poder usar el DBImage standart.

Saludos a todos.

Josep

MARIA_MAR 20-04-2012 17:22:05

Buenas tardes ecfisa,

Me estoy complicando un poco la vida, y si quisiera que las imagenes que se van mostrando en miniatura en el scrollbox, apareciesen cada x segundos. ¿ Lo puedo hacer utilizando Timer? , ¿ como ?
Gracias de nuevo

ecfisa 20-04-2012 21:45:12

Hola Maria.

En ese caso creo que sería más sencillo trabajar todo en un form.
Poné un TScrollBox, un TImage, un TTimer y un TPanel donde irán un TCheckBox (muestra aleatoria) y dos TButton (Start/Stop). El ejemplito es muy simple y lo hice sin mucho detalle, pero seguro que podrás usarlo como base para algo más elaborado y optimizado.

La pantalla queda así:



El código:
Código Delphi [-]
implementation  

uses contnrs, jpeg;

var
  ObjList: TObjectList;

// Mostrar imágen
procedure TForm1.ShowImage(AImage: TImage);
begin
  Image1.Picture:= nil;
  Image1.Picture:= AImage.Picture;
end;

// Imagen OnClick
procedure TForm1.ImageClick(Sender: TObject);
begin
  ShowImage(TImage(Sender));
end;

// Buscar y cargar imagenes en ObjectList
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:= 120 * n + 10;
          Top := 10;
          Stretch:= True;
          Picture.LoadFromFile(Ruta+'\'+SR.Name);
          Parent:= ScrollBox1;
          OnClick:= ImageClick;  
          Inc(n);
        end;
      end
    until FindNext(SR) <> 0;
    FindClose(SR)
  end
end;

// Form OnCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  Timer1.Enabled:= False;
  ObjList:= TObjectList.Create;
  BuscarImagenes('C:\RUTA_A_TUS_IMAGENES')
end;

// Timer OnTimer
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Inc(FImgCount);
  if CheckBoxRnd.Checked then
    FImgCount:= Random(ObjList.Count)
  else if FImgCount = ObjList.Count then
    FImgCount:= 0;
  ShowImage(TImage(ObjList.Items[FImgCount]));
end;

// Comenzar muestra
procedure TForm1.btnStartClick(Sender: TObject);
begin
  if CheckBoxRnd.Checked then
    FImgCount:= Random(ObjList.Count)
  else
    FImgCount:= 0;
  Timer1.Enabled:= True;
  ShowImage(TImage(ObjList.Items[FImgCount]));
end;

// Finalizar mostrar 
procedure TForm1.btnStopClick(Sender: TObject);
begin
  Timer1.Enabled:= False;
end;
end.

Saludos. :)

MARIA_MAR 24-04-2012 12:27:19

Ideal ecfisa, como siempre dando soluciones.
Gracias por tu tiempo

MARIA_MAR 14-05-2012 17:47:04

Hola de nuevo,

Me gustaria imprimir, a través de un botón, la imagen que se muestra en grande en el Timage, pero no sé cómo pasar la ruta de la imagen , si la escribo a mano me funciona bien ¿cómo puedo saber dicha ruta?.

Hago lo siguiente:

Código Delphi [-]
procedure TForm1.B_imprimirClick(sender: Tobject);
var
JPG : TJpegImage;
R : TRect;
begin
if Printer.Printing then
Application.MessageBox('Impresora ocupada', 'Error de impresion', 0)
else
begin
Printer.BeginDoc;
with Printer.Canvas do
begin
JPG := TJpegImage.Create;
JPG.LoadFromFile('C:\FOTOS\IMG15.JPG');  // Asi me funciona
R:=Rect(0,0,3524,2434);
StretchDraw(R, JPG);
JPG.Free;
end;
Printer.EndDoc;
end;
end;

Debe ser una tonteria, pero no lo consigo.
Gracias.

Casimiro Notevi 14-05-2012 18:19:56

Por favor, recuerda crear un hilo nuevo cuando sean preguntas distintas a la que originó el hilo actual.
Ya sabes, preguntas distintas en hilos distintos.
Gracias :)


La franja horaria es GMT +2. Ahora son las 07:51:25.

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