Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#7

Re: TreeViewTools (rund um Node.Text und Node-Path)

  Alt 8. Mär 2009, 12:31
Zitat von himitsu:
Schlanker mag es aussehn, aber dafür sind dort mehrere Prozeduraufrufe und Rückprünge drin und es wird ein klein bissl mehr Speicher benötigt.
Delphi-Quellcode:
function GetNodePath(aNode:TTreeNode; WithTailingDelimiter: Boolean): String;
begin
  Result := '';
  while Assigned(aNode) do begin
    Result := aNode.Text + '\' + Result;
    aNode := aNode.Parent;
  end;
  if not WithDelimiter then Delete(Result, Length(Result), 1);
end;


// falls aNode nie NIL ist, dann auch so möglich

function GetNodePath(aNode:TTreeNode; WithTailingDelimiter: Boolean): String;
begin
  if WithDelimiter then Result := aNode.Text + '\else Result := aNode.Text;
  aNode := aNode.Parent;
  while assigned(aNode) do begin
    Result := aNode.Text + '\' + Result;
    aNode := aNode.Parent;
  end;
end;
ach ja, .Parent ruft .GetParent auf, was wiederum intern einiges macht ... drum hab ich das in der Schleife nur noch einmal drin.

Zitat von Satty67:
Wie implementiere ich die Aufgabe, manche Node mit und mache ohne abschließenden '\' zu liefern? Außerhalb lösen?
Delphi-Quellcode:
function GetNodePath(Node: TTreeNode; WithTailingDelimiter: Boolean): String;
begin
  if Assigned(Node) then begin
    if WithTailingDelimiter then
      Result := GetNodePath(Node.Parent, True) + Node.Text + '\'
    else Result := GetNodePath(Node.Parent, True) + Node.Text;
  end else Result := '';
end;

// oder

function GetNodePath(Node: TTreeNode; WithTailingDelimiter: Boolean): String;
begin
  if Assigned(Node) then begin
    Result := GetNodePath(Node.Parent, True) + Node.Text;
    if WithTailingDelimiter then Result := Result + '\';
  end else Result := '';
end;

[add]
noch länger, aber dafür wohl noch schneller ...
Delphi-Quellcode:
Function GetNodePath(Node: TTreeNode; WithTailingDelimiter: Boolean): String;
  Var L: Integer;
    Temp: TTreeNode;
    P: PChar;

  Begin
    If Assigned(Node) Then Begin
      L := 0;
      Temp := Node;
      While Assigned(Temp) do Begin
        Inc(L, Length(Temp.Text) + 1);
        Temp := Temp.Parent;
      End;
      If not WithTailingDelimiter Then Dec(L);
      SetLength(Result, L * SizeOf(Char));
      P := PChar(Result);
      While Assigned(Node) do Begin
        MoveMemory(P, PChar(Temp.Text), Length(Temp.Text) * SizeOf(Char));
        Inc(P, Length(Temp.Text));
        Node := Node.Parent;
        If Assigned(Node) or WithTailingDelimiter Then Begin
          P^ := '\';
          Inc(P);
        End;
      End;
    End Else Result := False;
  End;
ungetestet, aber sollte so stimmen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat