Владимир- |
Отправлено: 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 |
|