unit TreeViewFunctions;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, ComCtrls, Controls, Forms,
FileCtrl, StrUtils, Masks, Vcl.OleCtrls, SHDocVw, IOUtils;
procedure SaveTreeViewExplandState(TreeView: TTreeView; FileName: string);
procedure LoadTreeViewExplandState(TreeView: TTreeView; FileName: string);
function ExtractNewFolderPath(FileName: string; NewText: string): string;
procedure HideHideHorizontalScrollBar(TreeView: TTreeView);
function IsEmptyDir(sDir: String): Boolean;
function AttachMentsExists(FileName: String): Boolean;
procedure SetIcons(TreeView: TTreeView; list: TStringList);
procedure EnumText(s: string; aItem: TTreeNode);
function AttachmentsFolder(FileName: String): string;
function ExtractNodeFullPath(TreeView: TTreeView): string;
function Get_node_path(node: TTreeNode): string;
function ExtractTreeViewFileName(RootPath: string; TreeView: TTreeView): string;
///
/// Node.Selected := true; Node.Focused := true;
///
///
/// Node.Selected := true; Node.Focused := true;
///
///
/// Node.Selected := true; Node.Focused := true;
///
function OpenFile(Path: string; RichEdit: TRichEdit; TreeView: TTreeView)
: Boolean; overload;
function OpenFile(Path: string; Webbrowser: TWebbrowser; TreeView: TTreeView)
: Boolean; overload;
procedure GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode;
IncludeFiles: Boolean);
procedure DirToTreeView(Tree: TTreeView; Directory: string; Root: TTreeNode;
IncludeFiles: Boolean; FileExt: string);
procedure QSetPerpoty(TreeView: TTreeView);
function ItemExist(Text: string; TreeView: TTreeView): Boolean;
function RemoveDirs(folderPath: string): Boolean;
function __RenameFile(OldName: string; Title: string): Boolean;
function RenameFolder(filePath: string; Title: string): Boolean;
var
list: TStringList;
implementation
{
// "D:\C++Builder学习大全中文版\index.htm"
// "D:\C++Builder学习大全中文版\"
// "index_files"
// "D:\C++Builder学习大全中文版\index_files"
var
s, s1, s2: string;
begin
s := 'D:\C++Builder学习大全中文版\index.htm';
s1:=ExtractNewFolderPath(s,'_files');
s2 := ExtractNewFolderPath(s, '_AttachMents');
Memo1.lines.Add(s);
Memo1.Lines.Add(s1);
Memo1.lines.Add(s2);
end;
}
function ExtractNewFolderPath(FileName: string; NewText: string): string;
var
_filesFolder: string; // "D:\C++Builder学习大全中文版\"
_filesFolderName: string; // "index_files"
_filesFolderPath: String;
begin
_filesFolder := ExtractFilePath(FileName);
_filesFolderName := ChangeFileExt(ExtractFileName(FileName), '') + NewText;
_filesFolderPath := _filesFolder + _filesFolderName;
Result := _filesFolderPath;
end;
{
SaveTreeViewExplandState(TreeView1,'TreeView.txt');
}
procedure SaveTreeViewExplandState(TreeView: TTreeView; FileName: string);
var
list: TStringList;
i: Integer;
begin
list := TStringList.Create;
With TreeView do
begin
for i := 0 to Items.Count - 1 do
begin
if Items.Item[i].Expanded then
list.Add(IntToStr(i));
end;
list.Add(IntToStr(Selected.AbsoluteIndex));
end;
list.SaveToFile(FileName);
list.free;
end;
{
LoadTreeViewExplandState(TreeView1, 'abc.txt');
}
procedure LoadTreeViewExplandState(TreeView: TTreeView; FileName: string);
var
list: TStringList;
i: Integer;
node: TTreeNode;
begin
list := TStringList.Create;
with list do
begin
list.LoadFromFile(FileName);
for i := 0 to Count - 2 do // 最后一行放的是最后选中的那个节点索引
begin
TreeView.Items[StrToInt(list[i])].Expand(False);
end;
node := TreeView.Items[StrToInt(list[Count - 1])];
TreeView.Select(TreeView.Items[StrToInt(list[Count - 1])], []);
// node.Selected := True;
// node.Focused := True;
TreeView.SetFocus;
TreeView.Focused;
free;
end;
end;
{
FUNCTION ulong ShowScrollBar(ulong hwnd,ulong wBar,ulong bShow) LIBRARY "user32.dll"
constant long SB_HORZ = 0
constant long SB_VERT = 1
constant long SB_BOTH = 3
}
procedure HideHideHorizontalScrollBar(TreeView: TTreeView);
begin
// no responed NEW FORM TEST
// ShowScrollBar(TreeView.Handle,SB_HORZ,False);
end;
// procedure
// begin
// { 当拖拽的高度不够的时候自动滚动滚动条 }
// with TreeView1 do
// begin
// if (Y < 15) then
// SendMessage(Handle, WM_VSCROLL, SB_LINEUP, 0)
// else if (Height - Y < 15) then
// SendMessage(Handle, WM_VSCROLL, SB_LINEDOWN, 0);
// end;
// end;
{
返回 附件文件夹
"D:\C++Builder学习大全中文版\新建文本文档.htm"
D:\C++Builder学习大全中文版\新建文本文档_Attachments
}
function AttachmentsFolder(FileName: String): string;
begin
Result := ExtractFilePath(FileName) + ChangeFileExt(ExtractFileName(FileName),
'') + '_Attachments';
end;
function AttachMentsExists(FileName: String): Boolean;
var
f: string;
begin
f := ExtractFilePath(FileName) + ChangeFileExt(ExtractFileName(FileName), '')
+ '_Attachments';
Result := DirectoryExists(f);
end;
procedure EnumText(s: string; aItem: TTreeNode);
var
node: TTreeNode;
str: string;
begin
node := aItem;
while node nil do
begin
if s = '' then
str := node.Text
else
str := s + '\' + node.Text;
list.Add(str);
/// //////////////////////////
if node.HasChildren then
EnumText(str, node.getFirstChild);
node := node.getNextSibling;
end;
end;
function IsEmptyDir(sDir: String): Boolean;
var
sr: TSearchRec;
begin
Result := True;
if Copy(sDir, Length(sDir) - 1, 1) '\' then
sDir := sDir + '\';
if FindFirst(sDir + '*.*', faAnyFile, sr) = 0 then
repeat
if (sr.Name '.') and (sr.Name '..') then
begin
Result := False;
break;
end;
until FindNext(sr) 0;
FindClose(sr);
end;
{
是文件 夹的设置为1
是文件 的设置为 2
}
procedure SetIcons(TreeView: TTreeView; list: TStringList);
var
i: Integer;
begin
with TreeView do
begin
for i := 0 to Items.Count - 1 do
begin
if DirectoryExists(list.Strings[i]) then
begin
Items[i].ImageIndex := 0;
Items[i].SelectedIndex := 0;
Items[i].StateIndex := 0;
end;
if FileExists(list.Strings[i]) then
begin
Items[i].ImageIndex := 1;
Items[i].SelectedIndex := 1;
Items[i].StateIndex := 1;
end;
if (AttachMentsExists(list.Strings[i])) then
if not IsEmptyDir(AttachmentsFolder(list.Strings[i])) then
begin
// Form1.Memo1.LINES.Add( AttachmentsFolder(list.Strings[i]));
Items[i].ImageIndex := 2;
Items[i].SelectedIndex := 2;
Items[i].StateIndex := 2;
end;
end;
end;
end;
procedure QSetPerpoty(TreeView: TTreeView);
begin
with TreeView do
begin
// Align := alBottom;
// Anchors := [akLeft, akTop, akBottom, akRight];
Items.Clear;
// BorderStyle := bsNone;
Cursor := crHandPoint;
ReadOnly := True;
ShowHint := True;
RowSelect := True;
ShowButtons := True;
ShowRoot := True;
ShowLines := False;
SortType := stText;
HideSelection := False;
RightClickSelect := True;
DragMode := dmAutomatic;
// Color := RGB(238, 243, 246);
end;
end;
{
实际重命名
C:\windows\test.txt
C:\windows\csadsajas.txt
MoveFile(PChar('C:\1.txt'),PChar('C:\ABC.txt'));
if not __RenameFile('C:\tree.txt','TreeView') then
Application.MessageBox('重命名文件失败','重命名',MB_ICONERROR);
}
{ 重命名文件 }
function __RenameFile(OldName: string; Title: string): Boolean;
var
NewName: string;
begin
NewName := Format('%s%s%s', [ExtractFilePath(OldName), Title,
ExtractFileExt(OldName)]);
Result := MoveFile(PChar(OldName), PChar(NewName));
end;
// 重命名文件夹
// RenameFolder('C:\1\','2');
// MoveFile('C:\1','C:\2');
// MoveFile('C:\1\','C:\2\');
function RenameFolder(filePath: string; Title: string): Boolean;
var
s, s1: string;
begin
// filePath:='C:\Windows\System32\';
// s = ExtractFileDir(filepath) = 'C:\Windows\System32'
s := ExtractFileDir(filePath);
// s1 = ExtractFileDir(s) = 'C:\Windows'
// s1 ='C:\Windows' +'\'+ titles
s1 := ExtractFileDir(s) + '\' + Title;
Result := MoveFile(PChar(s), PChar(s1));
end;
{
IOUtils
}
function RemoveDirs(folderPath: string): Boolean;
begin
Result := False;
if TDirectory.IsEmpty(folderPath) then
begin
TDirectory.Delete(folderPath);
Result := True;
end
else
begin
if Application.MessageBox('确定要删除这个文件夹吗? 删除后无法恢复!', '提示',
MB_ICONQUESTION + MB_YESNO) = ID_YES then
begin
TDirectory.Delete(folderPath, True);
Result := True;
end;
end;
// if TDirectory.Exists(folderPath) then
// begin
// Application.MessageBox('删除文件失败'+#13#10+'文件正确被使用?','错误',MB_ICONERROR+MB_OK);
// Result:=False;
// end;
end;
{
if not ItemExist('Edit1.Text',TreeView1) then
TreeView1.Items.AddChild(Treeview1.Selected,'Edit1.Text');
}
function ItemExist(Text: string; TreeView: TTreeView): Boolean;
var
i: Integer;
begin
Result := False;
if (Trim(Text) '') then
begin
for i := 0 to TreeView.Items.Count - 1 do
if Trim(Text) = Trim(TreeView.Items[i].Text) then
begin
Result := True;
Exit;
end;
end;
Result := False;
end;
// ------------------------------------------------------------------------------
{ TreeView获得选中的完整路径
aaaa\ssss\bbbb
}
function ExtractNodeFullPath(TreeView: TTreeView): string;
var
Path: string;
Parent: TTreeNode;
// Node: TTreeNode;
begin
Path := TreeView.Selected.Text;
Parent := TreeView.Selected.Parent;
while Parent nil do
begin
Path := Parent.Text + '\' + Path;
Parent := Parent.Parent;
end;
Result := Path;
end;
function Get_node_path(node: TTreeNode): string;
var
Path: string;
TreeNode: TTreeNode;
begin
Path := node.Text;
TreeNode := node.Parent;
while TreeNode nil do
begin
Path := TreeNode.Text + '\' + Path;
TreeNode := TreeNode.Parent;
end;
Result := Path;
end;
{
获得文件完整路径
C:\abc\int.cpp
}
function ExtractTreeViewFileName(RootPath: string; TreeView: TTreeView): string;
var
FileName: string;
begin
Result := '';
if TreeView.Selected = nil then
Exit;
FileName := RootPath + ExtractNodeFullPath(TreeView); // 当前选中的文件名
if not FileExists(FileName) then
Exit;
Result := FileName;
end;
{ 用RICHEDIT打开TREEVIEW中的文件 }
function OpenFile(Path: string; RichEdit: TRichEdit; TreeView: TTreeView)
: Boolean; overload;
var
FileName: string;
begin
Result := False;
FileName := ExtractTreeViewFileName(Path, TreeView);
if FileExists(FileName) then
begin
RichEdit.Lines.LoadFromFile(FileName);
Result := True;
end
end;
function OpenFile(Path: string; Webbrowser: TWebbrowser; TreeView: TTreeView)
: Boolean; overload;
var
FileName: string;
begin
Result := False;
FileName := ExtractTreeViewFileName(Path, TreeView);
if FileExists(FileName) then
begin
Webbrowser.Navigate(FileName);
Result := True;
end
end;
{ 将1个目录里面所有的文件添加到TREEVIEW中
GetDirectories(TreeView1, 'D:\DATA', nil, True);
}
procedure GetDirectories(Tree: TTreeView; Directory: string; Item: TTreeNode;
IncludeFiles: Boolean);
var
SearchRec: TSearchRec;
ItemTemp: TTreeNode;
begin
Tree.Items.BeginUpdate;
if Directory[Length(Directory)] '\' then
Directory := Directory + '\';
if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then
begin
repeat
if (SearchRec.Attr and faDirectory = faDirectory) and
(SearchRec.Name[1] '.') then
begin
if (SearchRec.Attr and faDirectory > 0) then
Item := Tree.Items.AddChild(Item, SearchRec.Name);
ItemTemp := Item.Parent;
GetDirectories(Tree, Directory + SearchRec.Name, Item,
IncludeFiles);
Item := ItemTemp;
end
else if IncludeFiles then
if SearchRec.Name[1] '.' then
Tree.Items.AddChild(Item, SearchRec.Name);
until FindNext(SearchRec) 0;
FindClose(SearchRec);
Tree.Items.EndUpdate;
end;
end;
{
将1个目录里面所有的文件添加到TREEVIEW中
DirToTreeView(TreeView1,'D:\Data\',nil,True,'.cpp');
}
procedure DirToTreeView(Tree: TTreeView; Directory: string; Root: TTreeNode;
IncludeFiles: Boolean; FileExt: string);
var
SearchRec: TSearchRec;
Node1: TTreeNode;
begin
with Tree.Items do
begin
BeginUpdate;
if Directory[Length(Directory)] '\' then
Directory := Directory + '\';
if FindFirst(Directory + '*.*', faDirectory, SearchRec) = 0 then
begin
Application.ProcessMessages;
repeat
{ 添加文件夹 }
if (SearchRec.Attr and faDirectory = faDirectory) and
(SearchRec.Name[1] '.') then
begin
if SameText(RightStr(SearchRec.Name, 12), '_AttachMents') then
// 不添加 _AttachMents这个文件夹
Continue;
if (SearchRec.Attr and faDirectory > 0) then
Root := AddChild(Root, SearchRec.Name);
Node1 := Root.Parent;
DirToTreeView(Tree, Directory + SearchRec.Name, Root,
IncludeFiles, FileExt);
Root := Node1;
end
else if IncludeFiles then { 添加文件 }
if SearchRec.Name[1] '.' then
{ .TXT .txt .TxT .tXT 为一样的 }
if SameText(RightStr(SearchRec.Name, 4), FileExt)
then { 只添加 .CPP格式文件 }
AddChild(Root, SearchRec.Name);
until FindNext(SearchRec) 0;
FindClose(SearchRec)
end;
EndUpdate;
end;
end;
end.