Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

A vueltas con VirtualTreeView

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: A vueltas con VirtualTreeView Responder citando

Me han pasado un codigo en Delphi para ver si me voy enterando de como funciona este interesantre elemento. De momento sólo tengo en el formulario un TVirtualStringTree que pretendo cargar con un query desde un vista en FB. EL código que tengo puesto es este:
Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Menu.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)
#pragma link "VirtualTrees"
#pragma resource "*.dfm"
TForm1 *Form1;

AnsiString cAux;

extern void ColorForm(TForm *Form, bool lAuto = true);
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
     : TForm(Owner)
{
     ColorForm(this);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
     Action = caFree;
     Form1 = NULL;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
     PTreeData Dato;
     PVirtualNode Nodo;

     VST->Clear();
     VST->NodeDataSize = sizeof(TTreeData);

     fMenu->Query->Close();
     fMenu->Query->SQL->Text = "SELECT Municipio, Codigo FROM Dl01 WHERE CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') ORDER BY 1";
     fMenu->Query->Open();

     for (; !fMenu->Query->Eof; fMenu->Query->Next())
     {
          cAux = fMenu->Query->FieldByName("Municipio")->AsString;

          Nodo = VST->AddChild(NULL);
          Dato = (PTreeData) VST->GetNodeData(Nodo);
          Dato->Caption = cAux;
     }
}
//---------------------------------------------------------------------------
Y el fichero de cabecera:
Código:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "VirtualTrees.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
     TVirtualStringTree *VST;
     void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
     void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
public:        // User declarations
     __fastcall TForm1(TComponent* Owner);
};

typedef struct tagTTreeData
{
     AnsiString Caption;
} TTreeData, *PTreeData;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

El query funciona a la perfección y da este resultado:

Sin embargo tras ejecutar el código que he puesto, el resultado es este:

Como podéis ver en ningún sitio del codigo aparece el literal Node. Además no entiendo por qué rellena todas las columnas del TreeView. ¿Alguno me puede dar una pista?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Voy más allá. He simplificado el código haciendo un bucle:
Código:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "VirtualTrees.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
     TVirtualStringTree *VST;
     void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
public:        // User declarations
     __fastcall TForm1(TComponent* Owner);
};

struct TRecBase
{
     AnsiString Literal;
};

typedef TRecBase *PTrecBase; // puntero al registro, se usa siempre.
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Código:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "VirtualTrees"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
     : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
     AnsiString cLiteral;
     PTrecBase pRecData;
     PVirtualNode Nodo;

     VST->BeginUpdate();
     VST->Clear();
     VST->NodeDataSize = sizeof(TRecBase);

     for (int nItem = 0; nItem < 10; nItem ++)
     {
          cLiteral = "Nodo " + IntToStr(nItem);
          Nodo     = VST->AddChild(NULL);
          pRecData = (PTrecBase) VST->GetNodeData(Nodo);
          pRecData->Literal = cLiteral;
     }
     VST->EndUpdate();
}
//---------------------------------------------------------------------------

Pues el VirtualStringTree sigue mostrándose como en la imagen de más arriba, pero si corro el programa con el depurador compruebo que pRecData->Literal va cambiando su valor correctamente (Nodo 0, Nodo 1, etc.) pero ese valor no se muestra en el VST. ¿Qué puedo estar haciendo mal?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Ya encontré la respuesta, gracias a Stack Overflow. Estuve haciendo pruebas con el ejemplo que hay en GitHub y adaptando el código que me pasaron en Delphi y el problema estaba en como hacía la asignación del valor.

Como el ejemplo es para una versión superior de Builder, al adaptarlo no me di cuenta y "bauticé" mal un variable en el evento OnGetText y por eso no se mostraba el valor correcto.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.