C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
PopupMenu. Обработка клика на добавленом пункте
Владимир-
Отправлено: 24.10.2004, 16:28


Ученик-кочегар

Группа: Участник
Сообщений: 3



Есть PopupMenu с несколькими пунктами меню.
Добавляю новые пункты без проблем.
А вот сделать обработку после щелчка мышью на добавленном пункте меню — не получается...
Подскажите, что в моем случае нужно сделать?
Nick
Отправлено: 25.10.2004, 06:55


Машинист паровоза

Группа: Участник
Сообщений: 247



// Добавление нового пункта

NewItem = new TMenuItem(PopupMenu);
NewItem ->Caption = "В новую заявку";
NewItem ->Tag = 0;
NewItem ->OnClick = PopupSelectExecuteZZ;
PPM_Run->Items->Items[8]->Add(NewItem);

...

void __fastcall TFormDocs::PopupSelectExecuteZZ(TObject *Sender)
{
// ваша обработка
}
Владимир-
Отправлено: 25.10.2004, 17:20


Ученик-кочегар

Группа: Участник
Сообщений: 3



В данном случае PopupMenu и PPM_Run одно и тоже?

А как в обработчике PopupSelectExecuteZZ определить на каком пункте был клик?

Заранее спасибо.
AVC
Отправлено: 26.10.2004, 08:56


Ветеран

Группа: Модератор
Сообщений: 1583



Неплохой результат дает следующий метод:
есть private поле формы Что_было_выбрано
у созданного подменю можно задествовать Hint или Tag (я люблю Hint — там можно писать символьные имена)
Универсальна процедура OnClick сохраняет значение Hint или Tag в переменной Что_было_выбрано
Диспетчер анализирует Что_было_выбрано и делает соответствующие действия

куски кода для примера:
CODE

// Создать подменю для всех вариантов печатных отчетов
void __fastcall TF_UniEdit::QryMain_Rep_Prepare (void)
{
...
TPopupMenu *ppm = PPM_Rep;
ppm->Items->Clear();

TMenuItem *ppmi;

for (int i=0; i < rec->Count; i++)
{  reci = rec->Items[i];
   ppmi = new TMenuItem(this);
   ppmi->Name = ...;
   ppmi->Caption = ...;
   ppmi->Hint = reci->Name;
   ppmi->OnClick = PPMRep_Click;
   ppm->Items->Add(ppmi);
}
...
}

//---------------------------------------------------------------------------

void __fastcall TF_UniEdit::PPMRep_Click (TObject *Sender)
{
TMenuItem *mni = dynamic_cast<TMenuItem*>(Sender);
if (!mni) return;
FQM_RepName = mni->Hint.Trim().UpperCase();
}

//---------------------------------------------------------------------------
// Выбрать вариант отчета

void __fastcall TF_UniEdit::QryMain_Rep (void)
{
FQM_RepName = "";

TPopupMenu *ppm = PPM_Rep;
int cou = ppm->Items->Count;


if (cou <= 0)  FQM_RepName = "";
else if (cou == 1) FQM_RepName = ppm->Items->Items[0]->Hint;
else
{   TPoint tpoi = btn->ClientOrigin;
   int x = tpoi.x;
   int y = tpoi.y + btn->Height + 4;

   ppm->Popup(x, y);
   Application->ProcessMessages();
}

if (!FQM_RepName.IsEmpty())  Rep_Execute(FQM_RepName);
}



QryMain_Rep назначается на что-что, что отвечает за активизацию PopUp

Вернуться в Вопросы программирования в C++Builder