Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Cuantos elementos hay en un objeto (https://www.clubdelphi.com/foros/showthread.php?t=93057)

Angel.Matilla 03-05-2018 13:50:07

Cuantos elementos hay en un objeto
 
A ver como me explico. En un evento OnExit de un TLabeledEdit tengo, en parte, este código:
Código PHP:

void __fastcall TfTablas::EntidadExit(TObject *Sender)
{
     
TCustomEdit *Edit dynamic_cast<TCustomEdit *>(Sender);

     try
     {
          [
Verificaciones]
     }
     catch(
Exception &Exc)
     {
          
Application->ShowException(&Exc);
          
Edit->SetFocus();
          return;
     }


Una vez que he hecho las comporbaciones necesarias necesito "ver" el resto de elementos de ese objeto (en todos los casos es un TPanel) y estoy haciendo esto:
Código PHP:

TComponent *Source Edit->Parent;
TPanel *pParent static_cast<TPanel*>(Source);
int nItem pParent->ComponentCount

Todos los TPanel del formulario tienen al menos un TLabeledEdit pero entre por donde entre, al llegar a esa última línea siempre me da un valor cero. He comprobado que ese Edit->Parent coincide con el que debiera ser, pero ya no sé como coger el toro por los cuernos.

roman 03-05-2018 15:12:29

Creo que lo que buscas es la propiedad ControlCount en lugar de ComponentCount.

LineComment Saludos

ecfisa 03-05-2018 15:30:20

Hola.

La propiedad Components de un componente enumera todos los elementos que comparten el mismo Owner (el componente responsable de transmitir y liberar el primero).

Es muy probable que en tu caso el Owner de los componentes que residen en el TPanel sea el formulario y no el panel, puedes verificalo con:
Código PHP:

  ShowMessage(LabeledEdit1->Owner->Name); 

A diferencia de la propiedad Components, la propiedad Controls contiene todos los componentes que comparten el mismo Parent, entonces esa es la que deberías usar.

Un ejemplo:
Código PHP:

void __fastcall TForm1::LabeledEdit1Exit(TObject *Sender)
{
  
TWinControlWC = (static_cast<TLabeledEdit*>(Sender))->Parent;

  
ShowMessage(Format("Parent: %s%sItems: %d",
    
ARRAYOFCONST(((String)WC->Name, (String)"\n", (int)WC->ControlCount))));
  
// WC->Name  = LabeledEdit1->Parent->Name


Saludos :)

Edito: Lo dicho por roman. (tuve que atender un llamado durante la edición :o)

Angel.Matilla 03-05-2018 19:18:38

Gracias por las respuestas. He estado probando.

Este es el panel concreto en el que estoy haciendo las pruebas. Tiene dos TLabelEdit, dos TLabel y dos TComboBox, además del propio TPanel. Sin embargo, poniendo el código que ma ha sugerido ecfisa, la propiedad ControlCount me dice que tiene ocho elementos y eos me tiene muy despistado. ¿Cuál o cuáles son los que sobran?

Angel.Matilla 03-05-2018 19:37:04

Vale. Ya he encontrado la solución. A la hora de "ver" los controles hago esto:
Código PHP:

TWinControl *wEdit Edit->Parent;
TControl *Control;

for (
nItem 0nItem wEdit->ControlCountnItem ++)
{
     
Control wEdit->Controls[nItem];
     if (
Control->ClassNameIs("TLabeledEdit"))
     {
          [
Codigo para el TLabeled]
     }
     if (
Control->ClassNameIs("TComboBox"))
     {
          [
Código para el TComboBox]
     }


No sé si será el mejor método, pero me funciona a la perfección. Muchas gracias a los dos por la ayuda.

ecfisa 03-05-2018 21:19:57

Hola.
Cita:

Empezado por Angel.Matilla (Mensaje 526016)
...
Este es el panel concreto en el que estoy haciendo las pruebas. Tiene dos TLabelEdit, dos TLabel y dos TComboBox, además del propio TPanel. Sin embargo, poniendo el código que ma ha sugerido ecfisa, la propiedad ControlCount me dice que tiene ocho elementos y eos me tiene muy despistado. ¿Cuál o cuáles son los que sobran?

Acabo de comprobar que el problema lo ocasiona el TLabeledEdit y reconozco que al no haber usado ese componente, nunca había notado el detalle.

Basta con que haya una aparición del control para que la propiedad ControlCount del contenedor se incremente en uno y la propiedad ControlCount se incrementa en uno por cada TLabeledEdit añadido (es decir que un TPanel que incluya tres LabelEdits, tiene en la propiedad ControlCount el valor seis).

Tal vez el incremento se deba a que el TLabeledEdit es un control de edición que tiene asociado un TLabel...

Saludos :)

ecfisa 03-05-2018 22:53:47

Hola.

Busqué en pero no pude encontrar referencia a ese comportamiento :(.

Se me ocurren dos soluciones, la primera mediante una función miembro:
Código PHP:

...
class 
THWinControl : public TWinControl {
public:
  
int CtrlCount() {
    
int n ControlCount;

    for(
int i 0ControlCounti++)
      if(
Controls[i]->ClassNameIs("TLabeledEdit")) n--;
    return 
n;
  }
};
...

/* Ej. de uso */
void __fastcall TForm1::Panel1Exit(TObject *Sender)
{
  
THWinControlHWC static_cast<THWinControl*>(LabeledEdit1->Parent);
  
Label2->Caption HWC->CtrlCount();


o mas simple, mediante una función:
Código PHP:

...
int CtrlCount(TWinControlWC)
{
  
int n WC->ControlCount;

  for(
int i 0WC->ControlCounti++)
    if(
WC->Controls[i]->ClassNameIs("TLabeledEdit")) n--;

  return 
n;
}

/* Ej. de uso */
void __fastcall TForm1::Panel1Exit(TObject *Sender)
{
   
Label2->Caption =  CtrlCount(LabeledEdit1->Parent);


Saludos :)

Angel.Matilla 04-05-2018 09:56:38

Cita:

Empezado por ecfisa (Mensaje 526021)
Basta con que haya una aparición del control para que la propiedad ControlCount del contenedor se incremente en uno y la propiedad ControlCount se incrementa en uno por cada TLabeledEdit añadido (es decir que un TPanel que incluya tres LabelEdits, tiene en la propiedad ControlCount el valor seis).

Tal vez el incremento se deba a que el TLabeledEdit es un control de edición que tiene asociado un TLabel...

Saludos :)

Efectivamente. Me he dado cuenta al hacer las pruebas; aparecen para cada TLabeledEdit dos elementos: un Edit y un SubLabel. De todas formas con el código que puse ayer me vale porque lo que necesito es comprobar que todos los TLabeledEdit y TComboBox tienen contenido.


La franja horaria es GMT +2. Ahora son las 21:02:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi