Fórum Abrir Aplicativo e Aguardar o fechamento..? #260454
29/11/2004
0
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
Curtir tópico
+ 0Posts
30/11/2004
Aroldo Zanela
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
Gostei + 0
30/11/2004
Cabelo
Gostei + 0
30/11/2004
Cabelo
Gostei + 0
30/11/2004
Dopi
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...
Gostei + 0
01/12/2004
Dopi
{$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;
Gostei + 0
01/12/2004
Cabelo
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?
Gostei + 0
01/12/2004
Dopi
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...
Gostei + 0
02/12/2004
Cabelo
Gostei + 0
02/12/2004
Dopi
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.
Gostei + 0
06/06/2005
Cabelo
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?
Gostei + 0
08/06/2005
Cabelo
Alguém ????
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
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:
Se esta idéia te interressar e o fato de se usar a unit Windows não for um incoveniente e so postar..
Gostei + 0
08/06/2005
Marco Salles
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...
Gostei + 0
08/06/2005
Cabelo
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:
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.
Gostei + 0
08/06/2005
Marco Salles
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)