Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [VirtualTreeview]Items hinzufügen (https://www.delphipraxis.net/70613-%5Bvirtualtreeview%5Ditems-hinzufuegen.html)

arbu man 1. Jun 2006 16:19


[VirtualTreeview]Items hinzufügen
 
Hi,

Ich wollte grade wie in diesem Tutorial beschrieben Items in eine VST einfügen http://www.dsdt.info/tutorials/virtualtreeview/ leider kommt dabei eine Zugriffs verletzung :(

Was mache ich nur falsch ? :wall: :wall: :wall:

Delphi-Quellcode:
type
  TAI_TreeKind = (tkdic);

type
  PAI_TreeItem = ^TAI_TreeItem;
  TAI_TreeItem =record // meine daten
    kind: TAI_TreeKind;
    path: string[255];
    self: string[255];
  end;


// hier werden die items erstellt, bzw sollen erstellt werden
procedure TFEditorMain.TreeFilesExpanding(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
var
  slist: tstringlist;
  i: integer;
  rp: TAI_TreeItem;
begin
  if node = htdocs then begin
    TreeFiles.DeleteChildren(node);
    slist:= tstringlist.Create;
    slist:=Lister.listdirs(fhtdocs);
    TreeFiles.BeginUpdate;
    for i:=0 to slist.Count-1 do begin
      rp.path:= lister.path+slist[i];
      rp.self:= slist[i];
      TreeFiles.NodeDataSize:=SizeOf(TAI_TreeItem);
      AddVSTStructure(TreeFiles, node, rp);
    end;
    TreeFiles.EndUpdate;
  end;
end;

// diese function ist aus dem tutorial
function TFEditorMain.AddVSTStructure(AVST: TCustomVirtualStringTree;
  ANode: PVirtualNode; ARecord: TAI_TreeItem): PVirtualNode;
var
  Data: PAI_TreeItem;
begin
  Result:=AVST.AddChild(ANode);
  Data:=AVST.GetNodeData(Result);
  Avst.ValidateNode(Result, False);
  Data^.kind:=ARecord.kind;
  Data^.path:=ARecord.path;
  Data^.self:=ARecord.self;
end;

// Die Zugriffs verletzung kommt schon beim Expandieren
thx, arbu

pszopp 1. Jun 2006 20:36

Re: [VirtualTreeview]Items hinzufügen
 
Hallo,

ich habe ein paar Kleinigkeiten gefunden.
Vielleicht ist ja die Fehlerursache dabei:

Delphi-Quellcode:
procedure TFEditorMain.TreeFilesExpanding(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
var
  slist: tstringlist;
  i: integer;
  rp: TAI_TreeItem;
begin
  if node = htdocs then begin
    TreeFiles.DeleteChildren(node);
    // Kommentiere diese Zeile mal aus. !!! Sie erzeugt ein Speicherleck.
    //slist:= tstringlist.Create;
    slist:=Lister.listdirs(fhtdocs);
    try
      TreeFiles.BeginUpdate;

      try

        for i:=0 to slist.Count-1 do begin
          rp.path:= lister.path+slist[i];
          rp.self:= slist[i];

          // NodeDataSize sollte nur einmal beim
          // Programmstart eingestellt werden.
          // Danach sollte sich NodeDataSize eigentlich nicht mehr ändern.
          TreeFiles.NodeDataSize:=SizeOf(TAI_TreeItem);
          AddVSTStructure(TreeFiles, node, rp);
        end; // for lk

      finally
        TreeFiles.EndUpdate;
      end; // finally

    finally
      FreeAndNil(slist);
    end;

  end; // if

end; // TreeFilesExpanding


function TFEditorMain.AddVSTStructure(AVST: TCustomVirtualStringTree;
  ANode: PVirtualNode; ARecord: TAI_TreeItem): PVirtualNode;
var
  Data: PAI_TreeItem;
begin
  Result:=AVST.AddChild(ANode);
  Data:=AVST.GetNodeData(Result);
  Avst.ValidateNode(Result, False);
  Data^.kind:=ARecord.kind;
  Data^.path:=ARecord.path;
  Data^.self:=ARecord.self;
end; // AddVSTStructure
Grüße,

pszopp

arbu man 1. Jun 2006 21:09

Re: [VirtualTreeview]Items hinzufügen
 
Delphi-Quellcode:
// NodeDataSize sollte nur einmal beim Programmstart eingestellt werden.
          // Danach sollte sich NodeDataSize eigentlich nicht mehr ändern.
          TreeFiles.NodeDataSize:=SizeOf(TAI_TreeItem);
genau daran lag es, aber danke

Ich muss schon sagen der VirtualStringTree ist cool.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz