Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Ejecutar un fichero en msdos y ver en un progress el tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=84012)

juank1971 27-08-2013 22:50:51

Ejecutar un fichero en msdos y ver en un progress el tiempo de ejecucion
 
Hola amigos:
Estoy haciendo una aplicacion como una especie de saco que grava casi todo lo que necesito de electrónica generalmente son Datasheet que son PDF, la mayoría, y algunos ficheros de otro tipo, el final es todo metido a una base de sqlite3, todo funciona bien, los guardo en un campo blob.

Los tengo organizados y todo funciona bien , los saco o cosulto cuando quiero y todo organizado por categoría, Ahora bien:
A la hora de hacer busquedas se me ocurrio antes de entrar los pdf a la base de datos sqlite, los convierto a texto, y guardo el texto en un campo entonces las busquedas se hacen en sqlite rapido y puedes hacer una busqueda de todos los miles de pdf dentro de cada documento, algo que en windows no se puede hacer rapido , buscar dentro de pdf.

Pero el problema lo tengo en la forma que hago es en un programa sugerido por ustedes en otro hilo esta linea de comandos msdos:

pdftotext -raw biblia delphi.pdf prueba.txt

con eso optengo un texto con lo que necesito y luego lo guardo a la base de datos, tienen alguna idea de como puedo hacer eso y saber con un progress un aproximado del tiempo para que el usuario no tenga que esperar sin ver nada en ese indexado previo a guardar el archivo pdf???

gracias juank

Ñuño Martínez 29-08-2013 02:56:03

Macho, me está costando mucho leerte. Yo de ti revisaría las comas y, posiblemente, las tildes. A ver si mañana por la mañana, después de dormir, me entero de algo.

juank1971 30-08-2013 15:21:26

cierto
 
Tienes razon, siempre escribo apurado y trato de explicar tanto que me pierdo en explicaciones, es simple:

Una idea para ejecutar un TProgress ejecutando un programa en msdos, en este caso es el PDFtoText.exe, o sea ejecutar algo en dos y que el usuario no se me duerma esperando que vea al menos un aproximado de que tiempo le falta.

Gracias Juank

ecfisa 30-08-2013 21:54:23

Hola juank1971.

No conozco ni he usado el PDFtoText, pero fijate si te sirve de este modo (o al menos te da alguna idea para continuar) :
Código Delphi [-]
...
uses ShellApi;

var
  ProcHandle : THandle = 0;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
end;

procedure TForm1.ExecWithProgressBar(const AppName, Params: string);
var
  ExecInfo: TShellExecuteInfo;
begin
  ZeroMemory(@ExecInfo, SizeOf(ExecInfo));
  with ExecInfo do
  begin
    cbSize       := SizeOf(ExecInfo);
    fMask        := SEE_MASK_NOCLOSEPROCESS;
    Wnd          := ProcHandle;
    lpVerb       := 'open';
    lpFile       := PChar(AppName);
    lpParameters := PChar(Params);
    nShow        := SW_HIDE;
  end;
  if not ShellExecuteEx(@ExecInfo) then
    MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'',MB_ICONERROR+MB_OK)
  else
  begin
    ProcHandle := ExecInfo.hProcess;
    Timer1.Enabled := True;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  ExitCode: DWORD;
begin
  ProgressBar1.StepIt;
  if GetExitCodeProcess(ProcHandle, ExitCode) then
  begin
    if not (ExitCode = STILL_ACTIVE) then
    begin
      CloseHandle(ProcHandle);
      ProcHandle := 0;
    end
    else
      MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'',MB_ICONERROR+MB_OK);
    Timer1.Enabled := False;
   end;
end;
...


Ejemplo de llamada (imprimir un documento .pdf con PDFCreator):
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecWithProgressBar('C:\Program Files\PDFCreator\PDFCreator.exe',
    '/NoStart/PFC:\Users\xxxx\Documents\Un_Documento.pdf');

Saludos :)

juank1971 31-08-2013 15:41:41

ok gracias amigo pero desde que se ejecuta el timer la primera vez ya el
ExitCode es igual al STILL_ACTIVE y me salta para el else y me muestra un mensaje de todo correcto.
estoy mirando a ver porque me da eso.
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject); 
var   ExitCode: DWORD; 
begin  
  ProgressBar1.StepIt;   
  if GetExitCodeProcess(ProcHandle, ExitCode) then   
  begin
    if not (ExitCode = STILL_ACTIVE) then     
    begin       
      CloseHandle(ProcHandle);       
      ProcHandle := 0;     
    end     
    else       
      MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'',MB_ICONERROR+MB_OK);  //salta para esta linea desde la primea vez, 
                                                 // y elfichero que estoy ejecutando en msdos es bastante largo se demora ejecutando     
  Timer1.Enabled := False;    
  end; 
end;

ecfisa 31-08-2013 17:43:43

Hola

Proba de este modo:
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
var
  ExitCode: DWORD;
begin
  ProgressBar1.StepIt;
  if GetExitCodeProcess(ProcHandle, ExitCode) then
  begin
    if not (ExitCode = STILL_ACTIVE) then
    begin
      CloseHandle(ProcHandle);
      ProcHandle     := 0;
    end;
    Timer1.Enabled := False;
   end;
end;

Saludos. :)

juank1971 31-08-2013 23:36:45

ok gracias


La franja horaria es GMT +2. Ahora son las 08:37:56.

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