Einzelnen Beitrag anzeigen

günni0
(Gast)

n/a Beiträge
 
#3

AW: VirtualStringTree und Klasseninstanzen - Node Data finden

  Alt 17. Apr 2018, 09:25
Wie ich Text lade ist mir klar.

Was mir nicht klar ist, ist der letzte Abschnitt aus meinem ersten Beitrag.

Ich möchte, dass wenn ich DeleteUserNameNode(<string>) aufrufe genau dasselbe gelöscht wird wie wenn ich DeleteUserNameNode(<int>) aufrufe.

Letzteres ist aber sicher nicht gleich wie ersteres denn in FindUserIDByIndex greife ich direkt auf das VST zu und nicht wie bei allen anderen Prozeduren auf die Klasseninstanzen um an die Daten zu kommen. Ich möchte mir nur ein paar kleine Helfer-prozeduren zusammenstellen, um später doppelten Code zu vermeiden. Aber diese Basis muss auch korrekt sein, sonst geht später alles schief.


--------------- Schnipps
ich glaube ich habs. Hier meine Änderung. Nodes werden jetzt auch korrekt bei umsortierter Liste gelöscht.
Hier ein Beispiel, um Nodes (+ Daten da OwnObjects True) aus einem VST, egal wie es sortiert ist, zu löschen.

Delphi-Quellcode:
// Helferfunktion, um UserName zu finden
function FindUserIDByName(const UserName: string): Integer;
var
 i: Integer;
begin
 Result := -1;
 if Assigned(_UserDataClasses) then
  begin
   for i := 0 to _UserDataClasses.Count - 1 do
    begin
     if AnsiSameText(_UserDataClasses[i].UserName, UserName) then
      begin
       Result := i;
       Break;
      end;
    end;
  end;
end;

// Helferfunktion, um den Node im VST anhand eines gesuchten Index zurückzugeben (Achtung: nicht AbsoluteIndex, sondern der Index in meinen Klassendaten!)
function FindUserIDByIndex(iIndex: Integer): PVirtualNode;
var
 i: Integer;
begin
 Result := nil;
 for i := 0 to _UserDataClasses.Count - 1 do
  if _UserDataClasses[i].Index = iIndex then
   begin
    Result := _UserDataClasses[i].aNode;
    Break;
   end;
 // Result := _VST.GetFirst(True);
 // while Assigned(Result) and (_VST.AbsoluteIndex(Result) <> Cardinal(iIndex)) do
 // Result := _VST.GetNext(Result, True);
end;

procedure DeleteUserNameNode(const UserName: string);
var
 Node: PVirtualNode;
begin
 DeleteUserNameNode(FindUserIDByName(UserName));
end;

procedure DeleteUserNameNode(iIndex: Integer);
var
 Node: PVirtualNode;
begin
 Node := FindUserNameByIndex(iIndex);
 if Assigned(Node) then
  _VST.DeleteNode(Node);
end;

// Aufruf
DeleteUserNameNode('Peter Wurst'); // Sucht den Namen, den Index (in den Klassendaten) und löscht den Node

DeleteUserNameNode(2); // Sucht in den Klassendaten nach einem Eintrag mit Index = 2 und löscht den dazugehörigen Node
Ob das mit dem Index nun so korrekt ist, muss ich erst noch sehen. Aber es erscheint mir logischer über die Variable Index der Klassendaten zu prüfen statt über den VST AbsoluteIndex.

Geändert von günni0 (17. Apr 2018 um 09:43 Uhr)
  Mit Zitat antworten Zitat