Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Recorrer TVirtualStringTree (https://www.clubdelphi.com/foros/showthread.php?t=94960)

Angel.Matilla 24-11-2020 10:13:52

Recorrer TVirtualStringTree
 
Buenas a todos. Ya sé que soy un poco pesado, pero es que no encuentro el camino. Tengo este TVirtualStringTree:

y quiero comprobar los nodos seleccionados. Para ello estoy usando este código:
Código:

void __fastcall TfSelDocs::AlbaranesChecked(TBaseVirtualTree *Sender, PVirtualNode Node)
{
    int nHay = 0;
    slEmisor->Clear();

    if (Albaranes->CheckState[Node] == csCheckedNormal || Albaranes->CheckState[Node] == csCheckedPressed)
    {
          Nodo1 = Albaranes->GetFirst();
          Nodo2 = NULL;

          while (Nodo1 != NULL && Nodo2 == NULL)
          {
              if ((Albaranes->CheckState[Nodo1] == csCheckedNormal || Albaranes->CheckState[Nodo1] == csCheckedPressed) && !Albaranes->HasChildren[Nodo1])
              {
                    nHay ++;
                    Nodo2 = Nodo1;
              }
              Nodo1 = Albaranes->GetNext(Nodo1);
          }
    }
}

pero me he dado cuenta que de esta forma en un caso como el de la imagen siempre me cuenta un nodo; cuando hay dos marcados sólo la primera vez que recorre el bucle entra en él. ¿Qué estoy haciendo mal?

Casimiro Notevi 24-11-2020 10:27:08

Puedes recorrerlos con los métodos: GetFirstChecked y GetNextChecked.

Angel.Matilla 24-11-2020 11:26:48

Gracias. Probaré y ya os diré como ha ido.

Angel.Matilla 24-11-2020 11:31:52

Cita:

Empezado por Casimiro Notevi (Mensaje 539216)
Puedes recorrerlos con los métodos: GetFirstChecked y GetNextChecked.

¡Mi gozo en un pozo! En C++ no existen esos métodos.

Angel.Matilla 24-11-2020 11:57:56

¡Solucionado! Estaba planteando fatal la lógica del proceso. Lo he dejado así:
Código:

void __fastcall TfSelDocs::AlbaranesChecked(TBaseVirtualTree *Sender, PVirtualNode Node)
{
    int nHay = 0;
    slEmisor->Clear();

    Nodo1 = Albaranes->GetFirst();

    while (Nodo1 != NULL)
    {
          if ((Albaranes->CheckState[Nodo1] == csCheckedNormal || Albaranes->CheckState[Nodo1] == csCheckedPressed) && !Albaranes->HasChildren[Nodo1])
              nHay ++;
          Nodo1 = Albaranes->GetNext(Nodo1);
    }
}

y funciona a la perfección.

Casimiro Notevi 24-11-2020 15:25:44

Es curioso que sean distintos para C++ y Delphi.

Angel.Matilla 25-11-2020 10:51:51

Cita:

Empezado por Casimiro Notevi (Mensaje 539221)
Es curioso que sean distintos para C++ y Delphi.

Sí, siempre me ha llamado la atención.


La franja horaria es GMT +2. Ahora son las 07:17:37.

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