Текущий архив: 2006.04.09;
Скачать: CL | DM;
ВнизДинамическое создание разделов меню Найти похожие ветки
← →
Fenix © (2006-03-09 19:01) [0]Доброе время суток.
У меня возникла маленькая проблемка.
Мне надо создать динамически пункты меню, но и еще обработчик onClick. У меня для всех меню будет одинаковый обработчик onClick, только меняться будет передоваемый параметр...
LoadForm(<Передоваемый параметр>);
Подскажите пожалуйчта как можно реализовать динамическое создание обработчика событий....
← →
Sergey Masloff (2006-03-09 19:23) [1]Динамически ты обработчик не создашь. Если не извращаться с каким-нибудь скриптовым енджайном. Тем более что обработчик один как ты сам говоришь - вообще непонятно в чем вопрос.
← →
Fenix © (2006-03-09 19:43) [2]Смотри допустим у меня будет создано (динамически)
.....
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:57) [3]Ну типа один обработчик
procedure TForm1.N1Click(Sender: TObject);
begin
if (Sender is TMenuItem) then
LoadFrom((Sender as TMenuItem).Caption);
end;
← →
Fenix © (2006-03-09 20:01) [4]
> procedure TForm1.N1Click(Sender: TObject);
у меня будут имена у моих пунктов меню n1,n2,......n10. А у тебя написан код для N1. Притом он создан статически... а мне надо бы динамически.
← →
Sergey Masloff (2006-03-09 20:05) [5]Fenix © (09.03.06 20:01) [4]
1) Говорю ж динамически нельзя
2) Почему для N1? Ну имя у него такое. Его можно подцепить хоть к 1000 разных итемов и он со всеми правильно будет работать. И по фиг динамически эти итемы создавались или нет - код универсален.
← →
Fenix © (2006-03-09 20:24) [6]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:52) [7]Я этот код с массивом не понимаю. Любое меню содержит список своих подменю и зачем дополнительные структуры данных для их хранения - я не понимаю. А если не понимаю то и сказать нечего...
← →
Fenix © (2006-03-09 21:11) [8]ладно допустим так...
var TagMenu:TmenuItem;
как мне сдалть что бы он был подменю в а главном меню (n7) ?
← →
TStas © (2006-03-09 21:15) [9]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:31) [10]
> GaussPopupMenu.Items.Add(mi);
Это мне и было нужно))) а то я создавал пункт, но ни к чему его не прикреплял. Спс за код программы.
← →
TStas © (2006-03-09 21:31) [11]Вот для REopen Menu
n:=(Sender as TMenuITem).Tag// КТэг кликнутого пункта
path:=REopenList[n]//Это список полных путей доступа к файлам, на самой менюшке написано лишь имя файла
OpenFile(path)//Процедура, открывающая нужный файл, она все что надо делает.
Если не секрет, напишите, что за задача такая.
← →
Fenix © (2006-03-09 21:40) [12]
> TStas ©
Мне надо было только динамическое создание меню... Обработчик я напишу гораздо проще для меня.
Я сейчас разрабатываю программу HTML Editor. В меню будет что вроде:
Добавить -> <A>,<table>,<form> и тд... (ну это образно конечно). И мне надо описать эти формы отдельно (пока использую ДЛЛ). А в меню добавляю пункты и по нажатию на пункт будет вызываться функция, которая откроет нужную ДЛЛ и загрузит от туда нужную мне форму... Просто мне нужно что бы эти формы были не в самом коде программы, вот и развлекаюсь щас с ДЛЛ :)
← →
TStas © (2006-03-09 21:59) [13]Так написал же как к нужному пункту добавить пунтк. Сначала создаешь пункт полностью, а потом его готовый добавляешь.
← →
Fenix © (2006-03-09 22:02) [14]уже разобрался :) огромное спс за предоставленный код))
← →
TStas © (2006-03-09 22:05) [15]>Fenix Т. е. кода не надо еще?
← →
Fenix © (2006-03-09 22:08) [16]нет :) мне нужно было только как создать динамически пункт меню :). Больше кода мне не надо)
Страницы: 1 вся ветка
Текущий архив: 2006.04.09;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.011 c