Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Меню, созданное динамически [D5, Win95/98]


Doctor Deejay ©   (2002-07-02 21:54:00) 

В своей проге я динамически создаю попап меню. Затем обрабатываю нажатие по пунктам
вот так:

....
MenuItem.onClick:=ModeItemClick;
....
procedure TMainForm.ModeItemClick(Sender: TObject);
begin
//////////
end;


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

Как же к ним обратиться? И как обработь нажатие каждого?


Proton   (2002-07-09 19:06:00) [1]

C:\Soft\borland\Delphi5\Help\Examples\Menu
C:\Soft\borland\Delphi5\Help\Examples\Menu2


Skier   (2002-07-03 11:58:00) [2]

>Doctor Deejay
Для дин. создания меню очень удобно испол-ть NewItem


Alx2   (2002-07-03 10:25:00) [3]

Еще и это перепишу:
:)
Можно использовать снова tag. Например, старшие два байта - номер пункта, младшие - подпункта.
Номер пункта читаем так: tag shr 16
Номер подпункта читаем так: tag and $FFFF
Номер пункта присваиваем так: tag := (Value shl 16) OR (tag and $FFFF)
Номер подпункта присваиваем так: tag := (tag and $FFFF 0000) or Value


Alx2   (2002-07-03 10:24:00) [4]

Ой, сорри!
Очепятался. Переписываю:

Var
tmpTag : Integer;
ComplexNumber : packed record
SubPunkt, Punkt : Word;
end absolute tmpTag;
begin
// Присваиваем
TmpTag := MenuItem.Tag;
ComplexNumber.Punkt := <...>
ComplexNumber.SubPunkt := <...>
MenuItem.Tag := tmpTag;
// Читаем
TmpTag := MenuItem.Tag;
ComplexNumber.Punkt - номер пункта
ComplexNumber.SubPunkt - номер подпункта
end;


Alx2   (2002-07-03 10:22:00) [5]

Можно использовать снова tag. Например, старшие два байта - номер пункта, младшие - подпункта.
Номер пункта читаем так: tag shr 16
Номер подпункта читаем так: tag and $FFFF
Номер пункта присваиваем так: tag := (Value shl 16) OR (tag and $FFFF)
Номер подпункта присваиваем так: tag := (tag and $FFFF) or Value
Value лучше быть типа Word.

Либо вот так:
Var
tmpTag : Integer;
ComplexNumber : packed record
SubPunkt, Punkt : Word;
end absolute tmpTag;
begin
// Присваиваем
TmpTag := MenuItem.Tag;
TmpTag.Punkt := <...>
TmpTag.SubPunkt := <...>
MenuItem.Tag := tmpTag;
// Читаем
TmpTag := MenuItem.Tag;
TmpTag.Punkt - номер пункта
TmpTag.SubPunkt - номер подпункта
end;


Doctor Deejay   (2002-07-03 10:03:00) [6]

Мне кроме номера пункта нужно регистрировать номер подпункта, поэтому одного поля ТАГ не хватает. Нужен еще один!
Как завести запись?


T'Mon   (2002-07-03 03:37:00) [7]

Я бы завел класс или запись с описанием элемента меню. При создании этого элемента делал новый экземпляр описания и указатель на него пихал в Tag элемента меню.


Doctor Deejay   (2002-07-03 00:59:00) [8]

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


Kuljok   (2002-07-03 00:49:00) [9]

Или юзать те-же названия

if (Sender as TComponent).Name = "Item1" then .......


LLL   (2002-07-02 22:23:00) [10]

Ну можно было разные методы назначать.
А так есть Tag
и понеслость
with Sender as TMenuItem
case Tag of
... и т. д.


Наверх

Титульная страница Поиск, карта сайта Написать письмо