2011-09-05 18 views
5

Tengo dos controles TEdit. Cuando cierro la pestaña de edit1, edit2 recibe el foco. En mi caso OnExit Edit1 Tengo el siguiente código:TEdit focus & caret

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
end; 

Edit2 tiene el foco. Sin embargo, no hay cuidado en eso. Puedo comenzar a escribir pero es confuso ya que no sé cuyo control tiene el foco.

Estoy más interesado en lo que pasa con el volteo de la propiedad Enabled que está causando algunos mensajes que no sean disparar correctamente? Por ejemplo, el evento OnEnter de edit2 no se está activando.

Esto es en D2006 si es importante.

Gracias por la respuesta.

+1

¿Por qué quieres hacer esto? –

+0

hay un montón de códigos entre deshabilitar y habilitar edit2. no es necesariamente edit2, pero cualquiera que sea el control activo. entonces, después de volver a habilitar el control activo, me gustaría restablecer el foco en él. bueno, seguro que es el control activo, pero no hay cuidado. – Rick

Respuesta

8

No entiendo por qué desactivar y activar edit2, pero hacer esto:

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    edit2.Enabled := false; 
    edit2.Enabled := true; 
    edit2.setfocus; 
    PostMessage(edit2.Handle, WM_SETFOCUS, 0, 0); 
end; 

Por cierto, estoy de acuerdo con Andreas Rejbrand.

+1

Personalmente prefiero este enfoque si se le asigna (ActiveControl) luego PostMessage (ActiveControl.Handle, WM_SETFOCUS, 0,0); después de configurar el foco a otro control. Después de ciertas operaciones, la API de Windows parece no reconocer el control activo y, por lo tanto, los eventos OnExit/OnEnter no se activan correctamente. Esta línea lo corrige. – ertx

+0

Estoy de acuerdo, pero no sé si puede concentrarse en otro componente ... – Whiler

+0

Esto funciona, ¡gracias! Intenté rastrear la cadena de eventos para descubrir por qué no volvería a dibujar el foco y el cursor. Golpee la pared en WndProc y simplemente hace un bucle y he perdido la pista de qué mensaje es su procesamiento. – Rick

8

Sospecho seriamente que estás haciendo algo de mala manera, y la mejor solución es probablemente un rediseño. No debe deshabilitar y luego habilitar un control mientras recibe el foco.

+0

Estoy de acuerdo, no es ideal. Y seguro hay soluciones temporales. Pero solo tengo curiosidad sobre lo que se requiere para que se muestre la atención y el enfoque. Algo sobre la desactivación del control activo w/en el evento OnExit que rompe la cadena de mensajes de Windows. – Rick

0

Hay un montón de códigos entre deshabilitar y habilitar edit2.

Tener una gran cantidad de código en el controlador de eventos AlSalir del control activo anterior hace no requieren para desactivar el siguiente control activo. Ese código se ejecutará antes de que el siguiente control activo muestre el símbolo de intercalación y podrá recibir la entrada del usuario. Solo asegúrese de que no pase la ejecución por algo como comenzar un nuevo hilo o usar Application.ProcessMessages.

Establezca Screen.Cursor en crHourGlass para dejar en claro para el usuario que el siguiente control activo aún no está listo.

0

Se ha producido un error cuando OnActive for MainForm activa otro formulario.

TMainForm.OnActivate; 
begin 
ChildForm.ShowModal; 
end; 

El foco de control está configurado pero no funciona. El trabajo que encontré fue enviar PostMessage (Handle, WM_SETFOCUS, 0, 0); al identificador de formulario.

procedure TChildForm.FocusControl(AWinControl: TWinControl); 
begin 
    try 
    // http://stackoverflow.com/questions/7305296/tedit-focus-caret 
    PostMessage(Handle, WM_SETFOCUS, 0, 0); 
    PostMessage(AWinControl.Handle, WM_SETFOCUS, 0, 0); 
    if AWinControl.CanFocus then 
     AWinControl.SetFocus; 
    except 
    on E: Exception do 
    begin 
     Error(Self, E); 
    end; 
    end; 
end;