Воскресенье, 05.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нашли свой исходник?
Всего ответов: 94
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Разные » Пользовательский интерфейс

Эффективная работа с меню

Сегодня я покажу тебе, как создавать симпотичные менюшки и как работать с ними. А самое главное, ты научишся создавать пункты меню в рантайме, что просто необходимо при создании и использовании закладок в твоих прогах. Короче говоря, сегодняшний примерчик будет просто супер.

Давай создадим новый проект. Брось на форму ControlBar из закладки Additional. Установи его свойство Align в alTop .

Теперь брось на ControlBar1 два компонента ToolBar из закладки Win32, они появятся у тебя с именами ToolBar1 и ToolBar2. Установи у обоих такие свойства:

  • AutoSize=true
  • Дважды щёлкни по EdgeBorders и откроется список параметров оборки. Выставь ebTop в false.
  • Flat=true
  • List=true (только для ToolBar1)
  • ShowCaptions=true (только для ToolBar1)

Теперь брось на форму один компонент ImageList из закладки Win32. Дважды щёлкни по немуи добавь туда 4-е картинки (какие добавил я, смотри на рис 1). Картинки должны быть размером 16х16.

Едем далее. Брось на форму менюшку MainMenu из палитры Standart. Дважды щёлкни по ней, появится редактор меню с одним пустым элементом. Укажи его имя Caption равным, например, File и свойство Vasible=false. Появится два пустых элемента (справа, чтобы создать ещё одино выпадающее меню, и снизу, чтобы создать элемент выподающего меню). Поставб курсор на элемента снизу. Установи ему имя Caption=Файл и Name=FileMenu. Ещё ниже создай элемент с Caption=Правка и Name=EditMenu.

Теперь создадим дополнительные менюшки меню. Выдели созданное тобой меню Файл , щёлкни по нему правой кнопкой мыши и выбери в появившемся меню пункт Create Submenu . Создай там несколько пунктов (можешь как я, см рис 2). Главное, чтобы у тебя там был пункт с именем История и с именем Name=HistoryMenu.

У ToolBar1 создай две кнопки с параметрами Caption равными Файл и Правка . У первой кнопки свойство MenuItem выставь в FileMenu, чтобы связать кнопку с пунктом Файл . У второй кнопки установи это же свойство в EditMenu.

Теперь у ToolBar2 установи свойство Images в ImageList1 и создай на этой панели четыре кнопки (для этого щёлкни правой кнопкой по ToolBar2 и выбери пункт New Button . У тебя должно получится нечто похожее на рис 2.

Всё, косметический ремонт закончен, теперь приступаем к программированию. Чуть не забыл. Брось ешё на форму OpenDialog из закладки Dialogs.

Создадим обработчик события для пункта меню "Открыть":

procedure TForm1.OpenMenuClick(Sender: TObject);
begin
 // Выводим стандартное окно открытия файла
 if not OpenDialog1.Execute then exit; 
 // Если файл выбран, то добавить его в меню "История"
 AddLastFile(OpenDialog1.FileName);
end;

Когда пользователь щёлкнул по менюшке "Открыть". Функция AddLastFile добавляет новый элемент в список "История". Она объявлена в разделе private и выглядит как:

procedure TForm1.AddLastFile(Str: String);
var
 NewItem: TMenuItem;
 i:Integer;
begin
 //Проверяем, есть ли уже такой элемент в меню "История"
 //Если да, то выходим
 for i:=0 to HistoryMenu.Count-1 do
 if HistoryMenu.Items[i].Caption=Str then exit;

 //Создаём новый элемент
 NewItem := TMenuItem.Create(Self);
 //Устанавливаем для него заголовок
 NewItem.Caption:=Str;
 //Устанавливаю событие OnClick
 NewItem.OnClick:=LoadLastFile;
 //Добавляю в меню "История"
 HistoryMenu.Add(NewItem);

 //Если список в меню "История" уже больше 7, то удаляю первый элемент
 if HistoryMenu.Count>7 then
 HistoryMenu.Delete(0);
end;

По событию OnClick я устанавливаю обработчик создаваемого элемента LoadLastFile. Он объявлен в разделе private:

 private
 { Private declarations }
 procedure AddLastFile(Str:String);
 procedure LoadLastFile(Sender: TObject);
 public
 { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.LoadLastFile(Sender: TObject);
begin

end;

Эту функцию я оставлю пустой. Ты сам придумай, что в ней делать. Если у тебя это текстовый редактор, то прога должна уметь загрузить файлиз истории. Вот именно в этом обработчике это и надо делать. Это может выглядить так:

procedure TGiffer.LoadLastFile(Sender: TObject);
begin
 //Если файл существует, то открыть его
 if FileExists(TMenuItem(Sender).Caption) then
 DoOpenFile(TMenuItem(Sender).Caption)
 else
 //Иначе сообщение об ошибке
 Application.MessageBox('Файл уже удалён.','Error!',
 MB_OK + MB_ICONINFORMATION);
end;

Хочу тебя предупредить, что путь будет немного искорёжен. В параметре TMenuItem(Sender).Caption может содержатся, например, "E:\&Projects\Temp\VR\Project1.dof". Как видишь, в этой строке содержится ненужный знак &. Я с ним уже намучился очень много и автоматом он убирается не всегда. Лучше удаляй его в ручную:

 //Ищем, символ & в строке TMenuItem(Sender).Caption
 index:=pos('&', TMenuItem(Sender).Caption);
 //Удаляем один символ в строке TMenuItem(Sender).Caption
 //начиная с позиции index и всего 1 символ.
 Delete(TMenuItem(Sender).Caption,index,1);

По событию формы OnClose я сохраняю состояние истории:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
 FileList:TStrings;
 i:Integer;
begin
 //Создаю строковый список элементов
 FileList:=TStringList.Create;
 //Заполняю его
 for i:=0 to HistoryMenu.Count-1 do
 FileList.Add(HistoryMenu.Items[i].Caption);
 //Сохраняю в файл
 FileList.SaveToFile(ExtractFilePath(Application.ExeName)+'File.dat');
 //Удаляю список
 FileList.Free;
end;

По событию OnShow я загружаю элементы

procedure TForm1.FormShow(Sender: TObject);
var
 FileList:TStrings;
 i:Integer;
begin
 //Если файл существует, то вперёд!!!
 if FileExists(ExtractFilePath(Application.ExeName)+'File.dat') then
 begin
 //Создаю список элементов
 FileList:=TStringList.Create;
 //Загружаю историю
 FileList.LoadFromFile(ExtractFilePath(Application.ExeName)+'File.dat');
 //Добавляю элементы
 for i:=0 to FileList.Count-1 do
 AddLastFile(FileList.Strings[i]);
 //Очищаю список
 FileList.Free;
 end; 
end;

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

Вот и всё!!! Наша крутая менюшка готова.

Получить ссылку на материал

Категория: Пользовательский интерфейс | Добавил: Барон (08.12.2011)
Просмотров: 918 | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Delphi.NET [3]
Kylix Delphi for Linux [9]
Советы Дельферу [6]
Хитрости в Delphi [2]
Обзор Delphi [45]
Инсталлятор [11]
Пользовательский интерфейс [18]
Примеры Delphi [93]
Функции и процедуры [15]
Разные [31]
Королевство Delphi © 2010-2024
Яндекс цитирования