| 
| 
 | Вопрос # 3 226/ вопрос открыт / | 
 |  Здравствуйте!Передо мной стоит задача.
 Из инифайла я добавляю название секции в пункты подменю в Mainmenu. Эти названия секции я заношу в Stringlist. Как в onclick'e   каждого пункта в зависимости от названия секции выносить на форму значения ключей соответственной секции инифайла?
 
|  |   Вопрос задал: Сен-Сей (статус: Посетитель)Вопрос отправлен: 23 сентября 2009, 23:28
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Сен-Сей!и в чем же сложность? кода то на пару строк. Припустим, что MyIni: TIniFile; - это объект для ини файла, который уже открыт. (ну где то так  MyIni := TIniFile.Create('My.INI'). )
 На форму поставим memo, куда будем вычитывать содержимое секции
 MyIni.ReadSectionValues(TMenuItems(Sender).Caption, Memo1.Lines)
 
 ну и на закуску почитать это http://forum.vingrad.ru/articles/topic-197956.html
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 23 сентября 2009, 23:59
 
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 24 сентября 2009, 10:58; участников в обсуждении: 4. 
|   | Сен-Сей (статус: Посетитель), 24 сентября 2009, 00:20 [#1]:Вадим, я понимаю как работать с инифайлами. Сложность для меню в другом. Как динамически в только что созданном пункте подменю в onclick внести!! процедуру! или просто задать ей действие, чтобы происходило чтение ключей соответственной секции.
 |  
|   | Вадим К (статус: Академик), 24 сентября 2009, 02:10 [#2]:ну так о этом и нужно спрашивать! как создать меню, я так понимаю, Вы уже узнали? припустим, что my:TMenuItem; - наш пункт меню
 код создания и добавления в главное меню я пропускаю.
 Вначале надо создать обработчик клика. Самый простейший способ - это создать обработчик для существующего пункта меню или кнопки. Ставим кнопку на форму, кликаем (всё стандартно). обработчик в одну строку я уже выше привел - вписываем его. А саму кнопку удаляем - она нам нужна была только для того, что бы делфи сама создала всё (можно и ручками в редакторе вписать). Кнопку мы удалили, а обработчик остался. Он вида
 procedure TForm1.Button1Click(Sender:TObject);
 находим в редакторе слово Button1Click (оно будет всего два раза встречаться и заменяем на что то свое, удобное - например MyMenuClick, хотя это и не обязательно.
 Теперь вернемся к тому месту, где создается пункт меню. Там нужно дописать код вида
 my.OnClick := MyMenuClick;
 Всё, обработчик привязан. Да, у нас будет один обработчик на все пункты меню, но ... у нас есть парамерт sender, в котором передается ссылка на пункт меню, который его вызвал. Как обратиться к нему - видно с моего ответа выше.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Сен-Сей (статус: Посетитель), 24 сентября 2009, 07:41 [#3]:Это так, все хорошо. Только ньюнс один - в процедуре MymenuClick должны быть действия связанные с пунктом меню к которому она присваивается. Например, так: TForm1.mymenuclick(Sender:TObject);
 begin
 if mymenu.checked then mymenu.checked:=true
 else
 mymenu.checked:=false;
 
 proc(mymenu.caption);
 end;
 Возможно ли в создаваемом пункте меню задавать уникальную процедуру onclick, только для этого пункта?
 |  
|   | IlluminatI (статус: 2-ой класс), 24 сентября 2009, 08:11 [#4]:if mymenu.checked then mymenu.checked:=true else
 mymenu.checked:=false;
 
 //====
 
 не проще ли написать: if not(mymenu.checked) then mymenu.checked:=false;
 
 А по вопросу - конечно возможно. Создайте отдельную процедуру обработки для вашего пункта меню и в onClick для него (пункта меню), установите уникальную, созданную процедуру. (например my.OnClick := MyUnicClick; )
 |  
|   | min@y™ (статус: Доктор наук), 24 сентября 2009, 08:27 [#5]: Цитата (Сен-Сей): Возможно ли в создаваемом пункте меню задавать уникальную процедуру onclick, только для этого пункта?
 
 
 Да можно для ВСЕХ пунктов меню, даже если они находятся на разных формах, сделать ОДИН обработчик любого события. В обработчик передаётся параметр Sender: TObject, с помощью него можно идентифицировать объект, который вызвал событие, если привести его к правильному типу (в данном случае - к TMenuItem). А у TMenuItem есть такие свойства, как:
 
 
 Caption;		
Name;
Command;
Hint;
ImageIndex;
MenuIndex;
ShortCut;
ну и, конечно же, Tag.
 Вот пример, как я пишу такие обработчики (для TAction, но это непринципиально), где выбор действия идёт по свойству Tag вызвавшего событие объекта:
 
 procedure TSourceEditorMainForm.FileActionExecute(Sender: TObject);
begin
  // Обработчик меню "Файл"
  case TAction(Sender).Tag of // <--- тут приведение типа
    // Создать файл (без проекта)
    0: if Assigned(ProjectTreeView.NewFile())
         then HideBackground();
 
    // Открыть файл(ы)
    1: if ProjectTreeView.OpenFiles() <> 0
         then HideBackground();
 
    // Обновить файл
    5: EditorPageControl.RefreshActiveFile();
 
    // Сохранить файл
    10: EditorPageControl.SaveActiveFile();
 
    // Сохранить файл как...
    11: EditorPageControl.SaveActiveFileAs();
 
    // Сохранить всё
    12: if EditorPageControl.SaveAllFiles()
          then ProjectTreeView.SaveAllProjects();
 
    // Закрыть файл
    20: EditorPageControl.CloseActivePage();
 
    // Закрыть всё (все проекты и файлы, не принадлежащие проектам)
    21: ProjectTreeView.CloseAll();
 
    // Закрыть файлы, не принадлежащие проектам
    22: EditorPageControl.CloseAllNonProjectFiles();
 
    // Очистить Recent-список проектов
    100: FilesMRUList.Items.Clear();
 
    // Выход
    255: Close();
  end;
end;Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 24 сентября 2009, 10:58 [#6]:код вида 
 if mymenu.checked then mymenu.checked:=true
else
mymenu.checked:=false;правильно писать не 
  if not(mymenu.checked) then mymenu.checked:=false;(что не выполняет поставленной цели), а так 
 mymenu.checked:= not mymenu.checked;просто и красиво Если колво пунктов наперёд неизвестно, то неизвестно, сколько надо создавать обработчиков. А в делфи нельзя создавать код динамически, в процессе исполнения программы (ну на самом деле можно, но это грязный хак и знания ассемблера должны быть на высоте).
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |