Implementation. uses ShellApi; // Используется при получении пиктограмм для файлов s списке

{$R *.DFM)

uses
ShellApi; // Используется при получении пиктограмм для файлов s списке

procedure TFileViewerForm.FormCreate(Sender: TObject};
begin // Прочитать список доступных дисков
UpdateTree;
end;

procedure TFileViewerForm.UpdateTree;
var c: char; Root, N: TTreeNode; S: Int64;
begin // Очистить дерево и прочитать список доступныч дисков
TreeView.Items.BeginUpdate; // Запретить перерисовку дерева в процессе его изменения
try
TreeView.Items.Clear; // Очистить дерево
Root.Data:= Pointer(1);
Root.ImgeIndex:=0;
Root.SelectedIndex:=0;
for c:='C' to 'Z' do
begin
S:=DiskSize(byte(c)-byte('A')+1);
if S>=0 then // Если диск доступен, то размер всегда неотрицательный
begin
N:=TreeView.Items.AcidChild (Root,C+':');
N.ImageIndex:=1;
N.SelectedIndex:=1;
N.HasChildren;=True; // вставить значок "+" слева от вершины дерева
end;
end;
RootExpanded:=True; // Раскрыть дерево
finally
TreeView.Items.EndUpdate; // Обновление дерева закончено, его можно перерисовать
end;
end;

procedure TFileViewerForm.TreeViewCollapsing(Sender: TObject;
Node; TTreeNode; var AllowCollapse: Boolean);
begin // Разрешить сворачивание всех вершин, кроме первой
AliowCollapse:=Node.Level>0;
end;

function TFileViewerForm.GetNodeFolder(N: TTreeNode): string;
begin // Получить текущий каталог в дереве
Result:='';
while (N<>nil) and (N.Level>0) do
begin
if Result<>'' then Result: = '\'+Result;
Result:=N.Text+Result;
N:=N.Parent; // Перейти от текущей вершины к родительской
end;
end;

procedure TFileViewerForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
var s:string; sr: TSearchRec; Icon: IIcon;
procedure AddFile;
var LI: TListltem; w: word;
begin // Добавить в список файл
LI:=ListView.Items.Add;
LI.Caption:=sr.Name;
LI.Subltems.Add(IntToStr(sr.Size));
LI.Subltems.Add(DateTimeeToStr(FileDateToDateTime(sr.Time)));
Icon.Handle:=ExtractAssociatedIcon (HInstance, PChar(s+'\'+sr.Name), w);
LI.ImageIndex:=ListImageList.AddIcon(Icon);
if GetAsyncKeyState(VK_ESCAPE)<0 then // Если нажата клавиш Esc, то прервать чтение
Abort;
end;
begin // Прочитать список элементов в текущем каталоге
StatusBar.SimpleTeчt:=GetNodeFolder(Treeview.Selected);
ListView.Items.BeginUpdate; // Запретить перерисовку списка в процессе его изменения
try
ListView.Items.Clear; // очистить список
Memo.Lines.Clear; // Очистить зону загруженного файла
ListImageList.Clear; // Очистить список пиктограмм
s:=GetNodeFolder(Node);
if (s<>'') and (FindFirst(s+'\*.*',0,sr)=0) then
try
try
Icon:=TIcon.Create; // Создать пиктограмму для временного использования
try
AddFile;
While FindNextsr)=0 do
AddFile;
finally
Icon.Free; // Удалить временную пиктограмму
end;
finally
FindClose(sr);
end;
except
end;
finally
ListView.Items.EndUpdate; // Обновление списка закончено, его можно перерисовать
end;
end;

procedure TFileViewerForm.TreeViewExpanding (Sender: TObject;
Node: TTreeNode; var AllowExpansion: Boolean);
var S: string; sr: TSearchRec;
procedure AddFolder (AText: string);
var N:TTreeNode;
begin
if (sr.Attr and faDirectory<>O) and (AText<>'.') and (AText<>'..') then
begin
N:=TreeView.Items.AddChild(Node, AText);
N.ImageIndex:=2;
N.SelectedIndex:=3;
N.HasChildren:=True;
end;
if GetAsyncKeyState(VK_ESCAPE)<0 then // Если нажата клавиша Esc, то прервать чтение
Abort;
end;
begin
if Node.HasChildren and (Node.Count=0) then
try / / Раскрытие еще не прочитанной папки
s:=GetNodeFolder(Node);
if (s<>'') and (FindFirst(s+'\*.*',faDirectory, sr)=0) then
begin
try
AddFolder(sr.Name);
while FindNext(sr)=0 do
AddFolder(sr.Name);
finally
FindClose(sr);
end;
end;
Node.HasChildren:=Node.Count>0;
Node.AlphaSort; // Сортировка элементов по алфавиту
except // При ошибке чтения (нaпример, нет прав доступа к каталогу) стереть подэлементы
Node.DeleteChildren;
Node.HasChildren:=True;
raise;
end;
end;

procedure TFileViewerForm.ListViewClick(Sender: TObject);
begin // Загрузить выбранный в списке файл
Memo.Lines.Clear;
if ListView.Selected<>nil then
try
Memo.Lines.LoadFromFile(GetNodeFolder(TreeView.Selected) + '\' + ListView.Selected.Caption);
except
end;
end;

procedure TFileViewerForm.ActionRefreshEsecute(Sender: TObject);
begin // Обновить дерево (перечитать заново)
UpdateTree;
end;

procedure TFileViewerForm.ActioxExpandAllExecute(Sender: TObject);
begin // Развернуть все дерево
TreeМiew.Items.BeginГpdate; // Запретить перерисовку деhева в процессе его изменения
try
Screen.Cursor:=crHourGlass; // Сделать курсор в виде песочных часов
try
TreeView.FullExpand; // Раскрыть все дерево
finally
Screen.Cursor:=crDefault; // Восстановить курcop
end;
b>finally
TreeView.Items.EndUpdate; // Обновление дерева закончено, его можно перерисовать
end;
end;

procedure TFiieViewerForm.ActionExitExecute(Sender: TObject);
begin // Выход из програмы
Close;
end;

procedure TFileViewerForm.ActionAboutExecute (Sender: TObject);
begin // Краткая инфсрмация о пpoграмме
ShowMessage ('Программа просмотра файлов'#13'Авторское граво (с) 2000 А.В. Скворцов');
end;

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: