Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

Динамическое создание разделов меню   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1142790768
Kolan
2006-03-19 20:52
2006.04.09
Интернет через разетку. Кто - нибудь пробовал?


15-1142499130
Pa6oTa
2006-03-16 11:52
2006.04.09
!СРОЧНО! - небольшая БД, работа на 3дня.


4-1137766863
Atheist
2006-01-20 17:21
2006.04.09
WM_GETTEXT окну чужого процесса


15-1142787736
Predator
2006-03-19 20:02
2006.04.09
Как зарабатывать деньги в инете ?


4-1137674039
shalex
2006-01-19 15:33
2006.04.09
Как узнать установлены ли принтеры в системе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский