Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Primer nodo de un TVirtualStringTree (https://www.clubdelphi.com/foros/showthread.php?t=95547)

Angel.Matilla 03-02-2022 09:59:02

Primer nodo de un TVirtualStringTree
 
Buenos días. Tengo un TVirtualStringTree como este:

y a partir de la elección del usuario construyo un AnsiString para bautizar un informe; en el caso del ejemplo debe quedar así:
Cita:

F. DE PAGO - BANCO - CTAS. CORRECTAS - POR CUENTA
Para construir la cadena uso este código:
Código:

AnsiString cReportTitle = "";
PVirtualNode Nodo1 = Listado->FocusedNode;
while (Nodo1 != NULL)
{
    try
    {
          cAux = Trim(((PTreeCor)Listado->GetNodeData(Nodo1))->Identidad);
    }
    catch(Exception &Exc)
    {
          break;
    }

    if (cAux.Pos("(") != 0)
          cAux = cAux.SubString(1, cAux.Pos("(") - 1).Trim();
    cReportTitle =  UpperCase(cAux) + " - " + cReportTitle;
    Nodo1 = Nodo1->Parent;
}
cReportTitle = "LISTADO POR " + cReportTitle.SubString(1, cReportTitle.LastDelimiter("-") - 1).Trim();

pero he comprobado con el depurador que la condición del while no se cumple nunca: Cuando el bucle llega al primer nodo de la rama (F. de pago en este caso) la propiedad Parent de Nodo1 sigue teniendo valor, razón por la que he tenido que poner ese try...catch() para poder continuar la ejecución.

¿Cómo podría saber que he llegado al primer nodo de una rama en ese TVST?

Casimiro Notevi 03-02-2022 12:14:50

Creo recordar que era algo así como:
Node := Vts1.GetFirst;

Angel.Matilla 03-02-2022 12:56:30

Cita:

Empezado por Casimiro Notevi (Mensaje 545174)
Creo recordar que era algo así como:
Node := Vts1.GetFirst;

Gracias. Lo probaré

Angel.Matilla 03-02-2022 13:36:42

Bueno. Después de dar muchas vueltas encontré la solución: GetFirst, como me sugería Casimiro, no me vale porque ese método te dirige al primer nodo de todo el árbol. Me ha quedado así el código:
Código:

AnsiString cReportTitle = "";
PVirtualNode Nodo1 = Listado->FocusedNode;
while (Listado->GetNodeLevel(Nodo1) > 0)
{
    cAux = Trim(((PTreeCor)Listado->GetNodeData(Nodo1))->Identidad);

    if (cAux.Pos("(") != 0)
          cAux = cAux.SubString(1, cAux.Pos("(") - 1).Trim();
    cReportTitle =  UpperCase(cAux) + " - " + cReportTitle;
    Nodo1 = Nodo1->Parent;
}
cReportTitle = "LISTADO POR " +
                UpperCase(Trim(((PTreeCor)Listado->GetNodeData(Nodo1))->Identidad)) + " - " +
                cReportTitle.SubString(1, cReportTitle.LastDelimiter("-") - 1).Trim();



La franja horaria es GMT +2. Ahora son las 00:03:07.

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