Ir al contenido


Foto

Seleccionar un panel a partir de su nombre.


  • Por favor identifícate para responder
10 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 16 enero 2013 - 09:53

Jóvenes delphineros, buen día/tarde/noche (según aplique) :p

Le platico mi problemita. Tengo una serie de TPanel's que contienen 'x' cantidad de componentes, los cuales a partir de una selección en otra parte de la pantalla, deben mostrarse/esconderse. Yo tengo éste pequeño codiguito:



delphi
  1. var
  2.   sNombrePanel: string;
  3. begin
  4.   sNombrePanel := 'pnlCap'+(Trim(IntToStr(iNumero+1)));
  5.   Muestra(iNumero, (sNombrePanel as TPanel));
  6. .
  7. .
  8. .
  9. .
  10.   Esconde(iNumero, (sNombrePanel as TPanel));
  11. .
  12. .
  13. .
  14. .
  15. end;



El problema es que al tener el nombre del panel y "castearlo" para que lo envíe como parámetro a éstos dos procedimientos,  me marca:

[Error] frmHistoriaClinica.pas(178): Operator not applicable to this operand type

¿Alguna idea de cómo solucionar ésto?

P. S.: Los procedimientos tienen éste llamado con sus parámetros.



delphi
  1. procedure Esconde(iActual:Integer; pPanel:TPanel);






delphi
  1. procedure Muestra(iActual:Integer; pPanel:TPanel);



  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 16 enero 2013 - 10:00

Yo pensaría en un ciclo que recorra los componentes del formulario y que cuando encuentre un TPanel compare el nombre para saber si es el que se va a ocultar o mostrar...

sNombrePanel es un String y no puede ser "casteado" como un TPanel....

Saludox ! :)
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 16 enero 2013 - 11:38

Además de la observación que ha hecho Fena mi duda es ¿Para que requieres de dos parámetros en tus procedimientos Muestra() y Esconde()?
Porque si en el nombre se encuentra el número entonces es posible asociar ya sea el número con el nombre, o a la inversa, dado el nombre el número. Es decir, hay una correlación entre ambos:

1 <-> pnlCap1
2 <-> pnlCap2
N <-> pnlCapN

Entonces los procedimientos requerirían de tan sólo uno de los parámetros, el número o el nombre.
Dado uno podemos saber el otro.

Luego, basta con emplear FinComponent para encontrar justamente el TPanel dado por el nombre.

Saludos,
  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 16 enero 2013 - 11:47

Se me acaba de ocurrir de repente... y si haces uso de la propiedad tag del TPanel ???... No sé, a lo mejor te ayuda a controlarlos un poco mejor

Saludox ! :)
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 16 enero 2013 - 11:54

Se me acaba de ocurrir de repente... y si haces uso de la propiedad tag del TPanel ???... No sé, a lo mejor te ayuda a controlarlos un poco mejor

Saludox ! :)

Tag, esa propiedad tan... comodín  :D que nos resulta incomprendida y olvidadiza. Quien lo diría ¿no?

Vamos optimizando las cosas.

Saludos,
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 16 enero 2013 - 12:09

Tá bien pues no lo usen... pobrecito, siempre tan menospreciado  :

Saludox ! :)
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 16 enero 2013 - 12:15

Tá bien pues no lo usen... pobrecito, siempre tan menospreciado  :

Saludox ! :)

Creo que no se me entendió  :( ... lo que buscada decir fue "Cómo no se me ocurrió antes lo del Tag. Hombre, que lo tengo más olvidado y no le saco provecho al pobre"

Saludos,
  • 0

#8 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 16 enero 2013 - 12:32

Al igual que te sugieren los compañeros, puedes usar la propiedad Tag de los paneles, pero si insistes en que tiene que ser por nombre tal vez este código te ayude un poco:



delphi
  1. sNombrePanel := 'pnlCap'+(Trim(IntToStr(iNumero+1)));
  2. TPanel(Self.FindComponent(sNombrePanel)).Visible := False;



Recuerda siempre verificar que el objecto exista antes de acceder a su propiedad para evitar AV, por ejm:



delphi
  1. sNombrePanel := 'pnlCap'+(Trim(IntToStr(iNumero+1)));
  2. if Assigned(Self.FindComponent(sNombrePanel)) then
  3.   TPanel(Self.FindComponent(sNombrePanel)).Visible := False;



  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 16 enero 2013 - 12:45


Tá bien pues no lo usen... pobrecito, siempre tan menospreciado  :

Saludox ! :)

Creo que no se me entendió  :( ... lo que buscada decir fue "Cómo no se me ocurrió antes lo del Tag. Hombre, que lo tengo más olvidado y no le saco provecho al pobre"

Saludos,


:D :D :D :D :D :D :D

No pasa nada amigo... el exceso de trabajo ya me está afectando...

8o| 8o| 8o| 8o|

Lo bueno es la multiplicidad de opciones que se nos vinieron a la mente  ;)

Saludox ! :)
  • 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 16 enero 2013 - 04:13

Se me acaba de ocurrir de repente... y si haces uso de la propiedad tag del TPanel ???... No sé, a lo mejor te ayuda a controlarlos un poco mejor

Saludox ! :)


De hecho, como parte de los procedimientos ésos, utilizo Tag para contener el número de componentes que contiene cada panel..., soy guarín pero me fijo... :p ;)

Al igual que te sugieren los compañeros, puedes usar la propiedad Tag de los paneles, pero si insistes en que tiene que ser por nombre tal vez este código te ayude un poco:



delphi
  1. sNombrePanel := 'pnlCap'+(Trim(IntToStr(iNumero+1)));
  2. TPanel(Self.FindComponent(sNombrePanel)).Visible := False;



Recuerda siempre verificar que el objecto exista antes de acceder a su propiedad para evitar AV, por ejm:



delphi
  1. sNombrePanel := 'pnlCap'+(Trim(IntToStr(iNumero+1)));
  2. if Assigned(Self.FindComponent(sNombrePanel)) then
  3.   TPanel(Self.FindComponent(sNombrePanel)).Visible := False;




Una propuesta muy interesante que probaré inmediatamente...
  • 0

#11 memofer

memofer

    Member

  • Miembros
  • PipPip
  • 32 mensajes

Escrito 25 febrero 2013 - 01:02

:cheesy:
Podrias poner de favor todo tu codigo completo, para ver de que manera estas trabajando esa parte de utilizar o manera el nombre de un objeto con el FindComponent.
Gracias :smiley:
  • 0




IP.Board spam blocked by CleanTalk.