GARANTIR DESCONTO

Fórum Abrir Aplicativo e Aguardar o fechamento..? #260454

29/11/2004

0

Colegas..

Como faço para abrir um aplicativo externo ao delphi, e esperar até que seja encerrado o processo para continuar executando o delphi..?

por exemplo :

Pretendo abrir um arquivo armazenado no firebird com a extensão .doc.

Como faço para chamar o aplicativo responsável pelo processo desta extensão, achá-lo, executá - lo e aguardar que o arquivo seja fechado para continuar a utilizar o sistema?

Agradeço muito a atenção de todos, antecipadamente.


Cabelo

Cabelo

Responder

Posts

30/11/2004

Aroldo Zanela

Colega,

Como eu já te conheço há muito tempo, tenho certeza que você deve ter pesquisado antes de postar. Mas mesmo assim, neste link tem uma resposta que considero suficiente, veja: http://delphiforum.icft.com.br/forum/viewtopic.php?t=21753&highlight=winexec+aguardar


Responder

Gostei + 0

30/11/2004

Cabelo

Cra valeu a dica, mas eu esquecí de mencionar uma informação primordial, eu estou compilando em .CLX, e não posso usar a classe windows, como fazer?


Responder

Gostei + 0

30/11/2004

Cabelo

Alguém??


Responder

Gostei + 0

30/11/2004

Dopi

Por incrivel que pareça é bem mais simples que no Windows...

procedure RunCommand(Command: String; Wait : Boolean);
var
  {$ifdef MSWINDOWS}  Show : Integer;{$endif}
  ConnectCommand : PChar;
begin
  {$ifdef LINUX}
     if not Wait then
        Command := Command + ´ &´ ;  { & = Rodar em BackGround}
     ConnectCommand := PChar(Command);
     Libc.system(ConnectCommand);
  {$endif}
  {$ifdef MSWINDOWS}
  { IMPLEMENTAR AQUI O CODIGO  WINDOWS PARA ESPERA }
     ConnectCommand := PChar(Command);
     Show := sw_ShowNormal;
     winexec(ConnectCommand, Show);
  {$endif}
end;


Ou seja, é só dar um System( ´SeuComando´ ) sem o & no final...


Responder

Gostei + 0

01/12/2004

Dopi

Esqueci de um detalhe, adcione na Uses da Unit:

 {$ifdef LINUX} Libc, {$endif}
 {$ifdef MSWINDOWS} Windows, {$endif}


Nao há problema uma aplicaçao CLX fazer uso da unit Windows... os proprios fontes da CLX / Delphi 7 fazem isso... No Linux, obviamente essa Unit não existe...

Veja o inicio da Unit QForms.pas do Delphi 7
{ *************************************************************************** }
{                                                                             }
{ Delphi and Kylix Cross-Platform Visual Component Library                    }
{                                                                             }
{ Copyright (c) 2000-2002 Borland Software Corporation                        }
{                                                                             }
{ *************************************************************************** }

unit QForms;

{$P+,S-,W-,R-,T-,H+,X+}

interface

uses
{$IFDEF LINUX}
  Xlib,
{$ENDIF}
{$IFDEF MSWINDOWS}
  Windows, Messages,
{$ENDIF}
  Qt, QTypes, SysUtils, Classes, Types, QGraphics, QControls, QMenus,
  QActnList, QStyle, HelpIntfs;



Responder

Gostei + 0

01/12/2004

Cabelo

Colega Dopi..

Funcionou perfeitamente, tanto no Delphi 7 quanto no Kylyx 3...

Só tem um problema com a função indicada pelo colega Aroldo Zanela, no windows, usando esta função que ele me passou, não consigo fechar o Editor de Text MSWord, ele dá um tempo e manda uma mensagem do Word :

´Esta operação demorou tempo demais, deseja continuar tentando?´..

se eu colocar sim ele dáum novo tempo de depois dá a mesma mensagem novamente, mas se der um não, ele fecha e volta tudo ao normal, vc sabe me dizer o pq?


Responder

Gostei + 0

01/12/2004

Dopi

Ola Cabelo....

A funçao citada é bem conhecida na Internet... quase todas as buscas por funçao desse tipo retornam algo semelhante...

Se vc possui a Biblioteca JEDI instalada com a JCL voce pode usar a funçao: ShellExecAndWait

function ShellExecAndWait(const FileName: string; const Parameters: string = ´´; const Verb: string = ´´; CmdShow: Integer = SW_SHOWNORMAL): Boolean;

da Unit: JclShell

é possível ainda abrir a Unit e importar o código da Funçao para o seu aplicativo... Pelo que notei ela tem o código um pouco diferente da funçao citada pelo Aroldo...


Responder

Gostei + 0

02/12/2004

Cabelo

Como faço para abrir esta UNIT, não consegui achá - la?


Responder

Gostei + 0

02/12/2004

Dopi

A JclShell faz parta da JCL que pode ser instalada junto com a Jedi.

A JCL não são componentes como a JVCL, mas sim um conjunto de Units com Functions/Procedures muito interessantes...

Se vc instalou a Jedi full ela estará em:
($JEDI)\JCL\source

Onde ($JEDI) é o path onde vc instalou a biblioteca JEDI
Vc pode baixar a Jedi full em:
http://sourceforge.net/project/showfiles.php?group_id=45786

eu uso a versão JVCL 2.10 Stable. Arquivo: JCL+JVCL210FullInstall.zip

O arquivo Help da JCL é bem completo e já é instalado na IDE do Delphi automaticamente.


Responder

Gostei + 0

06/06/2005

Cabelo

Colegas..

Já estou com este problema a muito tempo, e está ficando nsustentável, pois a reclamação dos usuários em relação ao uso do Word, é muito complicado.

Continua dando o erro :


´Esta operação demorou tempo demais, deseja continuar tentando?´..

tenho a UNIT Jedi instalado, e mesmo assim continua dando o erro, mesmo utilizando a função ShellExecuteAndWait como o colega Dopi me passou.

Mas o problema continua, alguém sabe como resolver este problema?


Responder

Gostei + 0

08/06/2005

Cabelo

Colegas.. Já estou com este problema a muito tempo, e está ficando nsustentável, pois a reclamação dos usuários em relação ao uso do Word, é muito complicado. Continua dando o erro : ´Esta operação demorou tempo demais, deseja continuar tentando?´.. tenho a UNIT Jedi instalado, e mesmo assim continua dando o erro, mesmo utilizando a função ShellExecuteAndWait como o colega Dopi me passou. Mas o problema continua, alguém sabe como resolver este problema?


Alguém ????


Responder

Gostei + 0

08/06/2005

Marco Salles

Cabelo , amigo... So me responda o seguinte

Como faço para abrir um aplicativo externo ao delphi, e esperar até que seja encerrado o processo para continuar executando o delphi..?


Uma vez eu criei uma rotina , que fazia o seguinte...
O Usuário clicava no botão , para chamar por exemplo a calculadora do delphi... Neste ponto o programa era minimizado e so voltava no estado Normal apos o fechamento da Calculadora


Resta saber se isto te enteressa e se te serve.. Porque o codigo que faz uso da Unit Windows :cry: :cry:

mas pelo que falaram:

Nao há problema uma aplicaçao CLX fazer uso da unit Windows...


Se esta idéia te interressar e o fato de se usar a unit Windows não for um incoveniente e so postar..


Responder

Gostei + 0

08/06/2005

Marco Salles

Uma vez eu criei uma rotina , que fazia o seguinte... O Usuário clicava no botão , para chamar por exemplo a calculadora do delphi... Neste ponto o programa era minimizado e so voltava no estado Normal apos o fechamento da Calculadora


Corrigindo...

[b:422ebe5408]para chamar por exemplo a calculadora do delphi[/b:422ebe5408]... trocar por:

[b:422ebe5408]para chamar por exemplo a Calculadora do Windows[/b:422ebe5408]

p:s .. o fato de ser [b:422ebe5408]minimizado[/b:422ebe5408] , pode ser alterado para[b:422ebe5408] escondido[/b:422ebe5408], :arrow: sem perda de generalidade...


Responder

Gostei + 0

08/06/2005

Cabelo

[quote:e7894a3e8d=´Marco Salles´]Cabelo , amigo... So me responda o seguinte

Resta saber se isto te enteressa e se te serve.. Porque o codigo que faz uso da Unit Windows :cry: :cry:

mas pelo que falaram:

Nao há problema uma aplicaçao CLX fazer uso da unit Windows...


Se esta idéia te interressar e o fato de se usar a unit Windows não for um incoveniente e so postar..[/quote:e7894a3e8d]

Colega..

Interessa sim, já que tenho que usar codificação diferentes tanto pra Windows quanto pra Linux.


Responder

Gostei + 0

08/06/2005

Marco Salles

com oeu dise é so ara te dar um idéia .. E claro que se pode fazer a mesma coisa com alguma função especifica.. Mas na época eu não obtive sucesso e então eu adaptei com as minhas que eu tinha

Veja se da para entender:

Function VerficarSeAplicaticoEstarRodandoPeloNomeDoExecutavel(Nome:String):Boolean; 
var rId:array[0..999] of DWord; i,NumProc,NumMod:DWord;
    HProc,HMod:THandle; sNome:String; 
    Tamanho, Count:Integer; 
    sNomeTratado:String; 
begin 
  result:=False; 
  SetLength(sNome, 256); 
// Aqui vc pega os IDs dos processos em execução 
  EnumProcesses(@rId[0], 4000, NumProc);

// Aqui vc faz um for p/ pegar cada processo 
  for i := 0 to NumProc div 4 do 
  begin 
// Aqui vc seleciona o processo 
    HProc := OpenProcess(Process_Query_Information or Process_VM_Read, FALSE, rId[i]); 
    if HProc = 0 then 
      Continue; 
// Aqui vc pega os módulos do processo 
// Como vc só quer o nome do programa, então será sempre o primeiro 
    EnumProcessModules(HProc, @HMod, 4, NumMod); 
// Aqui vc pega o nome do módulo; como é o primeiro, é o nome do programa 
    GetModuleBaseName(HProc, HMod, @sNome[1], 256); 
    sNomeTratado := trim(sNome); 
    Tamanho:=Length(SnomeTratado); 
     Count:=1; 
     While Count <= Tamanho do 
       begin 
         if SnomeTratado[Count]= ´´ Then 
           Break; 
        count:=Count+1; 
       end; 
     sNomeTratado:=Copy(SnomeTratado,1,Count-1); 
    if AnsiUpperCase(sNomeTratado)=AnsiUpperCase(Nome) Then 
      Result:=True; 
// Aqui vc libera o handle do processo selecionado 
    CloseHandle(HProc); 
  end; 
end;


Aqui eu chamo o aplicativo externo ao delphi... No meu caso foi a calculadora
procedure TForm1.Button1Click(Sender: TObject);
begin
 WinExec(´C:\Windows\System32\Calc.exe´,SW_ShowNormal);
//Escondo a aplicação
 Form1.Hide;
//Habilito um componente Timer com intervalo a seu gosto..
//Na epoca fiz c0m Intervalo 10 = que é o mesmo que  1s /100
 Timer1.Enabled:=True;
end;


e finalmente no evento ontimer do componente fiz assim

procedure TForm1.Timer1Timer(Sender: TObject);

begin
 if not(VerficarSeAplicaticoEstarRodandoPeloNomeDoExecutavel(´Calc.exe´)) then
   begin
     Timer1.enabled:=False;
     Form1.Show;
     Form1.FormStyle := fsStayOnTop;
   end;
end;


:P :P :P :P :P
Rodou que era uma beleza ..Para mim serviu como uma luva , espero que sirva para voce tb


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar