Ir al contenido


Foto

[RESUELTO] Una pregunta sobre SetFocus y controles deshabilitados (Enabled := False;)


  • Por favor identifícate para responder
7 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 28 septiembre 2010 - 03:41

Les platico mi problema, compañerit@s del foro...

Resulta que tengo una pantalla que realiza capturas sobre varios archivos de una base de datos..., altas, bajas, cambios, reportes. Pero resulta que si estando capturando datos, CANCELO la edición, me marca un error que no puede poner el foco en un componente deshabilitado o invisible. Yo deshabilito los controles que estoy usando con una construcción así:



delphi
  1.     for I := ComponentCount - 1 downto 0 do
  2.     begin
  3.       if (Components.ClassType = TDbEdit) then
  4.         TDbEdit(Components).Enabled := False;
  5.  
  6.       if (Components.ClassType = TDBMemo) then
  7.         TDbMemo(Components).Enabled := False;
  8.  
  9.       if (Components.ClassType = TJvDBLookupCombo) then
  10.         TJvDBLookupCombo(Components).Enabled := False;
  11.  
  12.       if (Components.ClassType = TDBComboBox) then
  13.         TDBComboBox(Components).Enabled := False;
  14.     end;



Todo va perfectamente, hasta que Delphi "se da cuenta" que no tendrá un control para enfocar y me rebuzna con una redondísima "Access Violation", indicando que no puede poner el foco en un control deshabilitado o invisible...

Y yo me pregunto, entonces cuando crea la forma, ¿en dónde demonios enfoca si TODO lo tengo deshabilitado EXCEPTO un TToolButton en una TToolBar?

Mi intención es que TODOS los controles de edición queden deshabilitados, y de ser posible no me marque éste Access Violation.

Agradeciendo de antemano.
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 28 septiembre 2010 - 03:46

Hola
Y estas seguro que es ahi el problema?.
No hay por ahi un setfocus perdidirijillo?
Saludos
  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 28 septiembre 2010 - 04:39

¿Y si asignas el foco al formulario en el OnCreate?


Saludos!
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 septiembre 2010 - 04:53

Y yo me pregunto, entonces cuando crea la forma, ¿en dónde demonios enfoca si TODO lo tengo deshabilitado EXCEPTO un TToolButton en una TToolBar?


Cuando se crea un formulario no tiene el foco y por lo tanto ninguno de sus controles lo tiene.

Para resolver el problema puedes darle el foco a un control que esté habilitado. Esto lo haces al deshabilitar los controles. Si no tienes ninguno, un truco puede ser crear un botón de tamaño (0,0) o colocado tras otro control y lo usas para recibir el foco. Ese control receptor del foco debe ser visible o tendrás otro error.

Saludos.
  • 0

#5 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 28 septiembre 2010 - 04:56

Cuando se crea un formulario no tiene el foco y por lo tanto ninguno de sus controles lo tiene...


Todos los días se aprende algo nuevo...

Para  resolver el problema puedes darle el foco a un control que esté  habilitado. Esto lo haces al deshabilitar los controles. Si no tienes  ninguno, un truco puede ser crear un botón de tamaño (0,0) o colocado  tras otro control y lo usas para recibir el foco. Ese control receptor  del foco debe ser visible o tendrás otro error.


Probaré de inmediato ésta idea..., es lo suficientemente alocada como para que funcione...  :tongue: :tongue:

Gracias, muchachos..., les platicaré el resultado.
  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 28 septiembre 2010 - 05:53

Saludos.

A mí entender el Formulario es quien tiene el foco inicialmente a menos que tenga asignado algún TControl (componente) en su propiedad ActiveControl o se mande el Focus a algún componente especifico.

Para resolver ese problema tienes varias opciones:
  • Puedes mandar el foco a tu formulario una vez hayas realizado la operación de lugar MiForm.SetFocus.
  • Puedes mandar el foco a el primer "Edit" preguntando si puedes mandar el foco con MiPrimerEdit.CanFocus.
  • O puedes hacer una combinación de las anteriores.
Como ves tienes varias opciones.

Prueba y nos comentas!
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 septiembre 2010 - 07:29

Una pregunta: El código que colocas en el primer post lo usas antes o despues de cancelar la edición? Podría ser que lo estuvieras usando antes, si es así ensaya usándolo después de cancelar.

Pienso que el problema podría estar en el código de algún dbcontrol, que cuando el dataset llama el método cancel intenta volver a su estado anterior (antes de ser editado),  por eso al crear el form no da problemas así todos los componentes estén desabilitados. Pienso que la idea del botón fantasma no funcionará en este caso.


Deberías ensayar ir quitando temporalmente por partes los dbControls de cada familia e ir probando , comenzando por los TJvDBLookupCombo.

Saludos

  • 0

#8 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 28 septiembre 2010 - 08:31

Resultados finales. El foco lo enviaba a uno de los controles, ya que en el OnExit se había colocado una línea que ponía el foco en ése control. Una vez debidamente validado, el problema desapareció...

Consejo: Revisen los cambios de foco entre controles ANTES de deshabilitarlos.
  • 0




IP.Board spam blocked by CleanTalk.