Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.11.2012, 19:53
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию Присвоение Onclick динамическому меню

Ребят, меню создаётся, только никак не могу OnClick задать... Ошибка при попытке ккомпиляции...
Вот мои процедуры:

Код:
type
  TFMain = class(TForm)
    MainMenu: TMainMenu;
    ...
    procedure MenuItemClick(Sender:TObject);
  private
    ...
    procedure CreateMenu();
  end;


procedure TFMain.CreateMenu();
var
  MenuPosition:string;
  MenuItemNames:TStringList;
  MenuItemsCount,i:cardinal;
  MenuItems:array of TMenuItem;
begin
  MenuPosition:=LoadPlugin('OilGasSprt', FMain.Handle, 'MenuPosition');
  //создаём массив MenuItemNames
  MenuItemNames:=TStringList.Create();
  StrBreakApart(MenuPosition, '<BR>', MenuItemNames);
  MenuItemsCount:=MenuItemNames.Count;
  SetLength(MenuItems,MenuItemsCount);
  //Заполняем массив элементов меню данными из массива MenuItemNames
  MenuItems[0]:=TMenuItem.Create(FMain);
  MenuItems[0].Caption:=MenuItemNames[0];
  FMain.MainMenu.Items.Add(MenuItems[0]);
  for i:=1 to MenuItemsCount-1 do
  begin
    MenuItems[i]:=TMenuItem.Create(FMain);
    MenuItems[i].Caption:=MenuItemNames[i];
    MenuItems[i-1].Add(MenuItems[i]);
  end;

  MenuItems[i].OnClick:=FMain.MenuItemClick(FMain);
  MenuItemNames.Free();
end;

procedure TFMain.MenuItemClick(Sender:TObject);
begin
  ShowMessage('MenuItemClick');
end;
Ответить с цитированием
  #2  
Старый 05.11.2012, 19:55
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Ошибка на строчке:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick(FMain);
Incompatible types TNotifyEvent and Procedure
По-всякому пробовал...

Хотел бы MenuItemClick тоже в приват загнать, но тогда тоже проблемы какие-то... В этом случае её не видно в списке при ручном дообавлении OnClick через ObjectInspector

Последний раз редактировалось sorockinalex, 05.11.2012 в 19:57.
Ответить с цитированием
  #3  
Старый 05.11.2012, 20:22
Аватар для sariman
sariman sariman вне форума
Активный
 
Регистрация: 19.11.2011
Адрес: Украина, Луганская обл.
Сообщения: 244
Версия Delphi: 7, XE, Lazarus
Репутация: выкл
По умолчанию

Цитата:
Сообщение от sorockinalex
Ошибка на строчке:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick(FMain);
Почему у вас это вне цикла?
Ответить с цитированием
Этот пользователь сказал Спасибо sariman за это полезное сообщение:
sorockinalex (06.11.2012)
  #4  
Старый 05.11.2012, 20:36
Аватар для RusMaXXX
RusMaXXX RusMaXXX вне форума
Начинающий
 
Регистрация: 01.10.2008
Сообщения: 138
Версия Delphi: 7
Репутация: 21
По умолчанию

глянь мой старый пример: http://www.delphisources.ru/pages/so...ast-start.html там как раз используется то, что те нужно!!
__________________
уволен в запас!!!
Ответить с цитированием
Этот пользователь сказал Спасибо RusMaXXX за это полезное сообщение:
sorockinalex (06.11.2012)
  #5  
Старый 05.11.2012, 20:39
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Может лучше так:
Код:
MenuItems[i].OnClick:=FMain.MenuItemClick;//без_скобок_и_параметров_в_скобках
ну и обязательно в тело цикла все это засунуть.

Последний раз редактировалось YVitaliy, 05.11.2012 в 20:55.
Ответить с цитированием
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение:
sorockinalex (06.11.2012)
  #6  
Старый 06.11.2012, 07:51
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

Код:
MenuItems[i].OnClick:=FMain.MenuItemClick;
так тоже ошибку выдаёт, но только уже при выполнении операции...
Access violation at address ... Write of address...

А в тело цикла как раз не надо, так как последний открытый пункт и является активным..
Ответить с цитированием
  #7  
Старый 06.11.2012, 07:57
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

опа, блин... понял... я думал после цикла последнее значение в переменной i остаётся... Почему оно не остаётся в переменной i???
Ответить с цитированием
  #8  
Старый 06.11.2012, 08:04
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от sorockinalex
А в тело цикла как раз не надо, так как последний открытый пункт и является активным..
После выполнения цикла for значение переменной-счётчика (здесь это "i") неопределено. Поэтому раз эту строчку не надо в цикл, то и нельзя в ней использовать непроинициализированную переменную "i". Используй вместо "i" например "MenuItemsCount-1".
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
sorockinalex (06.11.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:25.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025