Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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("&#207;&#240;&#238;&#239;&#224;&#235; &#244;&#224;&#233;&#235; &#241; &#239;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&#224;&#236;&#232; &#213;&#232;", "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.51 MB
Время: 0.042 c
15-1142921086
Ega23
2006-03-21 09:04
2006.04.09
С Днём рождения! 21 марта


2-1143465999
worldmen
2006-03-27 17:26
2006.04.09
Как использовать Table.Filter


15-1142406663
Cash
2006-03-15 10:11
2006.04.09
WiFi рулит или не рулит?


9-1126292049
Ford
2005-09-09 22:54
2006.04.09
RPG


2-1143032440
Физик
2006-03-22 16:00
2006.04.09
Как запритить звуковой карте воспроизводить звук