C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое создание меню  (Прочитано 1877 раз)
Bakh
Участник


Сказали спасибо: +2/-0
Offline

Сообщений: 207


Динамическое создание меню
« : 05 Февраль 2009, 15:23:32 »

Здравствуйте!
Нужно из древовидной структуры динамически создать меню и
вызвать другую процедуру с передачей ей в качестве параметра
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 ...)
и оч. маленькие программульки с пользовательским интерфейсом

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.11 секунд. Запросов: 23.