| 
| 
 | Вопрос # 2 905/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Компонент MainMenu.
 Необходимо получить индекс выбираемого подменю.
 
|  |   Вопрос задал: Плакош Алексей (статус: Посетитель)Вопрос отправлен: 12 июня 2009, 20:38
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Паровоз Здравствуйте, Плакош Алексей!Запишите этот индекс в свойство Tag элемента TMenuItem, а в обработчике ItemClick вызывайте
 no:=(Sender as TMenuItem).Tag;
 
|  | Ответ отправил: Паровоз (статус: 10-ый класс)Время отправки: 13 июня 2009, 10:39
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 26; последнее сообщение — 14 июня 2009, 16:00; участников в обсуждении: 3. Страницы: [1] [2] [Следующая »]  
|   | Светлов (статус: Посетитель), 13 июня 2009, 10:49 [#1]:Алексей, в обработчик события выбора вставьте след.код: 
 procedure TForm1.SubMenuClick(Sender:TObject);
 var Index:Integer;
 begin
 Index:=MainMenu1.IndexOf(TMenuItem(Sender));
 ShowMessage(IntToStr(Index));
 end;
 |  
|   | Паровоз (статус: 10-ый класс), 13 июня 2009, 10:57 [#2]:To Светлов: В TMainMenu нет IndexOf
 |  
|   | Плакош Алексей (статус: Посетитель), 13 июня 2009, 13:57 [#3]:К сожалению ни один из предложенных вариантов решений не помог. To Паравоз:
 Выводит сообщение об ошибке: Invalid Class Typecast.
 
 Я создаю подменю, и прикрепляю к нему action, который вызывает форму, и в соответствии с индексом меню должен создавать колонки в TcxDBTreeList.
 
 Код//
 procedure TF1_Main.actn_all_childshow(Sender: TObject);
 begin
 With Tf_table_all.Create(self) do
 begin
 tb_int := TMenuItem(Sender).Tag;
 while not atb_ind_ref.Eof do
 begin
 if tb_int = atb_ind_refIndexMenu.Value then
 tb_ind := tb_int
 else
 atb_ind_ref.Next;
 end;
 end;
 end;
 Код//
 Этот вариант также не работает.
 Подскажите как выбраться из ситуации?
 |  
|   | Паровоз (статус: 10-ый класс), 13 июня 2009, 15:01 [#4]:"Выводит сообщение об ошибке: Invalid Class Typecast." В каком месте?
 |  
|   | Плакош Алексей (статус: Посетитель), 13 июня 2009, 15:06 [#5]:Код// procedure TF1_Main.actn_all_childshow(Sender: TObject);
 begin
 With Tf_table_all.Create(self) do
 begin
 tb_int := (Sender as TMenuItem).Tag;
 while not atb_ind_ref.Eof do
 begin
 if tb_int = atb_ind_refIndexMenu.Value then
 tb_ind := tb_int
 else
 atb_ind_ref.Next;
 end;
 end;
 end;
 Код//
 На этой строчке:
 tb_int := (Sender as TMenuItem).Tag;
 |  
|   | Паровоз (статус: 10-ый класс), 13 июня 2009, 22:08 [#6]:Что это за процедура - TF1_Main.actn_all_childshow? |  
|   | Паровоз (статус: 10-ый класс), 13 июня 2009, 23:33 [#7]:To Плакош Алексей: Собственно сейчас с телепатами туго, поскольку они ушли в отпуск. Насколько я понял, Вы используете TActionManager и TActionMainMenuBar. В этом случае никакого Windows-меню у Вас нет, а все пункты просто рисуются на TActionMainMenuBar.
 Вроде заголовок нужного подменю в таком случае можно получить в обработчике TActionMainMenuBar.OnPopup как-то так
 procedure TForm1.ActionMainMenuBar1Popup(Sender: TObject;
 Item: TCustomActionControl);
 begin
 SubMenuName:=Item.Caption);
 end;
 |  
|   | Плакош Алексей (статус: Посетитель), 14 июня 2009, 08:48 [#8]:Я использую стандартный TMainMenu. А TF1_Main.actn_all_childshow это action (TActionList)для вызова формы с данными на основе индексов.
 |  
|   | Паровоз (статус: 10-ый класс), 14 июня 2009, 09:59 [#9]:Если Вы используете стандартный TMainMenu, то у него есть обработчик вызова пункта меню, в который и надо пометсить строку no:=(Sender as TMenuItem).Tag
 так как в этом случае Sender это и есть соответствующий пункт меню. А вот кто у Вас Sender в TF1_Main.actn_all_childshow?
 |  
|   | Плакош Алексей (статус: Посетитель), 14 июня 2009, 10:08 [#10]:А TF1_Main.actn_all_childshow это action (TActionList)для вызова формы с данными на основе индексов. Можете написать примерный каркас этой процедуры, и способ её вызова?
 |  
|   | Паровоз (статус: 10-ый класс), 14 июня 2009, 10:09 [#11]:Так, что - процедура TF1_Main.actn_all_childshow не связана ни с каким событием? |  
|   | Плакош Алексей (статус: Посетитель), 14 июня 2009, 10:11 [#12]:Связана, я привязываю этот action к подменю, а затем по щелчку на подменю вызываеться форма |  
|   | Паровоз (статус: 10-ый класс), 14 июня 2009, 10:18 [#13]:Ничего не понял. Нужно открыть редактор ActionList, в списке Actions выбрать нужное событие. В инспекторе объектов отобразится этот объект, на вкладке Events нужно выбрать событие OnExecute - это и должна быть Ваша процедура TF1_Main.actn_all_childshow. Так или нет? |  
|   | Паровоз (статус: 10-ый класс), 14 июня 2009, 10:53 [#15]:Если "правильно", то тогда Sender имеет тип TAction и название соответствующего пункта меню получаем как (Sender as TAction).Caption |  
|   | Паровоз (статус: 10-ый класс), 14 июня 2009, 10:55 [#16]:А свою информацию можно получать как (Sender as TAction).Tag |  
|   | Плакош Алексей (статус: Посетитель), 14 июня 2009, 11:06 [#17]:procedure TF1_Main.actn_all_childshow(Sender: TObject); begin
 With Tf_table_all.Create(self) do
 begin
 tb_ind := (Sender as TAction).Tag;
 ShowMessage (IntToStr(tb_ind));
 end;
 end;
 
 Присылает 0
 |  
|   | Паровоз (статус: 10-ый класс), 14 июня 2009, 12:02 [#18]:Свойство tag нужно устанавливать не в элементе TMenuItem, а в элементе TAction, который блокирует соответствующий элемент TMenuItem. |  
|   | Плакош Алексей (статус: Посетитель), 14 июня 2009, 12:10 [#19]:procedure TF1_Main.FormCreate(Sender: TObject); var
 i ,j : integer;
 begin
 With TADOTable.Create(self) do
 begin
 try
 Connection := ADOConnection1;
 TableName := 'REFENCE';
 Active := true;
 First;
 for i :=  0 to RecordCount-1 do
 begin
 tm:= N6;
 tm.Add(TMenuItem.Create(nil));
 tm:= TM.Items[TM.Count -1];
 tm.Action:= actn_all_add;
 tm.Caption:= FieldByName('NAME').AsString;
 tm.tag := i+1;
 if atb_ind_ref.RecordCount = 0 then
 begin
 atb_ind_ref.Append;
 atb_ind_refIndexMenu.Value := tm.MenuIndex;
 atb_ind_refIndRef.Value := FieldByName('IND').AsInteger;
 atb_ind_ref.Post;
 end;
 Next;
 end;
 finally
 Free;
 end
 end;
 end;
 вот код по которому я формирую меню.
 |  
|   | Плакош Алексей (статус: Посетитель), 14 июня 2009, 12:11 [#20]:Исходя из этого кода... Что и где нужно добавить, поменять? |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |