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)

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 02:33:58.

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