Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
e-v-i-l
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 7
1

Работа с MainMenu. Как обратиться к программно созданному элементу меню?

04.03.2015, 17:43. Просмотров 4083. Ответов 6
Метки нет (Все метки)

Привет всем.

задача следующая.
на стартовой форме есть MainMenu с уже кое-каким меню(скажем Файл, Настройки, Выход). обработку каждого пункта меню можно начать по событию OnClick. так же к каждому пункту можно обратиться напрямую, примеру N1.Caption:= ......

В процессе работы программы, добавляются новые пункты меню, вот так...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
  bd = record
  n1, n2, n3, n4, n5, n6: ShortString;
end;
var
  i: integer;
  Form1: TForm1;
  NameBD: bd;
  fR: file of bd;
  Mn: TMenuItem;
 
    while not EOF(fR) do begin                              
        Read(fR, NameBD);                                    
        Form3.ListBox1.Items.Add(NameBD.n1+'   '+NameBD.n2);
        Mn:=TMenuItem.Create(MainMenu1);
        Mn.Caption:=NameBD.n1;
        mainmenu1.Items[0].Add(Mn);
    end;
в общем все отлично... А вот теперь вопрос?
Подскажите, как обратиться к вновь созданным пунктам, как начать их обработку?(т.е. программа отработала, появились новые пункты, например в меню Файл появились подпункты 1,2,3. Человек хочет выбрать к примеру 2, как начать обработку по событию OnClick, 2го пункта меню?)
ведь я не знаю заранее какой объект(элемент) это будет N5, N6,... чтоб его начать обрабатывать по событию OnClick...
кол-во добавляемых пунктов меню различное, может и 1 пункт добавиться, а может и 5.
прошу прошения за "корявость" объяснения....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2015, 17:43
Ответы с готовыми решениями:

Обратиться к программно созданному Edit-у
Доброго времени суток. Подскажите, как обратиться к программно созданному едиту...

Как обратиться к динамически созданному объекту?
Всем привет, возникла проблема, пробую написать игру змейка, проблема при росте...

Как обратиться к элементу в другом юните?
Здравствуйте, помогите пожалуйста. Есть два Юнита с динамическими списками. мне...

TObjectQueue<T>: как обратиться к элементу очереди?
Доброго времени суток. Подскажите синтаксис - как обратится в очереди...

MainMenu - как узнать индекс нажатого меню?
Доброе утро, форумчане! Встретился с интереным для себя вопросом: А как узнать...

6
krapotkin
3435 / 3039 / 1050
Регистрация: 14.04.2014
Сообщений: 14,751
Записей в блоге: 15
04.03.2015, 23:50 2
создать руками
procedure TForm1.MenuClick(Sender:TObject);
можно
procedure TForm1.Menu5Click(Sender:TObject);
procedure TForm1.Menu25Click(Sender:TObject);
при создании MenuItem назначить этот обработчик:
Delphi
1
2
3
4
5
6
 Mn:=TMenuItem.Create(MainMenu1);
  MN.OnClick := MenuClick
 Mn:=TMenuItem.Create(MainMenu1);
  MN.OnClick := Menu5Click
 Mn:=TMenuItem.Create(MainMenu1);
  MN.OnClick := Menu25Click;
либо наоборот, всем назначить один общий обработчик и проверять внутри
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.MenuClick(Sender:TObject);
begin
  if (Sender as TMenuItem).caption= 'Меню 111' then
   DoSomething111
  else
  if (Sender as TMenuItem).caption= 'Меню 222' then
   DoSomething222
end;
1
e-v-i-l
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 7
05.03.2015, 01:58  [ТС] 3
то что руками то, понятно...
но как видно по примеру выше, заполняется меню из типизированного файла, где находится несколько записей(кол-во может быть разным) соответственно мы не можем знать сколько будет пунктов, а значит и сколько потребуется обработок.
Вот второй вариант с одним обработчиком, самое то! НО, почему то он не отрабатывает, ошибок не выдаёт, но и в Edit`ы ничего не добавляет...
по крайней мере в этом коде(для простоты попробовал так)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var
  Form1: TForm1;
  Mn, Mn1, Mn2, Mn3, Mn4, Mn5: TMenuItem;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
        Mn:=TMenuItem.Create(MainMenu1);
        Mn.Caption:=IntToStr(1);
        Mn.OnClick:=MnClick;
        mainmenu1.Items[0].Add(Mn);
 
        Mn1:=TMenuItem.Create(MainMenu1);
        Mn1.Caption:=IntToStr(2);
        Mn1.OnClick:=MnClick;
        mainmenu1.Items[0].Add(Mn1);
 
        Mn2:=TMenuItem.Create(MainMenu1);
        Mn2.Caption:=IntToStr(3);
        Mn2.OnClick:=MnClick;
        mainmenu1.Items[0].Add(Mn2);
end;
 
procedure TForm1.MnClick(Sender: TObject);
begin
  if (Sender as TMenuItem).caption='1' then edit4.Text:='!!!'
  else
  if (Sender as TMenuItem).caption='2' then edit5.Text:='!!!'
end;
в чём я ошибаюсь? помогите разобраться....

и кстати... я так понимаю, что в изначальном коде, я всё же не правильно создавал новые пункты меню. Фактически это был один новый элемент который добавлялся 3 раза с разным Caption. так ли это? и если да, то как правильно организовать массив новых элементов меню, так как код ниже, тоже не работает...

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
  Form1: TForm1;
  Mn: array of TMenuItem;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
     for i:=1 to 3 do begin     // к примеру будет считано 3 записи из файла
        Mn[i]:=TMenuItem.Create(MainMenu1);
        Mn[i].Caption:=IntToStr(i);
        Mn[i].OnClick:=MnClick;
        mainmenu1.Items[0].Add(Mn[i]);
     end;
end;
и вываливается с ошибкой как на скрине...
В общем полная беда!!! прошу помочь разобраться гуру всемогущих....
0
Миниатюры
Работа с MainMenu. Как обратиться к программно созданному элементу меню?  
northener
пофигист широкого профиля
3427 / 2326 / 631
Регистрация: 15.07.2013
Сообщений: 13,775
05.03.2015, 02:36 4
Лучший ответ Сообщение было отмечено e-v-i-l как решение

Решение

Цитата Сообщение от e-v-i-l Посмотреть сообщение
я так понимаю, что в изначальном коде, я всё же не правильно создавал новые пункты меню. Фактически это был один новый элемент который добавлялся 3 раза с разным Caption. так ли это?
Нет не так. В меню добавлялись новые элементы все три раза.

Добавлено через 1 минуту
Цитата Сообщение от e-v-i-l Посмотреть сообщение
как код ниже, тоже не работает
А кто будет выделять память под массив Mn: array of TMenuItem; ?

Добавлено через 21 минуту
Цитата Сообщение от e-v-i-l Посмотреть сообщение
Вот второй вариант с одним обработчиком, самое то! НО, почему то он не отрабатывает, ошибок не выдаёт, но и в Edit`ы ничего не добавляет...
по крайней мере в этом коде(для простоты попробовал так)
Должен добавлять.
1
e-v-i-l
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 7
05.03.2015, 10:33  [ТС] 5
сначала хочу поблагодарить krapotkin за
Цитата Сообщение от krapotkin Посмотреть сообщение
либо наоборот, всем назначить один общий обработчик и проверять внутри
так же northener за
Цитата Сообщение от northener Посмотреть сообщение
Нет не так. В меню добавлялись новые элементы все три раза.
значит получается мне не обязателен массив...

и всё же Господа... осталась финишная черта...

вот код, который заново прописан(думал может где ошибся в наборе), где всё так же не отрабатывает обработчик событий.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N3: TMenuItem;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure N3Click(Sender: TObject);
    procedure MnClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  i: integer;
  Mn: TMenuItem;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject); // добавляется 3 НОВЫХ пункта меню
begin
  for i:=0 to 2 do begin
        Mn:=TMenuItem.Create(MainMenu1);
        Mn.Caption:=IntToStr(i);
        Mn.OnClick:=MnClick;
        mainmenu1.Items[0].Add(Mn);
  end;
end;
 
procedure TForm1.MnClick(Sender: TObject);  // не отрабатывает этот обработчик!!!
begin
  if (Sender as TMenuItem).caption='0' then begin
      edit1.Text:='!!!';
      beep;
  end;
  if (Sender as TMenuItem).caption='1' then begin
      edit2.Text:='!!!';
      beep;
  end;
  if (Sender as TMenuItem).caption='2' then begin
      edit3.Text:='!!!';
      beep;
  end;
end;
при просмотре работы программы по F8 выяснилось, что программа не заходит ни в одну проверку (IF).
в подтверждение того что не работате обработчик прикладываю исходник.
люди добрые!!! подскажите где у меня беда!?
0
Вложения
Тип файла: 7z test.7z (2.6 Кб, 4 просмотров)
krapotkin
3435 / 3039 / 1050
Регистрация: 14.04.2014
Сообщений: 14,751
Записей в блоге: 15
05.03.2015, 10:40 6
Лучший ответ Сообщение было отмечено e-v-i-l как решение

Решение

откройте для себя отладчик ) он же debugger


procedure TForm1.MnClick(Sender: TObject);
var mi:TMenuItem;
begin
mi := (Sender as TMenuItem);
* if mi.caption='1' then edit4.Text:='!!!'
* else
встаньте на строку if ....
нажмите F5
запустите программу
когда она дойдет до этой строки и остановится
нажмите Ctrl+F7 и наберите mi.Caption
<Enter>
и увидите, что за значение там лежит

Добавлено через 5 минут
P.S.
и правда. там чуть-чуть не то ))))
это связано с одной особенностью меню windows
(MainMenu1.AutoHotkeys) )))
1
e-v-i-l
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 7
05.03.2015, 11:05  [ТС] 7
И вот наконец-то финиш !!!!!!!!!!!!Спасибо!!! поставил в maManual и символ(который отвечает за гор.клавишу ) пропал... теперь условие выполняется...
ещё раз ОГРОМЕДНОЕ, человеческое спс. главное помощь оперативно подоспела!!!
0
05.03.2015, 11:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2015, 11:05

Обращение к объекту, созданному программно
Столкнулся с проблемой – создаю объект (Panel) при нажатии мышки. Мне...

работа с элементом mainmenu
Нужно что бы при нажатии в меню на &quot;русский&quot;, &quot;английский&quot; язык самого меню...

Работа с Memo, ActionList, MainMenu, PopupMenu
В поле Memo вводятся целые числа по вертикали. Вычислить накопленные суммы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru