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

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

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

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

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

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

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

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

Logo
Рис 2. Окно настройки меню

Теперь создадим дополнительные менюшки меню. Выдели созданное тобой меню Файл , щёлкни по нему правой кнопкой мыши и выбери в появившемся меню пункт 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. Тогда кнопки будут выглядить как настоящие меню.

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

 Исходники примера забирай здесь



Опубликовал admin
9 Май, Пятница 2003г.



Программирование для чайников.