![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание разделов меню
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]Динамически ты обработчик не создашь. Если не извращаться с каким-нибудь скриптовым енджайном. Тем более что обработчик один как ты сам говоришь - вообще непонятно в чем вопрос.