Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 05-10-2003
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
El problema aquí es que para poder poner el foco en el control deseado necesitas poder identificar dicho control.

La única manera que se me ocurre es similar a mandar tabs o flechitas pero con la diferencia de que no lo nota el usuario.

Comienzas identificando la ventana del programa con FindWindow. Para ello necesitarás saber el título de la ventana y/o el nombre de clase. Me parece más conveniente lo último para evitar confusiones con otra posibles ventanas que tengan el mismo título.

La manera má rápida de saber el nombre de la clase es usando el programa WinSight que viene incluído con Delphi.

Una vez que tengas el "handle" de la ventana usas FindWindowEx para encontrar el control deseado. Deberás aplicar tantos FindWindowEx (ejemplo abajo) como controles haya antes del deseado.

Esta es la parte similar a la de mandar Tabs pero el usuario no se percata de ello.

Finalmente, una vez que tengas el "handle" del control deseado le mandas el mensaje WM_NETXDLGCTL a la ventana padre para poner el foco.

Vamos a suponer que la aplicación tiene por nombre de clase: "ClaseApp" y que estás buscando un control de edición. Normalmente la clase de estos controles es "EDIT". Supongamos que es el cuarto control. El código sería como sigue:

Código:
var
  Parent: HWnd;
  Child: HWnd;

begin
  Parent := FindWindow('ClaseApp', nil);
  if Parent <> 0 then
  begin
    Child := FindWindowEx(Parent, 0, 'EDIT', nil);
    Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);
    Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);
    Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);

    SendMessage(Parent, WM_NEXTDLGCTL, chldHandle, 1);
  end;
end;
Por supuesto la cuestión se complica un poco si el control deseado no es hijo directo de la ventana padre (por ejemplo si está dentro de un panel). En tal caso deberás usar un extra FindWindowEx para encontrar el control intermedio y usar ese como padre.

Nota En la prueba que hice los controles los va hallando en orden inverso al orden de tabulación, pero bastará seguir dicho orden.

// Saludos
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 22:52:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi