Ver Mensaje Individual
  #1  
Antiguo 08-02-2024
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 19
Angel.Matilla Va por buen camino
Encontrar un componente

Buenas a todos. A ver si soy capaz de explicarme. Tengo un TPageControl en el que de forma dinámica creo las pestañas y en cada pestaña hay un único TListView que también se crea de forma dinámica.

La creación la hago así:
Código:
TListColumn *pColumn;
TListItem *pItem;

Auxiliar->Close();
Auxiliar->SQL->Text = "SELECT Disco, Cancion, Interprete, Tiempo, Pista FROM Pistas WHERE Registro = :Registro ORDER BY Disco, Pista";
Auxiliar->ParamByName("Registro")->AsInteger = PageControl1->Tag;
Auxiliar->Open();

for (; !Auxiliar->Eof; Auxiliar->Next())
{
     if (PageControl2->PageCount == 0 || PageControl2->ActivePageIndex < Auxiliar->FieldByName("Disco")->AsInteger - 1)
     {
          TTabSheet *tPagina   = new TTabSheet(PageControl2);
          tPagina->PageControl = PageControl2;
          tPagina->Parent      = PageControl2;
          tPagina->Caption     = "Disco " + FormatFloat("0", Auxiliar->FieldByName("Disco")->AsInteger);
          tPagina->Name        = FormatFloat("'Disco'0", Auxiliar->FieldByName("Disco")->AsInteger);
          tPagina->TabVisible  = true;
          PageControl2->ActivePageIndex = Auxiliar->FieldByName("Disco")->AsInteger - 1;

          lvCanciones                    = new TListView(tPagina);
          lvCanciones->Parent            = tPagina;
          lvCanciones->Align             = alClient;
          lvCanciones->BevelKind         = bkFlat;
          lvCanciones->BorderStyle       = bsNone;
          lvCanciones->GridLines         = false;
          lvCanciones->Name              = FormatFloat("'Lista'0", Auxiliar->FieldByName("Disco")->AsInteger);
          lvCanciones->ReadOnly          = true;
          lvCanciones->RowSelect         = true;
          lvCanciones->ShowColumnHeaders = false;
          lvCanciones->ViewStyle         = vsReport;
          lvCanciones->Columns->Clear();
          lvCanciones->Items->Clear();

          pColumn = lvCanciones->Columns->Add();
          pColumn->Width = 194;
          pColumn = lvCanciones->Columns->Add();
          pColumn->Width = 193;
          pColumn = lvCanciones->Columns->Add();
          pColumn->Alignment = taRightJustify;
          pColumn->Width = 55;
          pColumn = lvCanciones->Columns->Add();
          pColumn->Width = 0;
     }

     pItem = lvCanciones->Items->Add();
     pItem->Caption = Auxiliar->FieldByName("Cancion")->AsString.Trim();
     pItem->SubItems->Add(Auxiliar->FieldByName("Interprete")->AsString.Trim());
     pItem->SubItems->Add(Auxiliar->FieldByName("Tiempo")->AsDateTime.FormatString("n:ss"));
     pItem->SubItems->Add(Auxiliar->FieldByName("Pista")->AsInteger);
}
Como veis a las pestañas y a las listas las nombro con el número de disco que he leído en el query. Luego, cuando necesito recuperar la información de esas pestañas, hago esto:
Código:
TComponent *Source;

for (int nDisco = 0; nDisco < PageControl2->PageCount; nDisco ++)
{
     Source = this->FindComponent(PageControl2->Pages[nDisco]->Name);
     TTabSheet *Sheet = static_cast<TTabSheet *>(Source);
     [...]
}
Con el depurador he comprobado que, por ejemplo en la imagen, la primera pestaña se llama Disco1, pero al correr el bucle y ejecutar el FindComponent me encuentro que Source da siemrpe valor NULL. He probado también esto:
Código:
TComponent *Source;

for (int nDisco = 0; nDisco < PageControl2->PageCount; nDisco ++)
{
     PageControl2->ActivePageIndex = nDisco
     Source = this->FindComponent(PageControl2->ActivePage->Name);
     TTabSheet *Sheet = static_cast<TTabSheet *>(Source);
     [...]
}
pero tampoco me encuentra los TTabSheet.

También he probado con esto:
Código:
for (int nDisco = 0; nDisco < PageControl2->ControlCount; nDisco ++)
{
     Source = PageControl2->Controls[nDisco];
     if (!Source->ClassNameIs("TTtabSheet"))
          continue;
     [...]
}
Curiosamente con el depurador compruebo que el elemento que encuentra (Source->Name) es Disco1, pero cuando hago la comprobación siguiente (Source->ClassNameIs) vuelve al inicio del bucle.

Última edición por Angel.Matilla fecha: 08-02-2024 a las 11:50:04.
Responder Con Cita