Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-05-2012
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Smile

Hola. Espero que este mensaje no lo tomen como un mensaje basura. Vengo a avisar solamente que todavía no pude probar la solución de roman porque estoy tapado de trabajo. Solamente eso, así no piensan que solucioné mi problema sin explicar cómo.

Saludos!
Responder Con Cita
  #2  
Antiguo 20-05-2012
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Thumbs up

Bueno, les comento que ya solucioné mi problema. Chau.



















Jajaja no me voy a ir así nomás

Lo solucioné con la ayuda de roman haciendo un leve cambio. En vez de utilizar GetFocus() usé una variable THandle y le asigné la ventana con GetForegroundWindow.
Les muestro precisamente cómo quedó y cómo funciona:
Código Delphi [-]
procedure TForm1.WaitUntilFieldFocused(sFieldName: String);
var
  Handle: THandle;
  Buffer: array[Byte] of Char;
begin
  Handle := GetForegroundWindow;
  Buffer := '';
  while (Buffer <> sFieldName) do
  begin
    ZeroMemory(@Buffer, SizeOf(Buffer));
    GetClassName(Handle, Buffer, 255);
    Sleep(250);
  end;
end;

Solamente recibe el nombre (que lo obtuve usando otra mini aplicación con GetClassName(Handle, Buffer, 255) y las mismas variables) y espera hasta que aparece focuseado, que por la lógica de mi aplicación es 100% seguro que va a estar focuseado aunque tarde mucho tiempo.
El procedimiento lee el nombre del TWinControl (agradecimiento enorme a roman por explicarme que todo componente es una ventana ) y lo compara con el nombre que le pedís que encuentre. Si no lo encuentra se pausa 0.0250 segundos y vuelve a mirar. Nada más, muy simple.

Muchas gracias a los que aportaron, a los que lo leyeron y no pudieron responder pero pensaron a ver si se les ocurría algo, a todos.

Si algún moderador pudiera editar el nombre del topic y ponerle al principio "[RESUELTO]" y cerrarlo sería grandioso y que quede como ejemplo

Saludos!!!!!!!!!!!!!!
Responder Con Cita
  #3  
Antiguo 21-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pero tú código no puede funcionar tal como está. La obtención del Handle debe estar dentro del ciclo.

// Saludos
Responder Con Cita
  #4  
Antiguo 22-05-2012
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Wink

Cita:
Empezado por roman Ver Mensaje
Pero tú código no puede funcionar tal como está. La obtención del Handle debe estar dentro del ciclo.

// Saludos
El código funciona tal como está. Handle := GetForegroundWindow; me devuelve el handle de una ventana que acabo de abrir. Después de abrir esa ventana hago doble click sobre el componente de texto. En ese momento tengo 100% asegurado que la ventana está abierta, focuseada y ontop, y que hice doble click en el componente de texto. Lo único que resta esperar es que se focusee ese campo de texto.
El handle lo agarro con GetForegroundWindow sí o sí, porque la ventana abierta y activa es la que tiene el componente.
No te preocupes, ya lo probé y funciona como debe.

Saludos.
Responder Con Cita
  #5  
Antiguo 22-05-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Concuerdo con roman al advertir que ese código tiene algo que llama la atención. Handle tiene el valor de la ventana que deseas siempre que le de tiempo a estar abierta en ese momento. Pero el código, tal como está me hace pensar que o bien el bucle sobra, o la obtención del Hanle debe realizarse dentro del mismo. Si la función pretende esperar a que el nombre de la clase del Handle obtenido sea el que esperas, entonces tu función debe ser modificada a algo como esto:

Código Delphi [-]
procedure TForm1.WaitUntilFieldFocused(sFieldName: String);
var
  Handle: THandle;
  Buffer: array[Byte] of Char;
begin
  Buffer := '';
  while (Buffer <> sFieldName) do
  begin
    Handle := GetForegroundWindow;
    ZeroMemory(@Buffer, SizeOf(Buffer));
    GetClassName(Handle, Buffer, 255);
    Sleep(250);
  end;
end;

Saludos.
Responder Con Cita
  #6  
Antiguo 22-05-2012
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Concuerdo con roman al advertir que ese código tiene algo que llama la atención. Handle tiene el valor de la ventana que deseas siempre que le de tiempo a estar abierta en ese momento. Pero el código, tal como está me hace pensar que o bien el bucle sobra, o la obtención del Hanle debe realizarse dentro del mismo. Si la función pretende esperar a que el nombre de la clase del Handle obtenido sea el que esperas, entonces tu función debe ser modificada a algo como esto:

Código Delphi [-]
procedure TForm1.WaitUntilFieldFocused(sFieldName: String);
var
  Handle: THandle;
  Buffer: array[Byte] of Char;
begin
  Buffer := '';
  while (Buffer <> sFieldName) do
  begin
    Handle := GetForegroundWindow;
    ZeroMemory(@Buffer, SizeOf(Buffer));
    GetClassName(Handle, Buffer, 255);
    Sleep(250);
  end;
end;

Saludos.
Escafandra, el bucle en esa función es solamente para darle tiempo al SO de mostrar bien la ventana dado que todo el proceso es a través de máquinas virtuales.
El handle, por otra parte, lo consigo correctamente y sin problemas porque justo antes de entrar en la función abro la ventana. No entiendo por qué les cuesta tanto creer que funciona perfectamente...
Responder Con Cita
  #7  
Antiguo 22-05-2012
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Será que es por que si en ese preciso momento alguna otra ventana se coloca al frente (un popup de alguna otra aplicación), tu método puede recibir el handle de la ventana incorrecta y fallar.


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #8  
Antiguo 22-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por BrunoBsso Ver Mensaje
No entiendo por qué les cuesta tanto creer que funciona perfectamente...
No es una cuestión de creer o no creer. Todas las vueltas de tu bucle se ejecutan con exactamente el mismo contexto. GetClassName obtendrá siempre el mismo valor, así que no tiene ningún caso estar calculándolo una y otra vez. Quizá lo que tenga algo que ver es el sleep, o simplemente el ligero tiempo que toma entrar al bucle, pero, desde luego, no la llamada reiterada a GetClassName.

Pero, en todo caso, si así te sirve, pues ¿quiénes somos nosotros para contradecirte?

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
abrir aplicación externa desde delphi y detectar su cierre petete2008 API de Windows 2 10-02-2012 11:44:23
Ejectuando una aplicacion externa jandrorm Varios 5 09-02-2011 16:13:56
Manipular aplicación externa oabel5 API de Windows 30 27-05-2010 07:04:41
Aplicacion externa a c++ alloger C++ Builder 1 28-10-2006 00:37:09
Manipular una aplicacion externa lookmydoom API de Windows 2 09-08-2006 22:22:52


La franja horaria es GMT +2. Ahora son las 15:44:15.


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
Copyright 1996-2007 Club Delphi