ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Abrir calculadora dentro do Panel

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
ric_rio2
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018
Mensagens: 108

MensagemEnviada: Sex Abr 12, 2019 2:52 pm    Assunto: Abrir calculadora dentro do Panel Responder com Citação

Bom dia..
Fiz um projeto em que abro a calculadora dentro de um form..
Funciona tudo ok.. ate consigo posiciona-la no top e left do panel que eu quero.
Contudo ... sempre tem um contudo Smile só funciona em windows 7..
Quando Rodo a aplicação em WIN10... a aplicação abre a calculadora mas
NÃO coloca dentro do panel..
Algum dos senhores sabe o motivo para tal comportamento?
Sei que é por causa do sistema operacional Smile
Alguma ideia de como devo proceder para funcionar corretamente no WIN10???
Smile
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Sex Abr 12, 2019 8:54 pm    Assunto: Responder com Citação

Poste o codigo de como estar a colocar a calculadora no panel.

Dependendo se tenha usado funções do tipo findwondow é provavel que seja pela classe da janela calculadora que deve ser diferente em ambos sistema win7 e win10 onde sabemos que o findwindow(classe da janela, titulo da janela).

voce resolve a questão executando a calculadora e pegando seu pid e trabalhando diretamente com ele.

para isso trablhar com conversão de pid para handle será nescessario.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
ric_rio2
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018
Mensagens: 108

MensagemEnviada: Ter Abr 16, 2019 10:28 am    Assunto: Responder com Citação

Bom dia strak2012
Cara.. Entendi o que tu falou..
Estava fazendo os acertos aqui para testar..mas me pediram para dar atenção a outra parada..
Assim que testar posto como ficou..
Já Pego o pID ... tanto para win7 e para win10
Já chamo o programa (calculadora)
Ao Fechar o FORM já MATO o processo pID.

Agora falta testar o shellexecute chamando uma aplicação delphi com parametros..
comecei assim ..:
Lista:= ' 0 GIF 12 12';
ShellExecute(0, 'open' , PWideChar(ED_Caminho_AguardeVCL.Text), PwideChar(Lista), nil, 0);
Como falei.. Assim que terminar a demanda aqui, acabo de testar essa parada da CALCULADORA e posto aqui completo Smile
Obrigado pela atenção Smile
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
ric_rio2
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018
Mensagens: 108

MensagemEnviada: Ter Abr 16, 2019 2:41 pm    Assunto: Responder com Citação

Boa tarde a todos..
Segue abaixo o codigo quase perfeito..
Ainda não consigo colocar o programa CHAMADO dentro do panel1.
Função que acha e retorna o Pid..:
Código:
Function TFo_Main.Acha_Processo(pPrograma : String) : Integer;
var
  A :Integer;
  SnapProcHandle: THandle;
  NextProc : Boolean;
  ProcessEntry : TProcessEntry32;
begin
  Result:= 0;
  SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  ProcessEntry.dwSize := sizeof(ProcessEntry);
  NextProc := Process32First(SnapProcHandle, ProcessEntry);
  while NextProc do
        begin
          if pPrograma = ProcessEntry.szExeFile then
             begin
               Result:= ProcessEntry.th32ProcessID;
               A:=  SnapProcHandle;
             end;
              NextProc := Process32Next(SnapProcHandle, ProcessEntry);
        end;
  CloseHandle(SnapProcHandle);
end;


{-------}

Clicke de um botao

Código:
Click_Botao
Lista : String;
    A : Integer;

    hwnd : THandle;
    Parms : Array[0..1024] of Char;
begin
  Lista:= '';

  Lista:= Lista + ' ' +Rg_Tipo.Items.Strings[Rg_Tipo.ItemIndex];
  If Label5.Caption <> '' then
     Lista:= Lista  + ' ' + Label5.Caption
  Else
     Lista:= Lista  + ' 0' ;

  Lista:= Lista +' '+ IntToStr(StrToIntDef(Me_Left.Text,0));

  Lista:= Lista +' '+ IntToStr(StrToIntDef(Me_Top.Text,0));

  If Cb_Transparente.Checked = False then
      Lista:= Lista + ' 0'
  Else
    If Cb_Transparente.Checked then
       Lista:= Lista + ' 1';

  StrPCopy(Parms,Lista);



  ShellExecute(0, 'open' , PWideChar(ED_Caminho_AguardeVCL.Text), Parms, nil, 0);

  hwnd:= Acha_Processo(ExtractFileName('ED_Caminho_AguardeVCL.Text'));

Windows.SetParent( hwnd,panel1.handle );


Estou empacado na ultima linha
Windows.SetParent( hwnd,panel1.handle )

Gostaria de pegar o programa aberto e colocar Dentro do panel1.
Com o código que tinha... funionava no win7...
Este codigo que posto agora.. funciona para o win7 e win10 ..
mas NÃO coloca o .exe chamado no panel..

Algum dos senhores teria uma ideia do porque?? Smile
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Ter Abr 16, 2019 9:01 pm    Assunto: Responder com Citação

Provavelmente o erro está nessa linha:

Código:
hwnd:= Acha_Processo(ExtractFileName('ED_Caminho_AguardeVCL.Text'));


Você está passando o parâmetro como String. Tente:

Código:
hwnd:= Acha_Processo(ExtractFileName(ED_Caminho_AguardeVCL.Text));

_________________
"Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!"
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Ter Abr 16, 2019 9:15 pm    Assunto: Responder com Citação

De qualquer forma, tem muitos pontos falhos nesse código.

Acha_Processo() retorna o Handle do processo, e não da janela. São coisas totalmente diferentes. Você fez metade do caminho rs...

Abrir o processo com ShellExecute e depois buscar todos os processos abertos também pode ser uma fria... se o processo já estiver aberto em background ele vai ser capturado de forma errada. Use CreateProcess() que retorna o PID e o Handle do processo que você criou, sem erros.

Você pode iniciar uma aplicação mas, no momento que tentar recuperar sua janela, a mesma ainda não foi criada. Antes de usar SetParent(), você precisa testar se a janela já está visível com o método IsWindowVisible().

Enfim, nesse tópico tem umas dicas legais: http://www.activedelphi.com.br/forum/viewtopic.php?t=75148&sid=83c0074c966c3bc3679f988097fc06be
_________________
"Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!"
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Abr 16, 2019 9:50 pm    Assunto: Responder com Citação

o codigo é mais ou menos este aqui:

Código:
function Exec(const FileName, Params: string;
  const WindowState: Word): THandle;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  result:=-1;
  CmdLine := '"' + FileName + '"' + #32 + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  if CreateProcess(nil, PChar(CmdLine), nil, nil, False,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
    PChar(ExtractFilePath(FileName)), SUInfo, ProcInfo) then
    result:=ProcInfo.hProcess;
//    hProcess: THandle;  handle da aplicação
//    hThread: THandle;   handle da thread principal da aplicação
//    dwProcessId: DWORD; pid (id da aplicação) da aplicação
//    dwThreadId: DWORD; tid (id da thread) da aplicação
end;



Modo de uso:
Código:
hwnd:= Exec(local e nomde da aplicação, parametros a passar para aplicação,ws_normal);
if hwnd<>-1 then
Windows.SetParent( hwnd,panel1.handle );

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
ric_rio2
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018
Mensagens: 108

MensagemEnviada: Seg Abr 22, 2019 4:15 pm    Assunto: Responder com Citação

Boa Tarde marcieldeg e strak2012
Muito obrigado pela atenção Smile
Vamos la..

marcieldeg O que postei em
"hwnd:= Acha_Processo(ExtractFileName('ED_Caminho_AguardeVCL.Text'));"

Era só erro de digitação aqui.. o código estava sem o plick simples..
Grande observação mesmo assim Smile

Como o Strak2012 demonstrou sabiamente no exemplo com as opções
// hProcess: THandle; handle da aplicação
// hThread: THandle; handle da thread principal da aplicação
// dwProcessId: DWORD; pid (id da aplicação) da aplicação
// dwThreadId: DWORD; tid (id da thread) da aplicação

Eu já tinha tentado retorna o Handle do processo, a janela, o pid.... Retornar eu ate retorno.. mas não funciona o
Windows.SetParent( hwnd,panel1.handle )
Mesmo no seu exemplo Strak2012 não COLA o programa CHAMADO no programa CHAMADOR...


Como fiz funcionar.. Smile
var
text : RawByteString;
begin
Text:= ED_Caminho_AguardeVCL.text;
WinExec(pansiChar(text),SW_NORMAL);// se Colocar direto pAnsiChar( ED_Caminho_AguardeVCL.text) NÃO FUNCIONA
Windows.SetParent( FindWindow( nil, 'NOME_X' ),panel1.handle ) ;

Onde NOME_X é ..:
No Windows 7 no gerenciador de tarefas -> Aplicativos o NOME QUE APARECE NELE do aplicativo CHAMADO

No Windows 10 - > Gerenciador de Tarefas -> Processos -> Aplicativos -> Seleciona o aplicativo e coloca a seta para baixo -> o Nome que aparecer


bom..
Funcionou.. Smile

Espero que sirva para alguem essa informação Smile
Abraço a todos Smile
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Abr 22, 2019 5:21 pm    Assunto: Responder com Citação

WinExec(pansiChar(text),SW_NORMAL);// se Colocar direto pAnsiChar( ED_Caminho_AguardeVCL.text) NÃO FUNCIONA

para funcionar precisar fazer mais um cast para ansistring tipo:
WinExec(pansiChar(ansistring(ED_Caminho_AguardeVCL.text)),SW_NORMAL);// assim ja funciona

Mas isso é variante de acordo com a versão do delphi

em delphi 6 esta linha seria:
WinExec(pchar(ED_Caminho_AguardeVCL.text),SW_NORMAL);

nas versões de delphi com suporte a unidecode ficou:
WinExec(pansiChar(ansistring(ED_Caminho_AguardeVCL.text)),SW_NORMAL);
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
ric_rio2
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 1 de Outubro de 2018
Mensagens: 108

MensagemEnviada: Qua Abr 24, 2019 7:23 am    Assunto: Responder com Citação

Bom dia strak2012.. tudo certinho?? Smile
De fato então o problema era esse desde o começo.. a versão do delphi...
No Delphi 7 Funciona de boa o Winexec(pChar(variavelstring),sw_normal)

Enquanto no Delphi CE não.. e também não tinha feito a conversão como tu demonstrou agora.. e que funciona PERFEITAMENTE Smile

Valeu mesmo pela atenção..
Abraços Smile
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB