Ir al contenido


Foto

SetFocus de un componente "desconocido".


  • Por favor identifícate para responder
14 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 17 enero 2013 - 09:21

Jóvenes, buen día/tarde/noche según sea el caso...

Gracias a los esfuerzos de la comunidad (http://www.delphiacc...r-de-su-nombre/), ya sabemos cómo se llama y podemos localizar un panel por medio de su nombre; y ahora, la parte peliaguda del caso.

Dentro de cada panel, hay 'n' cantidad de componentes dedicados a la edición de campos de un registro, la idea es que al aparecer el panel, se pueda enfocar o hacer SetFocus sobre un componente específico, cuya propiedad Tag contiene el número de secuencia que le toca en un TabOrder "fabricado", con éste código:

   

delphi
  1. if Assigned(Self.FindComponent(sNombrePanel)) then
  2. begin
  3.   with Self.FindComponent(sNombrePanel) do
  4.   begin
  5.       [b]iCantidad:=Self.FindComponent(sNombrePanel).ComponentCount-1;[/b]
  6.       for iIndice := 0 to iCantidad do
  7.       begin
  8.         with Components[iIndice] do
  9.         begin
  10.             if Tag = 1 then
  11.             begin
  12.               SetFocus;
  13.               Break;
  14.             end;
  15.         end;
  16.       end;
  17.   end;
  18. end;



El caso es que en la línea marcada, el ComponentCount sorprendentemente devuelve -1  :shocked: :shocked: y según lo que leí en la ayuda de Delphi y en alguna otra documentación, ésto no debería suceder...

¿Algún consejo que me pueda ayudar a solucionar ésto?
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 17 enero 2013 - 09:32

Yo hago un recorrido similar dentro de un panel de la siguiente manera:



delphi
  1.   for i:=0 to Acontrol.ControlCount-1 do
  2.   begin      //  Acontrol es una variable de Tipo TWinControl que en tu caso sería el panel que estás recorriendo
  3.       if (Acontrol.Controls[i] is TWinControl) then
  4.       begin
  5.         if (Acontrol.Controls[i] as TWinControl).Tag=1 then
  6.         begin
  7.           CtrlTmp := TWinControl(Acontrol.Controls[i]);  //CtrlTmp es otra variable de tipo TWinControl
  8.           break;
  9.         end;
  10.       end;
  11.     end;
  12.    
  13.     CtrlTmp.SetFocus;




Espero te sirva...

Saludox ! :)
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 17 enero 2013 - 10:54

Lo que pasa es que la propiedad Components hace referencia a los componentes que son propiedad de otro, el TPanel en cuestión no es propietario de ningún componente (el propietario es el Formulario, que los crea), por eso te devuelve cero, ahora Icantidad es igual a (0-1=-1).

Como dice Fena, a cambio de Components utiliza Controls, te quedaría más o menos así:



delphi
  1. if Assigned(Self.FindComponent(sNombrePanel)) then
  2. begin
  3.   with Self.FindComponent(sNombrePanel) do
  4.   begin
  5.       iCantidad:=Self.FindComponent(sNombrePanel).ControlCount-1;
  6.       for iIndice := 0 to iCantidad do
  7.       begin
  8.         if Controls[iIndice] is TWinControl then
  9.         begin
  10.             if Tag = 1 then
  11.             begin
  12.               SetFocus;
  13.               Break;
  14.             end;
  15.         end;
  16.       end;
  17.   end;
  18. end;


  • 0

#4 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 17 enero 2013 - 02:58

Lo que pasa es que la propiedad Components hace referencia a los componentes que son propiedad de otro...


Pues no, no me hace caso..., de hecho, me arroja error en cualquier ocurrencia de las palabras "ControlCount" y "Controls"...  : : :
  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 17 enero 2013 - 03:18


Lo que pasa es que la propiedad Components hace referencia a los componentes que son propiedad de otro...


Pues no, no me hace caso..., de hecho, me arroja error en cualquier ocurrencia de las palabras "ControlCount" y "Controls"...  : : :


A qué te refieres con que no te hace caso y qué error te arroja ??? El código que yo te he pasado está implementado y funcionando...

Saludox ! :)
  • 0

#6 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 17 enero 2013 - 03:27

...El código que yo te he pasado está implementado y funcionando...


No dudo que esté funcionando, pero cuando compilo, me manda éste error:
[Error] frmHistoriaClinica.pas(232): Undeclared identifier: 'ControlCount'

con el código de Wilson...
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 17 enero 2013 - 03:38

Prueba así;


delphi
  1.   if Assigned(Self.FindComponent(sNombrePanel)) then
  2.   begin
  3.     with TPanel(Self.FindComponent(sNombrePanel)) do
  4.     begin
  5.       icantidad := TPanel(Self.FindComponent(sNombrePanel)).ControlCount - 1;
  6.       for iindice := 0 to icantidad do
  7.         if Controls[iindice] is TWinControl then
  8.           if Controls[iindice].Tag = 1 then
  9.           begin
  10.           TWinControl( Controls[iindice]).SetFocus;
  11.             Break;
  12.           end;
  13.     end;
  14.   end;
  15. end;


  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 17 enero 2013 - 03:46


...El código que yo te he pasado está implementado y funcionando...


No dudo que esté funcionando, pero cuando compilo, me manda éste error:
[Error] frmHistoriaClinica.pas(232): Undeclared identifier: 'ControlCount'

con el código de Wilson...


O sea, dejame entender, el código de Fenareth que está funcionando en una de sus aplicaciones; a ti te da un error de compilación en la propiedad  ControlCount ????

Como estás declarando la variable Acontrol ???

Saludos
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 17 enero 2013 - 03:57

Código final, probado:



delphi
  1.   if Assigned(Self.FindComponent(sNombrePanel)) then
  2.   begin
  3.     with TPanel(Self.FindComponent(sNombrePanel)) do
  4.     begin
  5.       icantidad := TPanel(Self.FindComponent(sNombrePanel)).ControlCount - 1;
  6.       for iindice := 0 to icantidad do
  7.         if Controls[iindice] is TWinControl then
  8.           if Controls[iindice].Tag = 1 then
  9.           begin
  10.           TWinControl( Controls[iindice]).SetFocus;
  11.             Break;
  12.           end;
  13.     end;
  14.   end;
  15. end;


  • 0

#10 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 17 enero 2013 - 04:32

...O sea, dejame entender, el código de Fenareth que está funcionando en una de sus aplicaciones...


Estoy usando el código de Wilson, por que se acerca (de hecho, él está adaptando mi idea) a lo que necesito hacer. Respecto al código de Fenareth lo probé pero no me proporciona el resultado que necesito...
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 17 enero 2013 - 07:18

Ya lo han dicho pero es mejor recalcarlo. No es lo mismo Components[] que Controls[] y por tanto sus *Count.

Léase:

Indicates the number of components owned by the component.

property ComponentCount: Integer;

Description

Use ComponentCount to find or verify the number of components owned by a component, or when iterating through the Components list to perform some action on all owned components. ComponentCount is used internally for such iterative procedures.

Note: The ComponentCount of a component contains the same number of items as in the Components list for that component, and is always 1 more than the highest Components index, because the first Components index is always 0.


Aquí sobre la propiedad vectorial Components[]

Lists all components owned by the component.

Description

Use Components to access any of the components owned by this component, such as the components owned by a form. The Components property is most useful when referring to owned components by number rather than name. It is also used internally for iterative processing of all owned components.

Note: For convenience use Components with ComponentCount for iterative processing. However, be aware that while the ComponentCount of a component contains the same number of items as in the Components list for that component, ComponentCount is always 1 more than the highest Components index, because the first Components index is always 0.


Mientras que, por el lado de ControlCount:

Returns the number of child controls.

property ControlCount: Integer;

Description

Read ControlCount when iterating over all the children of this control. The children of the control are listed in the Controls property array.

ControlCount is a read-only property.

Note: The value of ControlCount is always 1 greater than the highest Controls index, because the first Controls index is 0.


Y sobre su propiedad vectorial, Controls[]:

Lists all child controls.

Description

Controls is an array of all the child controls. These are all controls that list this control as their Parent property. The Controls property is convenient for referring to the children of a control by number rather than name. For example, Controls may be used to iterate over all the child controls.

Don't confuse the Controls property with the Components property. The Controls property lists all the controls that are child windows of the control, while the Components property lists all components that it owns. The form owns all components put on it, and therefore, they appear in the form's Components property list, even when they are child windows of a control on the form.

Controls is a read-only property. To add or delete a child control, use the InsertControl or RemoveControl methods. To move a child control from one parent to another, set the Parent of the child control, as that will handle both the RemoveControl from the original parent and the InsertControl to the new parent.


Saludos,
  • 0

#12 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 21 enero 2013 - 04:13

Nadie ve el error de bulto en el código? O soy yo el que no ve el problema....

La línea "if Controls[iIndice] is TWinControl then" debería ser  "if Self.FindComponent(sNombrePanel).Controls[iIndice] is TWinControl then", en otro caso contais los componentes del panel, y luego recorreis los componentes del Form que contiene el panel.
  • 0

#13 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 21 enero 2013 - 01:10

Saludos nuevamente amigo, lo que necesitas es recorrer los controles que contiene el panel, por lo tanto debes usar "ControlCount", te dejo un ejm:



delphi
  1. var
  2.   Panel: TPanel;
  3.   I: Integer;
  4.   sNombrePanel: string;
  5. begin
  6.   //...
  7.   Panel := FindComponent(sNombrePanel) as TPanel;
  8.   //...
  9.   if Assigned(Panel) then
  10.   begin
  11.     for I := 0 to Panel.ControlCount -1 do
  12.       if Panel.Controls[I].Tag = 1 then
  13.       begin
  14.         TWinControl(Panel.Controls[I]).SetFocus;
  15.         Break;
  16.       end;
  17.   end;



Espero te ayude...
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2013 - 09:24

Nadie ve el error de bulto en el código? O soy yo el que no ve el problema....

La línea "if Controls[iIndice] is TWinControl then" debería ser  "if Self.FindComponent(sNombrePanel).Controls[iIndice] is TWinControl then", en otro caso contais los componentes del panel, y luego recorreis los componentes del Form que contiene el panel.


¿Lo dices por el código de Wilson? No lo he probado pero a simple vista no debiera tener error. Fíjate que antes de ese if hace un With sobre el panel, por tanto al leer Controls[] se está leyendo el valor asociado al panel y no al form.

El código de bigleaguer me resulta más agradable a la vista. Y debiera funcionar también.

Saludos,
  • 0

#15 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 23 enero 2013 - 02:12


Nadie ve el error de bulto en el código? O soy yo el que no ve el problema....

La línea "if Controls[iIndice] is TWinControl then" debería ser  "if Self.FindComponent(sNombrePanel).Controls[iIndice] is TWinControl then", en otro caso contais los componentes del panel, y luego recorreis los componentes del Form que contiene el panel.


¿Lo dices por el código de Wilson? No lo he probado pero a simple vista no debiera tener error. Fíjate que antes de ese if hace un With sobre el panel, por tanto al leer Controls[] se está leyendo el valor asociado al panel y no al form.

El código de bigleaguer me resulta más agradable a la vista. Y debiera funcionar también.

Saludos,


No, es un error mio, no vi el "with" del principio y pensé que control[i] se estaba refiriendo al tform y no al tpanel... olvida mi comentario, no aporta mas que ruido!
  • 0




IP.Board spam blocked by CleanTalk.