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.