|
Вопрос # 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;
просто и красиво
Если колво пунктов наперёд неизвестно, то неизвестно, сколько надо создавать обработчиков. А в делфи нельзя создавать код динамически, в процессе исполнения программы (ну на самом деле можно, но это грязный хак и знания ассемблера должны быть на высоте).
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|