Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir contenido de un LongBlob con aplicacion predeterminada (https://www.clubdelphi.com/foros/showthread.php?t=85933)

tonisib 27-05-2014 12:52:19

Abrir contenido de un LongBlob con aplicacion predeterminada
 
Buenos dias!
Ando unos días dandole vueltas e indagando por el foro y he visto ideas pero no exactamente lo que busco.
Tengo un LongBlob en MySQL que en principio me almacena diferentes tipus de ficheros (principalment jpg y pdf), muestro un texto asociado al fichero en un grid y al clicar sobre el me gustaria que abriera el archivo con el programa predeterminado de Windows.

he probado a assignar el longBlob a un TMemoryStream ... pero luego no se como abrirlo con la aplicacion predeterminada de Windows. Si es un jpg pues si lo puedo cargar en un TImage y mas o menos me puedo defender, però si es un PDF me gustaria poder abrirlo con el visor que tenga Windows por defecto y ya de paso pues el jpg o cualquier otro formato tambien.
Igual lo que pido es una locura y habria que tratar el problema de otra manera y yo estoy obscecado en esto :)

¿Alguna idea?
Muchisimas gracias!

Neftali [Germán.Estévez] 27-05-2014 14:13:06

Lo lógico es que primero lo grabes en un archivo temporal con la extensión correcta (según el tipo de fichero) y luego lo habr´ñas con un ShellExecute o WinExec (con ambas "saltará" el programa que tengas definido en Windows por defecto para abrirlo).

duilioisola 29-05-2014 12:41:39

Yo hago lo que comenta Neftalí.
Si quiero ejecutarlo sin más utilizo:
Código Delphi [-]
ShellExecute(FMMain.Handle, nil, PChar(Fichero), nil, nil, SW_SHOW)
Ten en cuenta que el primer parámetro debe ser de un formulario. Yo utilizo el principal de la aplicación.

En otro momento quiero ejecutarlo y ver si el usuario ha cambiado algo (modificó el .DOC o .XLS por ejemplo)
En este caso obtengo un HASH del archivo (MD5) ejecuto mediante un procedimiento RunAndWait y luego obtengo el HASH nuevamente. Si son iguales es que no se ha modificado.
La función CalcHash es de Seoane.
Código Delphi [-]
         MD5 := CalcHash(Fichero, haMD5);
         RunAndWait(FMMain.Handle, Fichero, '');

         if (MD5 <> CalcHash(Fichero, haMD5)) then
         begin
            if (MessageDlg('El documento ha cambiado. ¿Quiere reemplazar el archivo en la base de datos?', mtConfirmation,
              [mbYes, mbNo], 0, mbYes) = mrYes) then
            begin
[...]

Te dejo el código que utilizo. No recuerdo de dónde lo saqué:

Código Delphi [-]
function TDMMain.RunAndWait(Handle: THandle; Ejecutable, Argumentos: string; const RunDirectory: PChar = nil;
  const Visibilidad: integer = sw_shownormal): DWORD;
var
   Info: TShellExecuteInfo;
   pInfo: PShellExecuteInfo;
   ExitCode: WORD;
begin
   { Puntero a Info }
   { Pointer to Info }
   pInfo := @Info;
   { Rellenamos Info }
   { Fill info }
   with Info do
   begin
      cbSize := SizeOf(Info);
      fMask := SEE_MASK_NOCLOSEPROCESS;
      wnd := Handle;
      lpVerb := nil;
      lpFile := PChar(Ejecutable);
      { Parametros al ejecutable }
      { Executable parameters }
      lpParameters := PChar(Argumentos + #0);
      if RunDirectory = '' then
         lpDirectory := nil
      else
         lpDirectory := PChar(RunDirectory + #0);
      nShow := Visibilidad;
      hInstApp := 0;
   end;
   { Ejecutamos }
   { Execute }
   if not ShellExecuteEx(pInfo) then
      Result := GetLastError
   else
      Result := Info.hInstApp;

   { Esperamos que termine }
   { Wait to finish }
   repeat
      ExitCode := WaitForSingleObject(Info.hProcess, 500);
      Application.ProcessMessages;
   until (ExitCode <> WAIT_TIMEOUT);
end;


La franja horaria es GMT +2. Ahora son las 09:07:48.

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