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

 
Еще глупый вопрос, про доступ к элементам по имени
Slader
Отправлено: 07.02.2005, 23:25


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

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



В общем, в меню имеются пункты с именами Ch1, Ch2, ... Ch32.
Как получить доступ к их свойствам, если я хочу использовать for?
То есть, что-то типа такого:

CODE

for (int i=0; i<32; i++)  Ch[i]->Enabled=false;


И еще: как создавать пункты меню динамически?
genchik
Отправлено: 08.02.2005, 04:49


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

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



на первую часть вопроса:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMenuItem* tm;
tm = MainMenu1->Items->Find("nameMenu");
for (int i = 0; i < tm->Count ; i++)
tm->Items[i]->Checked = true;

}

на второй чуть позже отвечу (если найду что ответить smile.gif)
genchik
Отправлено: 08.02.2005, 05:41


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

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



ну и как обещал, вторая часть вопроса:

TMenuItem* tm = new TMenuItem(MainMenu1);
TMenuItem* tm1 = new TMenuItem™;
tm->Caption = "Ins" + IntToStr(MainMenu1->Items->Count);
tm1->Caption = "mInst" + IntToStr(MainMenu1->Items->Count);


MainMenu1->Items[0].Add™;
tm->Add(tm1);

cool.gif
genchik
Отправлено: 08.02.2005, 05:53


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

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



c ™ косяк — должно быть [CODE]™
genchik
Отправлено: 08.02.2005, 07:02


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

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



опять! должно быть (тм)
Slader
Отправлено: 08.02.2005, 11:21


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

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



Что-то не хочет он искать нужные элементы меню, как Вы предложили. Таким образом он находит только элементы первого уровня, а у меня третий... Буду очень признателен, если подскажете, как до него можно добраться.
AVC
Отправлено: 08.02.2005, 12:12


Ветеран

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



QUOTE
Таким образом он находит только элементы первого уровня, а у меня третий... как до него можно добраться.

Как обычно — рекурсивным обходом дерева. smile.gif
Типа так
CODE

//---------------------------------------------------------------------------
/* *.h
private:
TMenuItem* __fastcall MenuByName (TMainMenu *MMenu, const AnsiString &pName);
TMenuItem* __fastcall MenuItemByName (TMenuItem *MItem, const AnsiString &pName);
*/

TMenuItem* __fastcall TForm1::MenuByName (TMainMenu *MMenu, const AnsiString &pName)
{
TMenuItem *imnu;
for (int i=0; i < MMenu->Items->Count; i++)
{ imnu = MenuItemByName(MMenu->Items->Items[i], pName);
if (imnu) return imnu;
}
return NULL;
}

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

TMenuItem* __fastcall TForm1::MenuItemByName (TMenuItem *MItem, const AnsiString &pName)
{
Memo1->Lines->Add(MItem->Name); // для наглядности как обходится дерево
if (MItem->Name.UpperCase() == pName.Trim().UpperCase()) return MItem;

TMenuItem *imnu;
for (int i=0; i < MItem->Count; i++)
{ imnu = MenuItemByName(MItem->Items[i], pName);
if (imnu) return imnu;
}
return NULL;
}

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

void __fastcall TForm1::Bt_FindClick(TObject *Sender)
{
Memo1->Lines->Text = "Find <" + Edit1->Text + ">";

TMenuItem *imnu = MenuByName(MainMenu1, Edit1->Text);
if (imnu) Memo1->Lines->Add("Founded " + imnu->Name);
else Memo1->Lines->Add("not founded ");
}
//---------------------------------------------------------------------------



PS.
Если начать с формы, то можно найти любой элемент данного экземпляра формы.
А если начать с Application можно найти любой элемент любого экземпляра формы.

Отредактировано AVC — 08/02/2005, 12:18
Konstantine
Отправлено: 08.02.2005, 14:46


Мастер участка

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



первая часть ответа:
CODE
TMenuItem *Ch[32];// ну или организовать динамически[code]
а это нада где-то в OnShowForm:
[code]Ch[1]=Ch1;
Ch[2]=Ch2;
//...
Ch[32]=Ch32;

и далее можно обращаться как Ch[i]-> и т.д.
а про вторую половину ответил genchik, и там вместо tm можно использовать Ваше Ch[i]
olegenty
Отправлено: 08.02.2005, 14:56


Ветеран

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



а я в таких случаях расслабляюсь и всегда использую map. ничего не надо делать руками, кроме инициализации map после инициализации меню.
допустим,
map ItemMap;
тогда доступ по имени будет
ItemMap[<имя>]
и всё!!!
Slader
Отправлено: 08.02.2005, 15:08


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

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



Ага! Спасибо большое! То, что надо:))

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