Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 12 su 12
  1. #11
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,326
    ok, io ho fatto cosi... prendendo i nomi dei files da una listbox:

    non ho capito come attivare 'waitexecute'?

    grazie

    codice:
    procedure TForm1.BtnCreaFilePDFClick(Sender: TObject);
    var
      i:integer;
      Stringa:String;
      Sd:TSaveDialog;
    begin
      if cxListBoxFileWord.Count=0 then Exit;
      Sd := TSaveDialog.Create(nil);
      Sd.InitialDir := GetCurrentDir;
      try
        Sd.Filter:='File PDF (*.pdf*)|*.pdf*|Tutti i File|*.*';
        if Sd.Execute then
         begin
          Stringa:='';
          for i := 0 to cxListBoxFileWord.Items.Count-1 do
             stringa:=stringa+'"'+cxListBoxFileWord.Items[i]+'" ';
    
             stringa:=stringa+' cat output '+Sd.FileName;
    
             screen.Cursor := crHourGlass;
             try
               ShellExecute(Handle, 'open', pchar('pdftk') , pchar(Stringa), '',SW_SHOWNORMAL) ;
               screen.Cursor := crDefault;
               ShowMessage('Comando eseguito correttamente');
             except
               screen.Cursor := crDefault;
               ShowMessage('Comando NON eseguito');
             end;
    
         end;
      finally
        screen.Cursor := crDefault;
        Sd.Free;
      end;
    end;

  2. #12
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Se i file son tanti e grossi (e magari letti da rete) il metodo che hai usato, asincrono, ti ritorna (può tornare) a delphi PRIMA del completamento.

    Ti serve quindi una "esegui comando esterno e aspetta che finisca"
    (ecco perchè spesso è importante poter fare un buon debug... se non finisce il programma delphi starva)
    Qualcosa tipo questo

    codice:
    uses shellapi;
    function WaitExecute(i_executefile:string;i_parametri:string;i_flagEsecuzione:cardinal):integer;
    
    var
       SEInfo: TShellExecuteInfo;
       ExitCode: DWORD;
    begin
       result:=0;
       if not fileexists(i_executefile) then exit;
    
       FillChar(SEInfo, SizeOf(SEInfo), 0) ;
       SEInfo.cbSize := SizeOf(TShellExecuteInfo) ;
       with SEInfo do begin
         fMask := SEE_MASK_NOCLOSEPROCESS;
         Wnd := Application.Handle;
         lpFile := PChar(i_ExecuteFile) ;
         lpParameters:=pchar(i_parametri);
    // lpDirectory := PChar(directory predefinita avvio, in generale NON funziona bene) ;
         nShow := i_flagEsecuzione // SW_HIDE;
       end;
    // qui se proprio vuoi lanciarti puoi nice-are il processo corrente
       if ShellExecuteEx(@SEInfo) then begin
         repeat
           Application.ProcessMessages;
    // qui ci puoi mettere quello che vuoi, delay etc
    
           GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
         until (ExitCode <> STILL_ACTIVE) or
    Application.Terminated;
       end
       else ShowMessage('Errore avviando '+i_executefile);
    
       result:=ExitCode;
    end;

    EDIT: ti sconsiglio di manipolare direttamente il cursore.
    E' meglio fare qualcosa tipo

    vecchiocursore:tcursor

    (...)
    vecchiocursore:=screen.cursor;
    screen.cursor=qualcosa
    (...)
    screen.cursor:=vecchiocursore

    soprattutto se hai "qualcosa" che ti altera il cursore, mettendolo SQL wait etc

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.