Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-02-2024
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 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 12:50:04.
Responder Con Cita
  #2  
Antiguo 08-02-2024
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Red face ¡¡¡aclarado!!!

Ya sé por qué estaba funcionando mal: Estaba haciendo el FindComponent sobre el formualrio y no sobre el TPageControl.
Responder Con Cita
  #3  
Antiguo 08-02-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Sólo como apunte de información general.
FindComponent no es muy eficiente, al contrario es bastante lento.
Si lo usas mucho, lo más ágil es guardar una lista con los componentes creados (para eso va muy bien las TObjectList) y luego buscar el componente en esa lista en lugar de recorrerlos todos. Una variante, es usar un TStringList ordenada con el nombre del componente; De esa forma la búsqueda es dicotómica en lugar de secuencial.
Más eficiente cuantos más componentes tengamos..
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Donde encontrar componente XMLParser vejerf Varios 0 05-03-2007 19:42:00
Donde encontrar el componente Quick Report? (delphi7) tramjauer Varios 2 05-10-2005 19:46:54
Encontrar el enfoque del componente AGAG4 Varios 5 14-08-2004 21:17:26
donde encontrar el componente RXGIFANIMATOR viajero2015 Gráficos 1 30-01-2004 05:31:19
Encontrar un componente tica Varios 1 29-01-2004 17:47:38


La franja horaria es GMT +2. Ahora son las 01:34:16.


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
Copyright 1996-2007 Club Delphi