Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамическое создание разделов меню


Fenix ©   (2006-03-09 19:01:00) 

Доброе время суток.
У меня возникла маленькая проблемка.
Мне надо создать динамически пункты меню, но и еще обработчик onClick. У меня для всех меню будет одинаковый обработчик onClick, только меняться будет передоваемый параметр...
LoadForm(<Передоваемый параметр>);
Подскажите пожалуйчта как можно реализовать динамическое создание обработчика событий....


Fenix   (2006-03-09 22:08:00) [1]

нет :) мне нужно было только как создать динамически пункт меню :). Больше кода мне не надо)


TStas   (2006-03-09 22:05:00) [2]

>Fenix  Т. е. кода не надо еще?


Fenix   (2006-03-09 22:02:00) [3]

уже разобрался :) огромное спс за предоставленный код))


TStas   (2006-03-09 21:59:00) [4]

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


Fenix   (2006-03-09 21:40:00) [5]


> TStas ©

Мне надо было только динамическое создание меню... Обработчик я напишу гораздо проще для меня.
Я сейчас разрабатываю программу HTML Editor. В меню будет что вроде:
Добавить -> <A>,<table>,<form> и тд... (ну это образно конечно). И мне надо описать эти формы отдельно (пока использую ДЛЛ). А в меню добавляю пункты и по нажатию на пункт будет вызываться функция, которая откроет нужную ДЛЛ и загрузит от туда нужную мне форму... Просто мне нужно что бы эти формы были не в самом коде программы, вот и развлекаюсь щас с ДЛЛ :)


Fenix   (2006-03-09 21:31:00) [6]


> GaussPopupMenu.Items.Add(mi);

Это мне и было нужно))) а то я создавал пункт, но ни к чему его не прикреплял. Спс за код программы.


TStas   (2006-03-09 21:31:00) [7]

Вот для REopen Menu

n:=(Sender as TMenuITem).Tag// КТэг кликнутого пункта
path:=REopenList[n]//Это список полных путей доступа к файлам, на самой менюшке написано лишь имя файла
OpenFile(path)//Процедура, открывающая нужный файл, она все что надо делает.
Если не секрет, напишите, что за задача такая.


TStas   (2006-03-09 21:15:00) [8]

procedure TForm1.FillHiPopupMenu;
var
 i, n1: Integer;
 list: TStringList;
 mi: TMenuItem; //Создаваемый пункцкт меню
 path: String;
 s1, s2: String;
begin
path:=ExtractFilePath(Application.ExeName)+'sorce\Characters.txt';
if not FileExists(path) then
 begin
 ShowErrorMsg('Ïðîïàë ôàéë ñ ïðîöåäóðàìè Õè', 'Disappeared file of charatters procedures');
 exit;
 end;

list:=TStringList.Create;
list.LoadFromFile(path);

for i:=0 to list.Count-1 do
 begin
 s1:=list[i];
 s2:=AnsiLowerCase(s1);
 if Pos('procedure', s2)=0 then continue;
 s1:=StringReplace(s1, ' ', '', [rfReplaceAll]);
 Delete(s1, 1, Length('procedure'));
 n1:=Pos('(', s1);
 s1:=Copy(s1, 1, n1-1);
 mi:=TMenuItem.Create(HiPopupMenu);
 mi.Caption:=s1;
 mi.OnClick:=HiPopupClick; //Заранее написанный обработчик, обычный TNotifyEvent
 HiPopupMenu.Items.Add(mi);
 mi.Tag:=i; //Вот по тэгу и буду различать пунккты

 mi:=TMenuItem.Create(GaussPopupMenu);
 mi.Caption:=s1;
 mi.OnClick:=GaussPopupClick;
 GaussPopupMenu.Items.Add(mi); //Точно также можно и к любым пунктам добавлять, тогда получится ветвящаяся древовидная менюшка
 end;

list.Free;
end;

Может, я вопрос не понял? Просто же все? Что значит динамически? Разные обработчики щелчков, что ли?
Могу пример повесить, где при открытии файла реопен меню расширяется, то есть в него новые пункты с новыми обработчиками добавляются. т. е.  менюшки, точнее пункты добавляются. Если нужны "динамические", т. е. наверно, разные обработчики, так обработчик - это просто свойство типа TNotifyEvent. Напиши заранее хоть 1000  и меняй по вкусу.

Зачем код создавать динамически? Например, в менюшке, где новые пункты добавляются при открытии новых файлов все просто:
Живет в програвмме TStringList с полными адресами, а к менюшкам добавляются пункты, у которых тэг как раз и равер номеру, т. е. адресу. Сложно очень задачу придусать, гдебы требовалась компиляция налету.


Fenix   (2006-03-09 21:11:00) [9]

ладно допустим так...
var TagMenu:TmenuItem;

как мне сдалть что бы он был подменю в а главном меню (n7) ?


Sergey Masloff   (2006-03-09 20:52:00) [10]

Я этот код с массивом не понимаю. Любое меню содержит список своих подменю и зачем дополнительные структуры данных для их хранения - я не понимаю. А если не понимаю то и сказать нечего...


Fenix   (2006-03-09 20:24:00) [11]

var TagMenu: array [1..100] of TmenuItem;
...
TagMenu[1]:=TMenuItem.Create(n7);
TagMenu[1].Caption:='asdf';
TagMenu[1].Visible:=true;
...
Но подменю не созадеться.... в чем может быть ошибка? или динамически пункт подменю создаеться не таким способом?


Sergey Masloff   (2006-03-09 20:05:00) [12]

Fenix ©   (09.03.06 20:01) [4]
1) Говорю ж динамически нельзя
2) Почему для N1? Ну имя у него такое. Его можно подцепить хоть к 1000 разных итемов и он со всеми правильно будет работать. И по фиг динамически эти итемы создавались или нет - код универсален.


Fenix   (2006-03-09 20:01:00) [13]


> procedure TForm1.N1Click(Sender: TObject);

у меня будут имена у моих пунктов меню n1,n2,......n10. А у тебя написан код для N1. Притом он создан статически... а мне надо бы динамически.


Sergey Masloff   (2006-03-09 19:57:00) [14]

Ну типа один обработчик


procedure TForm1.N1Click(Sender: TObject);
begin
 if (Sender is TMenuItem) then
   LoadFrom((Sender as TMenuItem).Caption);
end;


Fenix   (2006-03-09 19:43:00) [15]

Смотри допустим у меня будет создано (динамически)
.....
N1:TMenuItem;
N2:TMenuItem;
.....
потом мне надо что бы были созданы обработчики:

procedure TForm1.N1Click(Sender: TObject);
begin
LoadForm(n1.caption);
end;

procedure TForm1.N2Click(Sender: TObject);
begin
LoadForm(n2.caption);
end;

И тд....
Конечно можно попробовать сделать это через массив:
n: array [1..100] of TMenuItem;
и потмо уже работать с ним как с массивом.... но хочу узнать может есть более обдуманный шаг....


Sergey Masloff   (2006-03-09 19:23:00) [16]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо