Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Evitar focus (https://www.clubdelphi.com/foros/showthread.php?t=47094)

Ledian_Fdez 17-08-2007 19:11:42

Evitar focus
 
Holas amigos:
Como podría evitar el focus a un Edit.

Supongamos que tenemos lo sgte:

Edit1 (propiedad TabOrder = 0)
Edit2 (propiedad TabOrder = 2)
Edit3 (propiedad TabOrder = 1)

Tengo el Edit2 de solo lectura. (propiedad ReadOnly = True)

¿Cómo podría evitar el focus al Edit2?

Salu2
Ledian

jhonny 17-08-2007 19:14:14

Coloca la propiedad TabStop del Edit2 en False ;)

Ledian_Fdez 17-08-2007 19:20:04

ok
 
OK miles de grasias.

Salu2
Ledian

MON___ 17-08-2007 21:47:44

En efecto, con TabStop := False, el TEDIT no recibiría "foco" a medida que nos desplazamos con el teclado; sin embargo, si "picamos" en TEDIT con el ratón SÍ recibe el foco, a pesar de tener como FALSE su propiedad TabStop. ¿Cómo evitar esto?
En el evento OnEnter de TEDIT deberemos escribir el siguiente código

SelectNext((Sender as TWinControl), True, True);

Con ello TEDIT no recibirá "foco" en caso de que "piquemos" con el ratón ya que el foco se desplazará al siguiente control que pueda recibirlo

jhonny 17-08-2007 22:19:44

Cita:

Empezado por MON___ (Mensaje 224268)
Con ello TEDIT no recibirá "foco" en caso de que "piquemos" con el ratón ya que el foco se desplazará al siguiente control que pueda recibirlo

Bueno, es que tener un control como ReadOnly := True, quiere decir que queremos que el usuario pueda entrar en dicho Control para hacer por ejemplo un CTRL+C aunque no deba modificar la información del mismo, pero ademas de eso Ledian_Fdez quiere que cuando hagan Tab no pase por allí, si no que mas bien salte al siguiente control...

De todas formas para hacer lo que tu sugieres, bastaria con simplemente decirle al Edit que su propiedad Enabled es False.

Dexter182 29-03-2013 20:05:11

Hola!.

Primero que nada mil disculpas por revivir este hilo antiguo.

Segundo, agradecer que gracias a este hilo logré mejorar un pequeño problemita en una aplicación (especialmente lo de "SelectNext.....").

Tercero, aprovechar a consultar algo similar y que creo que no merecía abrir un post nuevo.

Tengo un formulario con un PageControl dentro del cual tengo tres pestañas.
En una de ellas tengo un DBGrid y un GroupBox (dentro del cual tengo un Edit y dos RadioButton).
Me interesa que el TAB solo pase por el Edit y el DBGrid.
El problema es que por más que seteo las propiedades de TabStop de los RadioButton en False, el TAB sigue pasando por ellos (únicamente por el que tenga su propiedad Checked en True).

¿Alguna solución?.

Saludos y gracias de antemano! ||-||

ecfisa 29-03-2013 21:43:03

Hola Dexter182.

Es que cuando un TRadioButton se selecciona, pone su propiedad TabStop en True.

Una solución puede ser:
Código Delphi [-]
...
type
  TGroupBox = class(StdCtrls.TGroupBox)
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
  end;
  FormX = class(TForm)
    ...

implementation

procedure TGroupBox.CMMouseEnter(var Msg: TMessage);
var
  i: Integer;
begin
  for i:= 0 to ControlCount-1 do
    if Controls[i] is TRadioButton then
      TRadioButton(Controls[i]).TabStop:= False;
end;
...

Saludos.

Al González 29-03-2013 21:46:25

A lo mejor en este caso sí convenía abrir un nuevo hilo por tener relativamente poca relación con lo tratado anteriormente. Pero, no pasa nada. ;)

Cita:

Empezado por Dexter182 (Mensaje 457833)
El problema es que por más que seteo las propiedades de TabStop de los RadioButton en False, el TAB sigue pasando por ellos (únicamente por el que tenga su propiedad Checked en True).

Lo que describes se debe al diseño del componente TRadioButton. Cuando un botón de radio es marcado, es decir, cuando su propiedad Checked cambia a True, automáticamente su propiedad TabStop se pone en True también. El código de la VCL que evidencia esta acción se encuentra, al menos en Delphi 7, en el método TRadioButton.SetChecked:
Código Delphi [-]
procedure TRadioButton.SetChecked(Value: Boolean);
...
begin
  if FChecked <> Value then
  begin
    FChecked := Value;
    TabStop := Value;  // <-- He aquí la causa
    ...
  end;
end;

Una solución sencilla es emplear el evento OnClick de los TRadioButton para hacer algo como esto:
Código Delphi [-]
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
  RadioButton1.TabStop := False;
end;
Como son dos botones de radio los que necesitan lo mismo, en lugar de crear un manejador de evento OnClick para cada uno, te conviene definir un sólo código para ambos (el nombre "RadioButtonClick" lo escribes dentro del inspector de objetos después de seleccionar ambos botones de radio). Así, con un sólo manejador de eventos controlas el problema para ambos objetos:
Código Delphi [-]
procedure TForm1.RadioButtonClick(Sender: TObject);
begin
  (Sender As TRadioButton).TabStop := False;
end;

Espero te sea de utilidad, avísanos si necesitas algo más.

Un saludo.

Al González.

P.D. Ahora veo que el compañero ecfisa también te ha dado una respuesta. :)

Dexter182 30-03-2013 00:38:12

¡¡¡Muchísimas gracias a ambos!!! v:-)v

No solo solucioné el problema, si no que sus consejos me sirvieron para quitar algunas líneas de código redundante.

Pido perdón por el tema de reabrir el hilo (pensé que era una buena idea).:o

Muchísimas gracias de nuevo!!!

Saludos!!! ^\||/


La franja horaria es GMT +2. Ahora son las 22:58:11.

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