Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
45
Добавлен:
27.04.2021
Размер:
6.3 Mб
Скачать

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

____________________________________________________________________

SysUtils.FindClose(srNode);

end;

end;

TreeView1.EndUpdate;

// установка свойств ListView1 with ListView1 do

begin

Align:= alClient;

ViewStyle:= vsReport;

Columns.Add;

Columns.Items[0].Width:= 425;

ScrollBars:= ssAutoBoth;

SmallImages:= ImageList1;

end;

end;

procedure TForm1.ShowExpandNode(ParentNode: TTreeNode; DirName: string; ShowMode: integer;

IsinTListView: boolean);

var

srNode, srChild: TSearchRec; Node: TTreeNode; SearchMode: LongInt; ListItem: TListItem; searchMask: string;

begin

if not IsinTListView then path:= GetPath(ParentNode)

else

711

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

____________________________________________________________________

begin

if ShowMode = 1 then begin

oldpath:= path; ListView1.Clear;

end;

path:= GetPath_1(DirName, oldpath); end;

if ShowMode = 2 then SearchMode:= faAnyFile

else

SearchMode:= faDirectory;

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

if ((srNode.Attr and faDirectory <> 0) and Real_Directory(srNode.Name)) or ((srNode.Attr and faDirectory = 0) and (ShowMode = 2)) then

begin

if ShowMode <> 2 then

if not IsinTListView then

Node:= TreeView1.Items.AddChild(ParentNode,

SysToUTF8(srNode.Name));

case ShowMode of 0: begin

Node.ImageIndex:= 0;

Node.SelectedIndex:= 0;

end; 1: begin

712

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

____________________________________________________________________

ListItem:= ListView1.Items.Add;

ListItem.Caption:= SysToUTF8(srNode.Name);

ListItem.ImageIndex:= 0

end;

2:if srNode.Attr and faDirectory = 0 then begin

if srNode.Attr and faHidden = 0 then begin

ListItem:= ListView1.Items.Add; ListItem.Caption:= SysToUTF8(srNode.Name);; ListItem.ImageIndex:= 1;

end;

end;

end;

if not IsinTListView then begin

{$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 Real_Directory(srChild.Name)

then Node.HasChildren:= true;

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

713

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

____________________________________________________________________

end;

end;

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

end;

procedure TForm1.ListView1DblClick(Sender: TObject); var

s: string; AProcess: TProcess; srNode: TSearchRec; DirName: string;

IsinTListView: boolean; begin

if ListView1.Selected = nil then exit; {$IFDEF WINDOWS}

s:= path + UTF8ToSys(ListView1.Selected.Caption); {$ELSE}

s:= path + ListView1.Selected.Caption; {$ENDIF}

if FindFirst(s, faAnyFile, srNode) = 0 then if (srNode.Attr and faDirectory) <> 0 then begin

DirName:= ListView1.Selected.Caption;

IsinTListView:= true;

ShowExpandNode(nil, DirName, 1, IsinTListView);

ShowExpandNode(nil, DirName, 2, IsinTListView);

SysUtils.FindClose(srNode);

exit;

714

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

____________________________________________________________________

end;

if (srNode.Attr and faHidden) = 0 then begin

AProcess:= TProcess.Create(nil);

{$IFDEF UNIX}

if MessageDlg('Открывать в терминале?', mtCustom, [mbYes, mbNO], 0) = mrYes then

s:= 'xterm -T ''Lazarus Run Output''' + ' -e $(TargetCmdLine)' + s;

{$ENDIF} AProcess.CommandLine:= s; AProcess.Execute; AProcess.Free;

end;

end;

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

var

IsinTListView: boolean; begin

if Node = nil then exit; TreeView1.BeginUpdate; ListView1.BeginUpdate; ListView1.Clear; Node.DeleteChildren; IsinTListView:= false;

ShowExpandNode(Node, '', 1, IsinTListView); ShowExpandNode(Node, '', 2, IsinTListView); Node.Expanded:= true;

715

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

____________________________________________________________________

ListView1.EndUpdate;

TreeView1.EndUpdate;

end;

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

var

IsinTListView: boolean; begin

TreeView1.Items.BeginUpdate;

Node.DeleteChildren;

IsinTListView:= false;

ShowExpandNode(Node, '', 0, IsinTListView);

TreeView1.Items.EndUpdate;

end; initialization

{$I unit1.lrs} end.

Дальнейшее наполнение функциональностью нашего Проводника предос-

тавляю вам, уважаемый читатель. В частности, попробуйте сделать следующее

– при двойном клике на какой-нибудь файл необходимо запустить связанное с этим файлом приложение. Например, при двойном щелчке на файл *.doc дол-

жен запускаться текстовый редактор Word и в нем открываться этот файл.

Ну и все те функции, которыми должен обладать любой файловый менед-

жер, т.е. реализовать операции копирования, перемещения и удаления файлов и каталогов и пр.

Можете "замахнуться" на создание файлового менеджера типа

TotalCommander, Krusader или Double Commander (который, кстати, раз-

716

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

____________________________________________________________________

рабатывается на Lazarus). Дело не в том, что вы будете "изобретать велосипед".

Это будет отличнейшей тренировкой для вас!

А я, с вашего позволения, перейду к рассмотрению других вопросов.

6.3.11 Организация меню. Механизм действий - Actions

6.3.11.1. Компонент TMainMenu

Рассмотрим способы создания и организации меню. В меню пользователь выбирает не данные, а возможные действия. Таким образом, меню это специ-

альный механизм, позволяющий пользователю внутри вашего приложения вы-

брать какие-то действия, например, открыть файл, сохранить файл, установить какие-то параметры и т.д.

Для создания главного меню используется компонент TMainMenu (вклад-

ка Standard). Компонент не визуальный. Пункты меню содержатся в свойст-

ве Items. Чтобы начать формирование пунктов меню достаточно дважды щелкнуть по компоненту на форме или нажать на кнопку с многоточием в свойстве Items компонента в инспекторе объектов. Откроется специальный редактор меню, рис. 6.82.

Рис. 6.82. Редактор меню

717

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

____________________________________________________________________

В инспекторе объектов в свойство Caption введите имя пункта меню.

Чтобы создать следующий пункт меню или подменю, установите курсор на те-

кущий элемент меню и нажмите на правую клавишу мыши, рис. 6.83. Выберите нужное действие, например, для создания подменю нажмите "Создать подме-

ню", рис. 6.84.

Рис. 6.83. Контекстное меню редактора

Рис. 6.84. Пример создания подменю

Lazarus предоставляет возможность при создании меню применить шабло-

ны меню. Имеется три стандартных шаблона для меню "Файл", "Правка" и "Справка", рис. 6.85.

718

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

____________________________________________________________________

Рис. 6.85. Шаблоны меню

При создании меню имеется возможность вставки рядом с текстом пункта меню пиктограммы. Для этого поместите на форму компонент

TImageList, заполните его соответствующими рисунками. Затем в

TMainMenu в свойстве Images укажите имя TImageList в программе. А

при создании подпункта меню в свойстве ImageIndex укажите индекс соот-

ветствующего изображения.

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

Для этого служит свойство Shortcut. Вы можете прямо ввести нужное соче-

тание клавиш в поле ввода этого свойства или нажав на кнопку с многоточием,

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

виш, рис. 6.86.

Рис. 6.86. Установка сочетаний клавиш

Для создания разделительной линии между пунктами меню достаточно

719

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

____________________________________________________________________

создать новый элемент и в свойство Caption ввести знак "-".

Попробуйте реализовать пункт меню "Файл" Lazarus. Рисунки вы можете найти в папке установки Lazarus (подпапка Images), рис. 6.87.

Рис. 6.87. Пример создания меню

При этом вместо безликих имен пунктов меню (в программе) типа MenuItem1, MenuItem2 и т.д. желательно присваивать им осмысленные имена, на-

пример MCreateModule, MCreateForm.

Для того чтобы реализовать действие пункта меню необходимо написать соответствующий обработчик события OnClick. Находясь в редакторе меню,

достаточно просто дважды щелкнуть по этому пункту.

Еще с первой главы за мной тянется один должок. В 1.3.3. мы с вами рас-

сматривали метод наименьших квадратов, а программу мы так и не написали.

Но, как говорится, всему свое время. И вот это время наступило. Приступим к

720