Здравствуйте!
Нужно из древовидной структуры динамически создать меню и
вызвать другую процедуру с передачей ей в качестве параметра
ID выбранного пункта меню.
Структуру эту получаю из ХП
ID Description ParentID
----------------------------------------------------
1 EAST TELECOM 0
2 TPS 0
3 Услуги 1
4 Телефония 3
5 Плохое качество 4
6 Не работает 4
7 ADSL 2
8 Настройка модема 7
9 Линк 7
10 Скорость 7
11 Трафик 7
12 Другое 7
...
---------------------------------------------------
(ID - Item, ParentID - SubItem)
Решил ее следующим образом:
typedef struct
{
int ID;
TMenuItem* Item;
int ParentID;
} ItemStruct;
ItemStruct mn_it;
vectorItemStruct> mItems;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int hh;
AnsiString item_cap, item_name;
ADOStoredProc1->Open();
for (int i(0); i ADOStoredProc1->RecordCount; i++)
{
mn_it.ID = ADOStoredProc1->FieldByName("ID")->AsInteger;
item_cap = ADOStoredProc1->FieldByName("Description")->AsString;
item_name = "_" + IntToStr(mn_it.ID);
mn_it.ParentID = ADOStoredProc1->FieldByName("parentID")->AsInteger;
mn_it.Item = NewItem(item_cap, 0, 0, true, OnClick, 0, item_name);
mItems.push_back(mn_it);
mn_it.Item = NULL;
if (mItems[i].ParentID != 0)
{
hh = mItems[i].ParentID - 1;
mItems[hh].Item->OnClick = NULL;
mItems[hh].Item->Insert(mItems[hh].Item->Count, mItems[i].Item);
}
else
PopupMenu1->Items->Add(mItems[i].Item);
ADOStoredProc1->Next();
}
}
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
TForm *owner = (TForm* )SpeedButton1->Parent;
int X = owner->Left + SpeedButton1->Left + 4; //выравнивание под кнопку
int Y = owner->Top + SpeedButton1->Top + SpeedButton1->Height + 30;
PopupMenu1->Popup(X, Y);
}
void __fastcall TForm1::OnClick(TObject *Sender)
{
AnsiString sss = (dynamic_castTMenuItem *>(Sender))->Name;
ShowMessage(sss.Delete(1, 1));
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
for(int i(mItems.size()-1); i >= 0; i--)
{
delete mItems[i].Item;
}
}
Как видно параметр ID выбранного пункта передается через
name пункта меню (что меня и смущает). И вообще в какой степени
этот код получился индусским. Если есть более нормальный способ решения
подскажите пож.
ЗЫ: программировал в основном работу с оборудованием
(снятие статистики, изменение конфигурации IAD, Zyxel, AMG ...)
и оч. маленькие программульки с пользовательским интерфейсом