Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
Delphi 12 Athens
|
Re: TreeViewTools (rund um Node.Text und Node-Path)
8. Mär 2009, 13: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
$2B or not $2B
|
|
Zitat
|