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

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

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

____________________________________________________________________

тырех символов.

Найденные имена логических дисков мы сохраняем в Memo1, причем мы вырезали два последних символа (обратный слеш и #0). Можно, конечно, ис-

пользовать массив строк. Но, поскольку количество установленных на том или ином компьютере жестких дисков и созданных в них разделов нам неизвестно,

пришлось бы использовать динамический массив. И, к тому же, пришлось бы этот массив передавать в другие функции и процедуры. Поэтому проще ис-

пользовать Memo1, ведь по сути это и есть динамический массив строк! Просто в программе мы его не будем показывать, установив свойство Visible в false.

С помощью следующей процедуры мы записываем в TTreeView содер-

жимое Memo1.

procedure TForm1.SetAllDirectories; var

i: integer; Node: TTreeNode;

begin TreeView1.BeginUpdate;

for i:= 0 to Memo1.Lines.Count - 1 do begin

Node= TreeView1.Items.AddChild(nil, Memo1.Lines[i]);

Node.ImageIndex:= 0;

Node.SelectedIndex:= 0;

Node.HasChildren:= true;

end;

TreeView1.EndUpdate;

end;

666

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

____________________________________________________________________

Обратите внимание, если вы заносите в TTreeView несколько элементов (уз-

лов), то может возникнуть неприятное мерцание экрана. Поэтому мы использо-

вали TreeView1.BeginUpdate перед началом записи узлов и

TreeView1.EndUpdate после завершения записи.

Далее мы указали, что узел имеет дочерние подузлы оператором

Node.HasChildren:= true;

В этом случае рядом узлом появится значок раскрытия узла. Ну, что же,

теперь мы можем реализовать задачу отображения дерева папок и каталогов в

TTreeView. Создайте новый проект. Поместите на форму компоненты

TTreeView, TMemo и TImageList. Код программы:

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, ComCtrls, StdCtrls

{$IFDEF WINDOWS}

,Windows {$ENDIF};

type

{ TForm1 }

TForm1 = class(TForm)

ImageList1: TImageList;

Memo1: TMemo;

TreeView1: TTreeView;

procedure FormCreate(Sender: TObject);

667

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

____________________________________________________________________

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

procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);

function Real_Directory(sname: string): boolean; procedure Show_Only_Dir(ParentNode: TTreeNode); {$IFDEF WINDOWS}

function Find_Logical_Disks(): boolean; procedure SetAllDirectories;

{$ENDIF} private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; implementation { TForm1 }

function TForm1.Real_Directory(sname: string): boolean; begin

result:= (sname <> '.') and (sname <> '..'); end;

{$IFDEF WINDOWS}

// Эти функции нужны только для Windows

function TForm1.Find_Logical_Disks(): boolean; const

668

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

____________________________________________________________________

Hard_Disk = 3; // рассматриваем только жесткие диски var

size: LongWord;

Drives: array[0..128] of char; pDrive: PChar;

s: string; begin

size:= GetLogicalDriveStrings(SizeOf(Drives), Drives); if size = 0 then

begin

Result:= false; exit;

end;

if size > SizeOf(Drives) then

raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY));

pDrive:= Drives; // устанавливаем указатель на Drives while pDrive^ <> #0 do

begin

// если тип устройства жесткий диск

if GetDriveType(pDrive) = Hard_Disk then begin

s:= pDrive;

s:= Copy(s, 1, 2); // берем только имя раздела и двоеточие

Memo1.Lines.Add(s); // добавляем имя раздела в Memo1 end;

inc(pDrive, 4); end;

end;

669

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

____________________________________________________________________

procedure TForm1.SetAllDirectories; var

i: integer; Node: TTreeNode;

begin TreeView1.BeginUpdate;

for i:= 0 to Memo1.Lines.Count - 1 do begin

Node:= TreeView1.Items.AddChild(nil, Memo1.Lines[i]);

Node.ImageIndex:= 0;

Node.SelectedIndex:= 0;

Node.HasChildren:= true;

end;

TreeView1.EndUpdate;

end; {$ENDIF}

procedure TForm1.FormCreate(Sender: TObject); var

Node: TTreeNode;

srNode, srChild: TSearchRec; searchMask: string; SetDirWin: boolean = false;

begin Memo1.Clear;

Memo1.Visible:= false;

TreeView1.Images:= ImageList1;

TreeView1.ExpandSignType:= tvestPlusMinus;

TreeView1.BeginUpdate;

{$IFDEF WINDOWS}

670

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

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