Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

// Определение логических дисков

if Find_Logical_Disks() then

begin

SetAllDirectories;

SetDirWin:= true;

end

else

{Если произошла ошибка в функции Find_Logical_Disks(),

то выбираем корневой каталог текущего диска}

SetCurrentDir('\');

{$ELSE}

SetCurrentDir('/'); // корневой каталог в Linux {$ENDIF}

if not SetDirWin then begin

path:= GetCurrentDir;

if FindFirst(path + '*', faDirectory, srNode) = 0 then

begin repeat

// Показываем только каталоги

if (srNode.Attr and faDirectory <> 0) and (Real_Directory(srNode.Name)) then begin

Node:= TreeView1.Items.AddChild(nil,

SysToUTF8(srNode.Name));

Node.ImageIndex:= 0;

Node.SelectedIndex:= 0;

{$IFDEF WINDOWS}

671

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

searchMask:= path + srNode.Name + '\*'; {$ELSE}

searchMask:= path + srNode.Name + '/*'; {$ENDIF}

if FindFirst(searchMask, faDirectory, srChild) = 0 then

repeat

if (srChild.Attr and faDirectory <> 0) and Real_Directory(srChild.Name)

then Node.HasChildren:= true; until (FindNext(srChild) <> 0) or Node.HasChildren;

// Освобождение занятых ресурсов

SysUtils.FindClose(srChild);

end;

until FindNext(srNode) <> 0;

// Освобождение занятых ресурсов

SysUtils.FindClose(srNode);

end;

end;

TreeView1.EndUpdate;

end;

procedure TForm1.Show_Only_Dir(ParentNode: TTreeNode); var

srNode, srChild: TSearchRec; Node: TTreeNode;

path: string; searchMask: string;

672

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

begin

Node:= ParentNode; path:= '';

repeat

{$IFDEF WINDOWS}

path:= UTF8ToSys(Node.Text) + '\' + path; {$ELSE}

path:= '/' + Node.Text + '/' + path; {$ENDIF}

Node:= Node.Parent; until Node = nil;

if FindFirst(path + '*', faDirectory, srNode) = 0 then repeat

if (srNode.Attr and faDirectory <> 0) and Real_Directory(srNode.Name) then

begin

Node:= TreeView1.Items.AddChild(ParentNode,

SysToUTF8(srNode.Name));

Node.ImageIndex:= 0;

Node.SelectedIndex:= 0;

{$IFDEF WINDOWS}

searchMask:= path + srNode.Name + '\*'; {$ELSE}

searchMask:= path + srNode.Name + '/*'; {$ENDIF}

if FindFirst(searchMask, faDirectory, srChild) = 0 then

repeat

if (srChild.Attr and faDirectory <> 0) and

673

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

Real_Directory(srChild.Name) then Node.HasChildren:= true;

until (FindNext(srChild) <> 0) or Node.HasChildren; SysUtils.FindClose(srChild);

end;

until FindNext(srNode) <> 0; SysUtils.FindClose(srNode);

end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);

begin

if Node = nil then exit; TreeView1.BeginUpdate; Node.DeleteChildren; Show_Only_Dir(Node); Node.Expanded:= true; TreeView1.EndUpdate;

end;

procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;

var AllowExpansion: Boolean); begin

TreeView1.BeginUpdate;

Node.DeleteChildren;

Show_Only_Dir(Node);

TreeView1.EndUpdate;

end; initialization

674

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

{$I unit1.lrs}

end.

Рассмотрим процедуру FormCreate. В ней, если это Windows, с помо-

щью функции Find_Logical_Disks() и процедуры

SetAllDirectories определяются имена разделов жестких дисков и выво-

дятся в TreeView1. Окно программы для Windows будет иметь вид, рис. 6.76:

Рис. 6.76. Вид окна программы в Windows

В Linux файловая система организована совсем по-другому. Поэтому мы оператором SetCurrentDir('/');

устанавливаем корневой каталог и программа сканирует каталоги только верх-

него уровня, рис. 6.77.

675

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773