Einzelnen Beitrag anzeigen

günni0
(Gast)

n/a Beiträge
 
#1

VirtualStringTree und Klasseninstanzen - Node Data finden

  Alt 16. Apr 2018, 23:22
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?

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