1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113:
| type TAddType = (AddTop,AddSort,AddBottom);
function AddTreeNodePathDupIgnore(TV: TTreeView; Path: String; Delimiter: Char; var ReNode : TTreeNode; AddType: TAddType): Boolean; var sL : TStringList; aNode : TTreeNode; z,iCount,zz,i : Integer; begin Result := False; aNode := nil; ReNode := nil; sL := TStringList.Create; try for z := 1 to Length(Path) do if Path[z] = Delimiter then Path[z] := #13;
sL.Text := Path;
for z := sL.Count-1 downto 0 do if sL[z] = '' then sL.Delete(z);
iCount := Pred(sL.Count); if TV.Items.Count > 0 then aNode := TV.Items[0]; for z := 0 to iCount do begin while Assigned(aNode) and (AnsiCompareStr(aNode.Text,sL[z]) <> 0) do aNode := aNode.GetNextSibling; if Assigned(aNode) then ReNode := aNode else begin Result := True; if assigned(ReNode) then aNode := ReNode; case AddType of AddTop : for zz := z to iCount do aNode := TV.Items.AddChildFirst(aNode,sL[zz]); AddSort : begin for zz := z to iCount do if TV.Items.Count = 0 then aNode := TV.Items.AddChild(aNode,sL[zz]) else begin if not (assigned(aNode)) then begin aNode := TV.Items[0]; while Assigned(aNode) and (AnsiCompareStr(aNode.Text,sL[zz]) < 0) do aNode := aNode.GetNextSibling;
if Assigned(aNode) then aNode := TV.Items.Insert(aNode,sL[zz]) else aNode := TV.Items.AddChild(aNode,sL[zz]); end else begin if aNode.Count > 0 then begin i := aNode.Count-1; aNode := aNode[0]; while (aNode.Index < i) and (AnsiCompareStr(aNode.Text,sL[zz]) < 0) do aNode := aNode.GetNextSibling;
if AnsiCompareStr(aNode.Text,sL[zz]) < 0 then aNode := TV.Items.Add(aNode,sL[zz]) else aNode := TV.Items.Insert(aNode,sL[zz]); end else aNode := TV.Items.AddChild(aNode,sL[zz]); end; end; end; AddBottom : for zz := z to iCount do aNode := TV.Items.AddChild(aNode,sL[zz]); end;
ReNode := aNode; Break; end;
if z < iCount then aNode := aNode.GetFirstChild; end; finally sL.Free; end; end; |