Foros Club Delphi

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

Angel.Matilla 22-11-2019 10:06:34

Personalizar TVirtualStringTree
 
En un TVirtualStringTree en que tengo activadas las casillas de verificación, ¿se puede conseguir que sólo aquellos nodos con descendientes sean los que muestran dicha casilla? He estado probando con el evento OnInitChildren pero no consigo lo que busco, que sería esto

La imagen está preparada, evidentemente.

Casimiro Notevi 22-11-2019 11:58:57

En el GetImageIndex puedes indicar qué imagen poner, supongo que podrás asignarle "null", o una en blanco.

Código Delphi [-]
procedure TFcuentas.vstArbolGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  pRec : ^TRecBase;
  iNivel : Integer;
begin
  inherited;
  if iMaxDigitos=0 then
    Exit;
  if Column=0 then
  begin
    pRec := Sender.GetNodeData(Node);
    iNivel := pRec.Nivel;
    if iNivel=1 then
      ImageIndex := 0
    else
    if (iNivel>1) and (iNivel < iMaxDigitos) then
      ImageIndex := 1
    else
    if iNivel=iMaxDigitos then
      ImageIndex := 2;
  end;
end;


Angel.Matilla 22-11-2019 13:26:36

Cita:

Empezado por Casimiro Notevi (Mensaje 534522)
En el GetImageIndex puedes indicar qué imagen poner, supongo que podrás asignarle "null", o una en blanco.

Gracias por la sugerencia pero no hace lo que quiero porque la imagen la pone al lado del CheckBox.

y lo que me hace falta es que no aparezca el CheckBox. Estuve probando en el evento OnInitChildren, pero no me hace nada.

Casimiro Notevi 22-11-2019 13:41:45

Pero, ¿has visto la imagen que te he puesto de ejemplo? :)

Casimiro Notevi 22-11-2019 14:00:52

Si te fijas, en las cuentas no tiene el recuadro.





Y no olvides las opciones de "paint", por si acaso es una de ellas:



Angel.Matilla 22-11-2019 17:27:16

Cita:

Empezado por Casimiro Notevi (Mensaje 534531)
Pero, ¿has visto la imagen que te he puesto de ejemplo? :)

Vale. Tengo que repasar las propiedades del elemento. Ahí tienes razón.

Angel.Matilla 22-11-2019 17:44:35

Cita:

Empezado por Casimiro Notevi (Mensaje 534531)
Pero, ¿has visto la imagen que te he puesto de ejemplo? :)

Vale. HE comprobado que las propiedades del TreeView las tengo como las has puesto, pero adaptando tu código de Delphi a Builder:
Código:

void __fastcall TfEleccion::MesasGetImageIndex(TBaseVirtualTree *Sender,
      PVirtualNode Node, TVTImageKind Kind, TColumnIndex Column,
      bool &Ghosted, int &ImageIndex)
{
    PTreeEle tDato;

    if (Column == 0)
    {
          tDato = (PTreeEle)Mesas->GetNodeData(Node);
          if (tDato->CodPar != 0)
              ImageIndex = 7;
    }
}

siendo ese valor 7 de ImageIndex un cuadro blanco, sigue saliendo lo que subía en al segunda imagen esta mañana. Y para prevenir valores erróneos cuando cargo el TreeView me aseguro que ese valor CodPar sólo contenga valores válidos al cargar el último nodo (el de los partidos).

Mientras tanto estuve investigando y encontré en StackOverFlow un código que hace lo que busco, pero no soy capaz de entender como aplicarlo. El enlace es este: https://stackoverflow.com/questions/...-by-some-nodes

Angel.Matilla 22-11-2019 17:51:00

Básicamente lo que me hace falta es esto:

Y el código de StackOverFlow debería hacer eso, pero ya os digo que no sé como aplicarlo. :(:(

Casimiro Notevi 22-11-2019 18:42:30

Pues "juega" con las propiedades porque no hay que hacer nada más, aparentemente.
He quitado las imágenes que yo le estaba poniendo y, por defecto, sale como quieres:



Angel.Matilla 22-11-2019 19:07:15

Gracias. Seguiré probando.

Angel.Matilla 23-11-2019 10:10:49

¡Por fin!
 
Lo logré y al final resultó mucho más sencillo de lo que pensaba.

He utilizado este código en el evento OnInitNode:
Código:

void __fastcall TfEleccion::MesasInitNode(TBaseVirtualTree *Sender, PVirtualNode ParentNode, PVirtualNode Node, TVirtualNodeInitStates &InitialStates)
{
    PTreeEle DatEle = (PTreeEle)Mesas->GetNodeData(Node);

    if (DatEle->CodPar != 0)
          Node->CheckType = ctNone;
    else
    {
          Node->CheckType = ctCheckBox;
          Sender->CheckType[Node]  = ctTriStateCheckBox;
          Sender->CheckState[Node] = csUncheckedNormal;
    }
}

He utilizado, en este caso, uno de los campos de la estructura de datos que sólo debe tener valor en ese último nodo. No sé si será la forma más elegante, pero funciona.


La franja horaria es GMT +2. Ahora son las 17:43:01.

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