J'ai commencé à jouer avec VirtualTreeView et il semble à partir de toutes les informations et documents Web que VirtualTreeView gère la mémoire des données fournies par l'utilisateur (enregistrements le cas échéant). On n'a pas besoin de New () et Dispose () de données utilisateur. Il suffit d'indiquer à VirtualTreeView la taille des données utilisateur et d'attribuer ses valeurs de champ après avoir appelé GetNodeData.

Et si je voulais gérer ça? Cela peut-il être fait? Puis-je créer les données utilisateur comme je le souhaite et les ajouter à mes propres listes et ne fournir qu'un pointeur de chaque enregistrement vers VirtualTreeView sans que cela n'interfère?

3
Blurry Sterk 23 déc. 2015 à 22:29

2 réponses

Meilleure réponse

Il suffit d'indiquer à VirtualTreeView la taille des données utilisateur et d'attribuer ses valeurs de champ après avoir appelé GetNodeData

Ce n'est pas tout à fait correct - il faut également prendre soin de finaliser l'enregistrement de données utilisateur s'il contient des types de données qui l'exigent - c'est-à-dire des types comptés de référence comme la chaîne et l'interface. Ceci est fait dans l'événement OnFreeNode. Donc, si votre enregistrement de données contient une chaîne

type
  TMyNodeData = record
    Foo: string;
  end;

Alors vous devez lui attribuer une chaîne vide lorsque les données du nœud sont libérées:

procedure TForm1.VT_FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var ND: PMyNodeData;
begin
  ND := Sender.GetNodeData(Node);
  if(ND <> nil)then begin
     ND.Foo := '';
  end;
end;

Sinon vous fuirez cette chaîne.

Le moyen le plus simple de gérer la mémoire vous-même est de ne pas utiliser du tout l'enregistrement de données utilisateur des VT, ou de n'avoir qu'un pointeur vers une autre structure de données.

6
ain 23 déc. 2015 à 20:20

Non vous ne pouvez pas. VTW utilise une taille fixe de données utilisateur, ce qui permet des calculs et un accès rapides.

MAIS vous pouvez demander SizeOf(pointer) taille de userdata puis stocker le pointeur vers vos blocs de données dans les données utilisateur fournies par VTW. Vous géreriez vous-même les types de données à ces cadres et leurs tailles et leur allocation / désallocation. Vous devrez néanmoins stocker des pointeurs vers ces données dans les données utilisateur fournies par VTW, mais à part cela, vous ne dépendriez pas de cela.

Dans Delphi plus récent (2010+), vous pouvez également utiliser l'objet TDictionary<Pointer, you-data-type>, et récupérer les données en utilisant PVirtualNode donné par VTW comme clé dans ce conteneur. De cette façon, vous pourrez définir UserData pour avoir une taille nulle, de sorte que VTW n'allouerait que le pool de mémoire des nœuds pour ses propres besoins.

Mais dans la mesure du possible, vous utiliserez mieux UserData - car il a été spécialement optimisé pour vous par l'équipe VTW.

2
Arioch 'The 23 déc. 2015 à 20:20