Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-06-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 22
gluglu Va por buen camino
Ya voy encaminando la cosa !

Claro ! Lo que estoy copiando al portapapeles desde el explorador de windows, son uno o varios 'nombres' de ficheros. Lo que tengo es que analizar esos nombres y después tratar los ficheros correspondientes para incorporarlos al TImage.

Cuando tenga la solución definitiva, la pondré aquí.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 12-06-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 22
gluglu Va por buen camino
Aquí va la solución.

Sirve para copiar pegar desde el Portapapeles un fichero (por ejemplo seleccionado desde el explorador de WIndows) que contenga una imagen tipo JPG o BMP.

Código Delphi [-]
...
var
  f    : TFileStream;
  Jpg  : TJpegImage;
  Hand : THandle;
  Buffer    : Array [0..MAX_PATH] of Char;
  numFiles  : Integer;
  File_Name : String;
  Jpg_Bmp   : String;
  BitMap    : TBitMap;
  ImageAux  : TImage;

begin
 
  ImageAux := TImage.Create(Self);
 
  if Clipboard.HasFormat(CF_HDROP) then begin
 
    Clipboard.Open;
    try
      Hand := Clipboard.GetAsHandle(CF_HDROP);
      If Hand <> 0 then begin
        numFiles := DragQueryFile(Hand, $FFFFFFFF, nil, 0) ;
        if numFiles > 1 then begin
          Clipboard.Close;
          ImageAux.Free;
          MessageError('El Portapapeles contiene más de un único fichero. No es posible pegar');
          Exit;
        end;
        Buffer[0] := #0;
        DragQueryFile( Hand, 0, buffer, sizeof(buffer)) ;
        File_Name := buffer;
      end;
    finally
      Clipboard.close;
    end;
 
    f      := TFileStream.Create(File_Name, fmOpenRead);
    Jpg    := TJpegImage.Create;
    Bitmap := TBitmap.Create;
 
    // Check if Jpg File
    try
      Jpg.LoadFromStream(f);
      ImageAux.Picture.Assign(Jpg);
      Jpg_Bmp := 'JPG';
    except
      f.seek(0,soFromBeginning);
      Jpg_Bmp := '';
    end;
 
    if Jpg_Bmp = '' then begin
      try
        Bitmap.LoadFromStream(f);
        Jpg.Assign(Bitmap);
        ImageAux.Picture.Assign(Jpg);
        Jpg_Bmp := 'BMP';
      except
        Jpg_Bmp := '';
      end;
    end;
 
    Jpg.Free;
    Bitmap.Free;
    f.Free;
 
    if Jpg_Bmp = '' then begin
      ImageAux.Free;
      MessageError('Fichero seleccionado no contiene ninguna Imagen del Tipo JPEG o BMP');
      Exit;
    end;
 
  end
  else if Clipboard.HasFormat(CF_BITMAP) then
    ImageAux.Picture.Assign(Clipboard)
  else begin
    ImageAux.Free;
    MessageError('El Portapapeles no contiene ninguna Imagen del Tipo JPEG o BMP');
    Exit;
  end;
 
  Jpg := TJpegImage.Create;
  try
    Jpg.Assign(ImageAux.Picture.Graphic);
  except
    ImageAux.Free;
    MessageError('El Portapapeles no contiene ninguna Imagen del Tipo JPEG o BMP');
    Jpg.Free;
    Exit;
  end;
  Jpg.Free;

  Image1.Picture.Assign(ImageAux.Picture);

Hago uso de ImageAux (de tipo TImage) para comprobar previamente la validez del contenido del portapapeles.

He hecho pruebas con varios programas (Adobe Acrobat, Word, Excel, ...) y la mayoría de ellos permiten que ImageAux.Picture.Assign(Clipboard) funcione, que se asigne una especie de 'Imagen' del contenido del portapapeles a un TImage.

Pero realmente no se trata en sí mismo, de un JPG o BMP, y es por ello que en operaciones posteriores daría error.

Quiero indicar que MessageError es una rutina propia, que muestra el error en pantalla. Y los diferentes 'Exit' los he dejado también tal cual ya que lo mostrado es parte de una rutina más amplia.

En el uses de la unit, aparte de otros, debereis incluid ClipBrd y JPEG.

Saludos y espero a alquien le pueda servir
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 20-10-2010
martinartaza martinartaza is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 77
Poder: 15
martinartaza Va por buen camino
Para saber el tamaño del archivo seleccionado.

Hola Gluglu, ya se que el hilo es viejo, mas de 6 años, lo que pasa que donde estoy trabajando estamos con delphi 6 y se necesita guardar imagen y pasarla a la base de datos y también lo había pensado como vos, que desde el navegador o desde el explorador de windows se pueda copiar, lo único que se agrega de complejidad es que necesito saber el tamaño del archivo seleccionado.

O sea que si se elije un archivo de más de 3 MB no deje hacer la operación o si la imagen que se copio en el portapapeles es mayor a 3 mb tampoco.

Bueno eso necesito, espero que leas el post y si tiene la respuesta la compartes como hiciste con el código anterior, mientras tanto voy a buscar como solucionar eso y también lo posteare.

Última edición por martinartaza fecha: 20-10-2010 a las 15:14:37.
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
Pegar una imagen en un doc gabyzava Varios 3 17-08-2007 18:54:07
Pegar fichero desde portapapeles Rudorf API de Windows 2 17-04-2007 05:45:34
Copiar pegar y cortar una imagen!!!! Juangu Gráficos 4 09-06-2005 18:28:24
pegar imagen a word desde delphi ciscu Servers 3 14-01-2004 12:00:52
Texto-Clipboard-imagen OmarPerez Varios 1 25-11-2003 05:02:03


La franja horaria es GMT +2. Ahora son las 19:30:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi