Ich versuche mir gerade eine Funktion zu schreiben die mir die Node-Daten anhand eines Index findet
Delphi-Quellcode:
function GetNodeData(Index: Integer): TUserdata;
var
i: Integer;
begin
Result := nil;
for i := 0 to _UserDataClasses.Count - 1 do
if _UserDataClasses[i].Index = Index then
begin
Result := _UserDataClasses[i].aNode.GetData<TUserData>;
Exit;
end;
end;
Mein Problem besteht darin, dass ich nicht weiß ob ich mich am Index
.Index oder
[i] orientieren muss, um das zurückzugeben was ich suche.
In einer anderen Prozedur füge ich Klasseninstanzen in meine ObjectList hinzu und dachte, dass Folgendes funktioniert
Delphi-Quellcode:
if InsertAtPosition > -1 then
_UserDataClasses.Insert(InsertAtPosition, _UserData)
else
_UserDataClasses.Add(_UserData);
Das .Insert( funktioniert leider überhaupt nicht wie gewollt. Das VST zeichnet mir den an beispielsweise Index 2 hinzugefügten Eintrag gar nicht und kopiert irgendwie nur den aller letzten.
Daher die Frage.
Ist es vollkommen
egal in welcher Reihenfolge die Daten in der ObjectList liegen [man sortiert das VST ja glaube ich eh manuell] und soll man sich
nur am Index
.Index (eigene Variable in der Klasse) orientieren den ich dann jetzt so setze
Delphi-Quellcode:
// Prozedur die Daten lädt, eine Klasseninstanz erstellt und in die ObjectList packt. Mit dem optionalen Parameter UseIndex kann man den Inhalt der Variablen Index selber bestimmen.
if UseIndex> -1 then
_UserDataClasses.Index := UseIndex
else
_UserData.Index := _UserDataClasses.Count;
_UserDataClasses.Add(_UserData);
?
zweite Frage. Wie schaffe ich es die Funktion GetNodeData(Index: Integer) oben als überladene Funktion
ohne doppelten Code bereitzustellen?
Beispielsweise wenn ich als Parameter UserName: string haben und diesen auch finden möchte?
Ich könnte die Funktion einfach kopieren und statt .Index = Index dann .UserName = Username prüfen. Aber das wäre doppelter Code.
Bin für Hilfe sehr dankbar!
Oder meine frage etwas anders formuliert.
Wenn ich einen Nutzernamen finden möchte, iteriere ich dann durch die Nodes oder durch die ObjectList?
Delphi-Quellcode:
// General helper function used in multiple other functions (e.g. DeleteUserNameNode)
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;
function FindUserIDByIndex(iIndex: Integer): PVirtualNode;
begin
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;
Irgendwie bin ich gerade total durcheinander weil ich absolut keine Ahnung habe, an welche Daten ich mich jetzt halten soll... Klasseninstanzen oder nicht?
Bei FindUserIDByName(<string>) halte ich mich ganz klar daran den Nutzer anhand des Namens zu finden und durchsuche die Klasseninstanzen.
Bei FindUserNameByIndex(<int>) durchsuche ich aber direkt das Index der VST und greife nicht auf die Klasseninstanzen zu. Da ist doch schon der erste Fehler oder?