Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con SetParent (https://www.clubdelphi.com/foros/showthread.php?t=67914)

vejerf 13-05-2010 16:57:15

Problema con SetParent
 
Hola a todos,

Estoy tratando de "introducir" una aplicación externa dentro de un panel de mi aplicación. Esto supuestamente ya lo había superado en otro ocasión con otra aplicación, concretamente el Google Earth.

Pues bien ahora estoy tratando de hacer lo mismo con la aplicación CompeGPSLand: http://www.compegps.com/?detail=detail&opcion=1〈=1es&grupo=tierra∏=460

Uso el siguiente conjunto de instrucciones:
Código Delphi [-]
Ejecutar('C:\Archivos de programa\CompeGPS\CompeGPSLand.exe',nil,5000);
  PHandle := FindWindow(nil, 'CompeGPS LAND');
  Windows.SetParent(PHandle, PanelCompeGPS.Handle);
  SetWindowPos(PHandle,HWND_TOP,-5,-30-21,TScreen.Create(nil).Width-Panel2.Width+10,PanelCompeGPS.Height+35+16,SWP_SHOWWINDOW);

La función ejecutar es un truco que encontré en el club para ejecutar una aplicación.

¿Alguien tiene idea de por qué puede ocurrir esto? He comprobado que FindWindow devolviese el handle ya que devuelve un valor distinto de 0.

Saludos!

PD: He usado el código expuesto anteriormente porque usando el truco directamente tampoco me funcionaba. Según el ejemplo que vi se usaba para abrir el notepad lo siguiente:
H:= Ejecutar('Notepad.exe',nil,5000);
Windows.SetParent(H,Handle);

vejerf 21-05-2010 13:41:08

Solucionado!!!
 
Para quien le interese le dejo como lo he solucionado.

He averiguado la clase de la aplicación mediante la utilidad WinID que entre otra información te da la clase y el handle de la ventana sobre la que pones el cursor.

Entonces, en el evento OnCreate he ejecutado la aplicación mediante la función ejecutar encontrado en los trucos.

A continuación en el evento OnShow he buscado con FindWindow la clase obtenida anteriormente con el WinID. Con esto obtengo el handle de la ventana y a continuación pues he usado el SetParent y el SetWindowsPos sin ningún problema.

Código Delphi [-]
procedure TPForm.FormCreate(Sender: TObject);
begin

  Ejecutar(NombreAplicacion,nil,5000);    
  Sleep(2000);

end;

procedure TPForm.FormShow(Sender: TObject);
var
  PHandle : THandle;
begin
  ...
  PHandle := FindWindow(ClaseVentanaObtenidaConWinID,nil);
  Windows.SetParent(PHandle, PanelContenedor.Handle);
 SetWindowPos(PHandle,HWND_TOP,Left,Top,Width,Height,SWP_SHOWWINDOW);
  ...
end;

Quizás haya alguna otra forma de hacerlo, pero a mí al menos así me funciona.

Saludos!


La franja horaria es GMT +2. Ahora son las 05:56:02.

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