Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi VST: Access Violation bei vst.deletenode (https://www.delphipraxis.net/163948-vst-access-violation-bei-vst-deletenode.html)

friedemann2009 23. Okt 2011 10:39

VST: Access Violation bei vst.deletenode
 
Moin zusammen,

habe ein kleines Problem und dazu noch nichts sinnvolles gefunden: Ich möchte lediglich in einem VST bestehende Nodes (häufig mit vielen Subnode-Strukturen) löschen. Das mache ich wie folgt:

Delphi-Quellcode:
  vst.BeginUpdate;
  try
    while assigned(node) do
      begin
        if vst.isvisible[node] then
          vst.DeleteNode(node);
        node:= vst.GetNextChecked(node);
      end;
  finally
    vst.EndUpdate;
  end;
Leider erhalte ich manchmal (nicht immer) eine EAccessViolation Fehlermeldung. Warum, verstehe ich nicht bzw. kann den Fehler auch nicht wirklich reproduzieren.

Laut Debugger tritt im VST der Fehler in folgender Funktion auf:

Delphi-Quellcode:
function TBaseVirtualTree.GetNextNoInit(Node: PVirtualNode): PVirtualNode;

// Optimized variant of GetNext, no initialization of nodes is performed (if a node is not initialized
// then it is considered as not being there).

begin
  Result := Node;
  if Assigned(Result) then
  begin
    Assert(Result <> FRoot, 'Node must not be the hidden root node.');

    // If there is no child node try siblings.
    if Assigned(Result.FirstChild) then //########HIER FEHLER######
      Result := Result.FirstChild
    else
    begin
      repeat
        // Is there a next sibling?
        if Assigned(Result.NextSibling) then
        begin
          Result := Result.NextSibling;
          Break;
        end
        else
        begin
          // No sibling anymore, so use the parent's next sibling.
          if Result.Parent <> FRoot then
            Result := Result.Parent
          else
          begin
            // There are no further nodes to examine, hence there is no further visible node.
            Result := nil;
            Break;
          end;
        end;
      until False;
    end;
  end;
end;
Hat jemand eine Idee? - Die Daten werden in OnFreeNode freigegeben.

Danke für Eure Mühe und schöne Grüße zum Sonntag,
Frieder

DeddyH 23. Okt 2011 10:50

AW: VST: Access Violation bei vst.deletenode
 
Du löschst eine Node und willst anschließend dessen Nachfolger ermitteln?

[edit] Wie ist es so?
Delphi-Quellcode:
while assigned(node) do
  begin
    NextNode := vst.GetNextChecked(node);
    if vst.isvisible[node] then
      vst.DeleteNode(node);
    node := NextNode;
  end;
[/edit]

friedemann2009 23. Okt 2011 11:10

AW: VST: Access Violation bei vst.deletenode
 
Bing! Das wars - hätte ich analog zu Rückwärtsschleifen (for..downto..) auch drauf kommen können..

Danke Dir und schönen Sonntag!
frieder


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 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